从另一个控制器类设置boderpane中心

时间:2017-10-03 10:46:21

标签: java model-view-controller javafx

我有三个控制器,一个用于保存我在视图之间切换的Boderpane组件CrechHome,另一个用于我的代码所在的按钮EnfantController,另一个我需要该按钮来指示我PaymentController我需要该按钮在我所在的场景中执行某些操作,然后显示另一个视图(Payment),因为我正在加载我的CrechHome控制器我可以让borderPane实例切换到另一个视图,但以下内容没有做任何事情(我仍然在与之前相同的视图中)并且没有显示任何错误。

以下是代码:

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的新手,所以所有的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

您还没有真正提供足够的信息来提供确切的答案,但是如果您要加载分别在其CrecheControllerEnfantController作为控制器的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());

如果您不能直接这样做,那么类似的解决方案将起作用。