java - 从另一个 Controller 类设置 boderpane 中心

标签 java model-view-controller javafx

我有三个 Controller ,一个包含在 View 之间切换的 Boderpane 组件 CrechHome ,另一个有一个按钮,我的代码驻留在 EnfantController ,另一个 Controller 需要该按钮来引导我 PaymentController 我需要该按钮在我所在的场景中执行某些操作,然后显示另一个 View (Payment),因为我正在加载我的 CrechHome Controller ,所以我可以让 borderPane 实例切换到另一个 View ,但以下内容不执行任何操作(我仍然处于与之前相同的 View 中)并且没有显示错误。

代码如下:

public class EnfantController implements Initializable {
    @FXML
    private Button payement;

    @FXML
    private void payementEnf(ActionEvent event) throws IOException {
        // get the crechHomeController to get the borderPane
        FXMLLoader loader2 = new FXMLLoader();
        loader2.setLocation(getClass().getResource("/Views/CrechHome.fxml"));
        Node node2 = loader2.load();
        CrechHomeController crechController = loader2.getController();
        // get the paymentController to get the payment view
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/Views/Payment.fxml"));
        Node node = loader.load();

        PaymentController paymentController = loader.getController();
        paymentController.reload();
        paymentController.getRecherche().getSelectionModel().selectLast();

        crechController.getBorderPane().setCenter(node);
    }
}

我意识到我可能没有获得 CrechHomeController 的正确 Controller 实例,这就是为什么我没有得到任何东西,但是如果这是错误的,你如何解决这个问题,而且我是一个 Javafx 新手,所以所有帮助将不胜感激。

最佳答案

您还没有真正提供足够的信息来对此提供确定的答案,但是如果您正在加载分别以 CrecheControllerEnfantController 作为 Controller 的 FXML 文件,您可以在同一位置执行类似的操作;

public class CrecheController {

    @FXML
    private BorderPane borderPane ;

    public ObjectProperty<Node> displayedViewProperty() {
        return borderPane.centerProperty();
    }

    // ...
}
public class EnfantController {

    private final ObjectProperty<Node> node = new SimpleObjectProperty<>();

    public ObjectProperty<Node> nodeProperty() {
        return node ;
    }

    @FXML
    private void payementEnf(ActionEvent event) throws IOException {

        // get the paymentController to get the payment view
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/Views/Payment.fxml"));
        Node node = loader.load();

        PaymentController paymentController = loader.getController();
        paymentController.reload();
        paymentController.getRecherche().getSelectionModel().selectLast();

        this.node.set(node);
    }

    // ...
}

然后,当您加载两个 FXML 文件时,只需执行

FXMLLoader crecheLoader = new FXMLLoader(getClass().getResource("/Views/CrechHome.fxml"));
Parent crecheView = crecheLoader.load();
CrecheController crecheController = crecheLoader.getController();

FXMLLoader enfantLoader = new FXMLLoader(getClass().getResource("/Views/EnfantHome.fxml"));
Parent enfantView = enfantLoader.load();
EnfantController enfantController = enfantLoader().getController();

enfantLoader.nodeProperty().bindBidirectional(crecheController.displayedViewProperty());

如果您不能像这样直接执行此操作,则类似的解决方案也将起作用。

关于java - 从另一个 Controller 类设置 boderpane 中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46542764/

相关文章:

javafx - 如何在JavaFX中等待用户的操作(在同一阶段)

Java FX - BarChart动态添加的内容破坏了布局

intellij-idea - intellij Idea javafx 导出无法构建artifact-fx :deploy is not available

java - RFC822 电子邮件 - Formatter - Android/iOS - 创建没有 session 或主机的 MimeMessage

java - 什么是测试套件?

javascript - knockout : Accessing property of observable object

security - ASP.NET MVC : Simple SQL Injection security

model-view-controller - MVC 文件夹结构与替代方案是否有充分的理由?

java - 无法构建 MockMvc(已经映射了 X 类型的处理程序)

Java:删除数组中某个项目的所有实例