【发布时间】:2017-07-14 00:22:30
【问题描述】:
我有一个简单的 JavaFX 应用程序,我只需调用 showOpenDialog() 就可以打开一个 FileChooser。
我想在文件选择器打开时禁止选择我的主窗口,并尽可能将其保持在主窗口的顶部。
感谢您提供的任何帮助。
【问题讨论】:
标签: java javafx java-8 javafx-8 filechooser
我有一个简单的 JavaFX 应用程序,我只需调用 showOpenDialog() 就可以打开一个 FileChooser。
我想在文件选择器打开时禁止选择我的主窗口,并尽可能将其保持在主窗口的顶部。
感谢您提供的任何帮助。
【问题讨论】:
标签: java javafx java-8 javafx-8 filechooser
来自showOpenDialog 的文档(强调我的):
显示一个新的文件打开对话框。该方法直到 显示的打开对话框被关闭。返回值指定 用户选择的文件,如果没有选择,则返回 null。 如果 文件对话框的所有者窗口被设置,输入到文件对话框中的所有窗口 显示文件对话框时,对话框的所有者链被阻止。
因此,由于所有者链,在这种情况下 primaryStage 和 secondStage 都被阻止:
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 被阻止。
【讨论】:
在展示舞台之前,根据需要将 stage.initModality 调用为 APPLICATION_MODAL 或 WINDOW_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 窗口时会被屏蔽。
【讨论】: