如何在JavaFX应用程序中获取主阶段?

时间:2013-04-04 08:16:08

标签: java javafx

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

这个问题的上下文是我想编写一个从另一种语言(Prolog)操作JavaFX接口的库。 为此,我的库需要访问主舞台。 目标是JavaFX应用程序的程序员不必在start方法中显式存储对Stage对象的引用,因此对于用户界面设计者应该是透明的(如果有更多细节,则为a related question需要)。

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

4 个答案:

答案 0 :(得分:7)

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

使用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());

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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();


}