我使用下面的代码在按钮单击事件的不同窗口中打开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();
答案 0 :(得分:1)
我偶然发现了这个老问题,并认为我可能会为JavaFX新手或一般编码的人解答(我很无聊..)。
在提供的代码(见下文)中,每次都会创建一个新的Stage,这意味着,如果该代码在方法内部运行,则每次在运行该代码时实际上都会创建一个新的Stage变量:
Stage stage = new Stage(StageStyle.DECORATED);
您可以做些什么,而不是在方法外创建Stage变量,这样您要么1.每次都覆盖它,要么2.进行一些“显示”或nullcheck或类似操作以查看是否应创建一个新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();
}
此外,我通常要做的是创建一个Stage工厂以避免很多重复的代码,这样我就可以拆分阶段的创建以及将fxml加载到控制器以外的其他类中。