【问题标题】:Prevent window from being focused when FileChooser is active当 FileChooser 处于活动状态时,防止窗口被聚焦
【发布时间】:2017-07-14 00:22:30
【问题描述】:

我有一个简单的 JavaFX 应用程序,我只需调用 showOpenDialog() 就可以打开一个 FileChooser

我想在文件选择器打开时禁止选择我的主窗口,并尽可能将其保持在主窗口的顶部。

感谢您提供的任何帮助。

【问题讨论】:

    标签: java javafx java-8 javafx-8 filechooser


    【解决方案1】:

    来自showOpenDialog 的文档(强调我的):

    显示一个新的文件打开对话框。该方法直到 显示的打开对话框被关闭。返回值指定 用户选择的文件,如果没有选择,则返回 null。 如果 文件对话框的所有者窗口被设置,输入到文件对话框中的所有窗口 显示文件对话框时,对话框的所有者链被阻止。

    因此,由于所有者链,在这种情况下 primaryStagesecondStage 都被阻止:

    primaryStage.setScene(new Scene(new VBox(), 300, 300));
    primaryStage.show();
    
    Stage secondStage = new Stage();
    secondStage.setScene(new Scene(new VBox(), 50, 50));
    secondStage.initOwner(primaryStage);
    
    secondStage.show();
    
    FileChooser fc = new FileChooser();
    fc.showOpenDialog(secondStage);
    

    如果将最后一行修改为

    fc.showOpenDialog(primaryStage);
    

    primaryStage 被阻止,但secondStage 可用。


    最后,如果你不执行这一行:

    secondStage.initOwner(primaryStage);
    

    你把最后一行称为

    fc.showOpenDialog(secondStage);
    

    primaryStage 未被阻止,但 secondStage 被阻止。

    【讨论】:

      【解决方案2】:

      在展示舞台之前,根据需要将 stage.initModality 调用为 APPLICATION_MODALWINDOW_MODAL。同时调用stage.initOwner

      Stage stage = new Stage();
      stage.initModality(Modality.WINDOW_MODAL);
      stage.initOwner(pane.getScene().getWindow());
      stage.setScene(new Scene(content));
      stage.show();
      

      注意您不能将上述规则应用于FileChooser。但是,您可以使用showOpenDialog(Window ownerWindow)

      fileChooser.showOpenDialog(stage)
      

      所以当你打开 filechooser.Main 窗口时会被屏蔽。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多