java - 如何从 Controller 访问 JavaFx Stage?

标签 java javafx controller fxml

我正在将一个纯 JavaFx 应用程序(其中下面的代码在将所有内容放在一个类中时运行良好)转换为 FXML 应用程序,其中 Stage 声明和按钮处理程序位于不同的类中。在 Controller 中,我试图实现一种方法,该方法将允许用户选择一个目录并将其存储在变量中以供以后使用:

private File sourceFile;
DirectoryChooser sourceDirectoryChooser;

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

但是,该方法需要的舞台“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: How to get stage from controller during initialization?了解更多信息。不过,我不赞成评分最高的答案,因为它在 .fxml 之后为 Controller 添加了编译时间依赖性。文件已加载(毕竟该问题被标记为 javafx-2 ,所以不确定上述方法是否已经在那里工作,而且问题的上下文看起来有点不同)。

另见 How do I open the JavaFX FileChooser from a controller class?

关于java - 如何从 Controller 访问 JavaFx Stage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932309/

相关文章:

javascript - java-JavaFx WebView 无法在 Debian 上从 JS 进行向上调用

java - 如何在 Java MVC Web 应用程序中构造 Controller 类?

java - Android PDF ScrollView 单个连续页面

java - 通过 Java 在 BMC Remedy 中创建票证

java - 我想运行 libGDX-setup jar 文件,该怎么做

controller - Yii 从 Controller 获取 url 部分

javascript - 用于在 Controller 之间共享数据的 AngularJS 工厂

java - 如何在 Vaadin 的另一个类中使用路由器布局类的变量/方法?

android - 使用 javafx 和 apache POI 的项目在 dex 期间出错

java - 为什么主类中的 LauncherImpl.launchApplication() (javaFX 启动器)正在启动 InvocabularyTargetException 而不是调用 launch() ?