在单独的窗口中单击按钮打开javafx fxml文件,无需重复

在单独的窗口中单击按钮打开javafx fxml文件,无需重复,javafx,fxml,Javafx,Fxml,我使用下面的代码在按钮单击事件的不同窗口中打开javafx fxml文件,效果很好。但是如果我在窗口打开时再次单击相同的按钮,它将创建一个重复的窗口。有没有可能解决这个问题的方法?提前谢谢 Parent parent = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); Stage stage = new Stage(StageStyle.DECORATED); stage.setTitle("Title"); stag

我使用下面的代码在按钮单击事件的不同窗口中打开javafx fxml文件,效果很好。但是如果我在窗口打开时再次单击相同的按钮,它将创建一个重复的窗口。有没有可能解决这个问题的方法?提前谢谢

Parent parent = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Stage stage = new Stage(StageStyle.DECORATED);
stage.setTitle("Title");

stage.setScene(new Scene(parent));
stage.show();

我只是偶然发现了这个老问题,我想我可能会为任何刚接触JavaFX或一般编码的人回答这个问题(我很无聊…)

在提供的代码中(请参见下文),每次都会创建一个新的阶段,这意味着如果该阶段在方法内部运行,则每次运行代码时实际上都会创建一个新的阶段变量:

Stage stage = new Stage(StageStyle.DECORATED);
您可以在方法外部创建Stage变量,以便。每次或每次都覆盖它。进行一些“正在显示”或空检查或类似检查,以查看是否应该创建新阶段,或者是否只需要显示现有阶段

例如:

private Stage stage;

private void onOpenNewStageBtnClicked(){
    if(stage == null){
        Parent parent = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        stage = new Stage(StageStyle.DECORATED);
        stage.setTitle("Title");
        stage.setScene(new Scene(parent));
    }
    stage.show();
}

另外,我通常要做的是创建一个阶段工厂,以避免大量重复代码,这样我就可以中断阶段的创建,并将FXML加载到控制器以外的其他类。

您希望它做什么?您正在该代码中显式创建一个新窗口。。。