如何在JavaFX 2.1中创建模态窗口

Luk*_*uka 36 javafx javafx-2

我无法弄清楚如何在JavaFX中创建模态窗口.基本上我有文件选择器,我想在用户选择文件时询问用户.我需要这些信息才能解析文件,因此执行需要等待答案.

我已经看到了这个问题但是我无法找到如何实现这个行为.

Krz*_*zyk 68

在我看来,这不是一个好的解决方案,因为父窗口始终处于活动状态.
例如,如果您想在单击按钮后打开窗口作为模态...

private void clickShow(ActionEvent event) {
    Stage stage = new Stage();
    Parent root = FXMLLoader.load(
        YourClassController.class.getResource("YourClass.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();
}
Run Code Online (Sandbox Code Playgroud)

现在你的新窗​​口是REALY模态 - parent是块.你也可以使用

Modality.APPLICATION_MODAL
Run Code Online (Sandbox Code Playgroud)

  • 我不得不使用stage.initModality(Modality.APPLICATION_MODAL); 阻止呼叫父母.即使使用showAndWait()也没有阻止调用者(我从JFXPanel调用 - 不确定是否有任何区别.) (2认同)

jew*_*sea 44

以下是我之前为JavaFX 2.1中的模态对话框创建的解决方案的链接.该解决方案在当前阶段的顶部创建一个模态阶段,并通过对话框控件的事件处理程序对对话框结果执行操作.

更新

先前链接的解决方案使用日期事件处理程序方法在对话框被解除后采取行动.该方法适用于JavaFX之前的2.2实现.对于JavaFX 8+,不需要事件处理程序,而是使用新的Stage showAndWait()方法.例如:

Stage dialog = new Stage();

// populate dialog with controls.
...

dialog.initOwner(parentStage);
dialog.initModality(Modality.APPLICATION_MODAL); 
dialog.showAndWait();

// process result of dialog operation. 
... 
Run Code Online (Sandbox Code Playgroud)

需要注意的是,为了使预期的东西的工作,它初始化舞台的主人是重要对舞台的方式初始化要么WINDOW_MODALAPPLICATION_MODAL.

JavaFX 8ControlsFX中有一些高质量的标准UI对话框,如果它们符合您的要求,我建议使用它们而不是开发自己的.那些内置的JavaFX DialogAlert类也有initOwnerinitModalityshowAndWait方法,因此您可以根据需要设置它们的模态(请注意,默认情况下,内置对话框是应用程序模式).

  • ControlsFX库是为JavaFX 8.0及更高版本开发的,将于2014年第一季度发布,因此必须考虑到这一点. (3认同)