我有一个允许用户扫描的JavaFX-GUI。 这个过程需要一段时间。因此,用户既不应该继续点击,也不应该认为程序自行挂起。
我的解决方案是一个模态窗口,它位于整个GUI的前面,并在一切都完成后消失。
界面由FXML-Controller,FXML-File和MainApp组成。
到目前为止,我在控制器中调用它:
Stage stage = Messages.beforeScan(event);
s.scan(filename);
stage.close();
beforeScan
- 方法看起来像(取自How to create a modal window in JavaFX 2.1):
public static Stage beforeScan(Event event) {
Stage stage = new Stage();
try {
Parent root = FXMLLoader.load(
FXMLController.class.getResource("/fxml/Scene.fxml"));
stage.setScene(new Scene(root));
stage.setTitle("My modal window");
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(((Node)event.getSource()).getScene().getWindow());
stage.show();
} catch (IOException ex) {
Logger.getLogger(Meldungen.class.getName()).log(Level.SEVERE, null, ex);
}
return stage;
}
但这并不成功。如果我注释掉stage.close();
我仍然可以使用我的主GUI。
所以采用不同的方法:
而不是从控制器导入场景我厌倦了从MainApp-Class获取它:
public static Stage beforeScan(Event event) {
Stage stage = new Stage();
stage.setScene(MainApp.getStage.getScene());
stage.setTitle("My modal window");
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(((Node) event.getSource()).getScene().getWindow());
stage.show();
return stage;
}
但这只是用StackOverflow
崩溃了。
弹出窗口(取自示例here)也没有帮助。它甚至只在扫描后打开。
使用警报似乎是个好主意,但这样做不仅会锁定屏幕,还会锁定程序本身:
public Alert beforeScan(Event event) {
javafx.scene.control.Alert alert = new Alert(Alert.AlertType.NONE, "Scan in progress");
alert.showAndWait();
return alert;
}
屏幕锁定模式窗口/弹出窗口应如何正确完成?