12

是否可以在正在运行的 JavaFX 应用程序中获取对主要阶段的引用?

这个问题的上下文是我想编写一个库来操作另一种语言(Prolog)的JavaFX接口。为了做到这一点,我的图书馆需要访问主舞台。目标是 JavaFX 应用程序的程序员不必在 start 方法中显式存储对 Stage 对象的引用,因此它对用户界面设计人员应该是透明的( 如果需要更多细节,这是一个相关问题) .

这个问题的一部分是获取对原始 JavaFX 应用程序的主要 Stage 对象的引用,所以我想知道某处的静态方法之类的东西是否可以让我访问它。

4

4 回答 4

13

不确定正确的决定,但它适用于我的情况。

使用 getter 和 setter 在主类中创建静态字段:

public class MyApp extends Application {

    private static Stage pStage;

    @Override
    public void start(Stage primaryStage) {
        setPrimaryStage(primaryStage);

        pStage = primaryStage;
        ...
    }

    public static Stage getPrimaryStage() {
        return pStage;
    }

    private void setPrimaryStage(Stage pStage) {
        MyApp.pStage = pStage;
    }
}

接下来,在必要的地方调用 getter。例如:

stageSecond.initOwner(MyApp.getPrimaryStage());
于 2015-07-27T10:55:08.490 回答
4

我只是在研究这个问题。似乎没有任何内置方法可以获取初级阶段。您可以从主窗口中的节点使用 node.getScene().getWindow(),但不能在其他窗口中使用。显式存储 primaryStage 引用显然是执行此操作的唯一可靠方法。

于 2013-06-10T19:02:21.087 回答
2

由于您在 Application#start(Stage primaryStage) 方法中收到主要阶段,因此您可以保留它。

于 2013-06-10T18:56:06.823 回答
0

只是为了补充 VladmirZ 答案。按照第一部分。然后。用于隐藏或关闭操作按钮上的 primaryStage。

我这样做。例子

void ActionButton(ActionEvent event) throws Exception {


    Stage StageTest = TabelaApp.getTabelaStage(); // call the getter. In my case TabelaApp.getTabelaStage
    StageTest.hide(); //Or Close

    // This Call the Stage you want
    Parent root = FXMLLoader.load(getClass().getResource("/tabela2/FrmTabela2.fxml"));
    Scene scene = new Scene(root);
    Stage stage = new Stage();
    stage.setScene(scene);
    stage.show();


}
于 2020-04-24T15:32:06.813 回答