【问题标题】:JavaFX call a controller method from the main classJavaFX 从主类调用控制器方法
【发布时间】:2016-10-11 19:55:39
【问题描述】:

我的 JavaFX 应用程序有一点问题,我想从主类调用控制器中的方法,但它不起作用。

我试过这个Accessing FXML controller class 还有这个How do I access a UI element from another controller class in JavaFX?

但它不起作用。

所以,在我的应用程序中,我有一个主窗口,我可以从那里打开第二个窗口,当我关闭第二个窗口时,我想在主控制器中调用一个方法来更新一些元素..

我的主班有这两个窗口:

@Override
public void start(Stage primaryStage) throws IOException {
    this.primaryStage = primaryStage;
    mainWindow();

public void mainWindow() {
    try {
        FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("/App.fxml"));
        Parent root = loader.load();
        AppController appController = loader.getController();
        appController.setMain(this);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void secondWindow() throws IOException {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("SecondWindow.fxml"));
        Parent root = loader.load();
        Stage stage = new Stage();
        SecondWindowController secondWindowController = loader.getController();
        secondWindowController.setStage(stage);
        stage.initOwner(primaryStage);
        stage.initModality(Modality.WINDOW_MODAL);
        stage.setScene(new Scene(root));
        stage.show();
        stage.setOnCloseRequest(event -> {
            event.consume();
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setHeaderText("close?");
            alert.initOwner( stage);
            Optional<ButtonType> result = alert.showAndWait();
            if (result.get() == ButtonType.OK){

            // Here I want to call the method to update in the AppController

                stage.close();
            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
}

有没有办法调用那里的方法?

【问题讨论】:

  • 天哪,谢谢,这太简单了.. 第二个窗口在 AppController 中被调用,现在我给 hin "this" 并获取参考。

标签: java javafx


【解决方案1】:

您的secondWindow() 方法永远不会被调用。

当您调用它时,只需将您已经通过 AppController appController = loader.getController(); 从 FXML 中检索到的 appController 的引用传递给创建新窗口的方法。

更改签名:

secondWindow()

到:

secondWindow(final AppController appController)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多