如何从控制器访问JavaFx Stage



我正在将一个纯JavaFx应用程序转换为一个FXML应用程序,其中Stage声明和按钮处理程序位于不同的类中。在控制器中,我试图实现一种方法,允许用户选择一个目录并将其存储在一个变量中以供以后使用:

private File sourceFile;
DirectoryChooser sourceDirectoryChooser;
@FXML
private void handleSourceBrowse() {
        sourceDirectoryChooser.setTitle("Choose the source folder");
        sourceFile = sourceDirectoryChooser.showDialog(theStage);
}

然而,该方法所需的"阶段"仅存在于FolderSyncer4.java:中(如果这是正确的术语)

public class FolderSyncer4 extends Application {
    final String FOLDER_SYNCER = "FolderSyncer";
    Stage theStage;
    @Override
    public void start(Stage primaryStage) throws Exception {
        theStage = primaryStage;
        //TODO do the FXML stuff, hope this works
        Parent root = FXMLLoader.load(getClass().getResource("FolderSyncerMainWindow.fxml"));
        theStage.setScene(new Scene(root, 685, 550));
        theStage.setTitle(FOLDER_SYNCER);
        theStage.show();
    }
}

我该如何避开这个?我需要以某种方式再次实现该方法,但突然间我无法通过辩论。

在您的情况下,从处理程序的ActionEvent参数获取场景可能是最简单的:

@FXML
private void handleSourceBrowse(ActionEvent ae) {
    Node source = (Node) ae.getSource();
    Window theStage = source.getScene().getWindow();
    sourceDirectoryChooser.showDialog(theStage);
}

请参阅JavaFX:如何在初始化期间从控制器获取阶段?了解更多信息。不过,我不赞成评分最高的答案,因为它在加载.fxml文件后(在所有问题都标记为javafx-2之后,所以不确定上面的方法是否已经在那里起作用,而且问题的上下文看起来有点不同),向控制器添加了编译时依赖性。

另请参阅如何从控制器类打开JavaFX FileChooser?

另一种方法是为Stage定义一个静态getter并访问它

主要类别

public class Main extends Application {
    private static Stage primaryStage; // **Declare static Stage**
    private void setPrimaryStage(Stage stage) {
        Main.primaryStage = stage;
    }
    static public Stage getPrimaryStage() {
        return Main.primaryStage;
    }
    @Override
    public void start(Stage primaryStage) throws Exception{
        setPrimaryStage(primaryStage); // **Set the Stage**
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }
}

现在您可以通过调用来访问此阶段

Main.getPrimaryStage()

控制器类

public class Controller {
public void onMouseClickAction(ActionEvent e) {
    Stage s = Main.getPrimaryStage();
    s.close();
}
}

最新更新