我有一个 Swing 应用程序,其主窗口继承JFrame
类。此应用程序正在过渡到 JavaFX,因此 JavaFX 组件上有很多内容,包括控制面板。 我需要以相对于主JFrame
的模式方式显示来自非 UI 线程的本机文件选择器。这可以通过设置类FileChooser
所有者来实现,但它需要javafx.stage.Window
成为所有者。是否有一些技巧可以将JFrame
设置为javafx FileChooser
或Stage
的所有者?
解决方案可能是以某种方式禁用选择JFrame
,直到FileChooser
关闭。
这里有一些伪代码,因为我不知道 swing 那么好:
- 以某种方式从 JFrame 中删除焦点(也许使用
setFocusableWindowState(false)
? - 在 FXApplication 线程上打开文件选择器
- 完成后(使用
Thread.join()
或您想要管理线程的方式完成(,将焦点恢复到 JFrame
实际上就像:
JFrame frame = // get window
frame.setEnabled(false); // emulate window modality
File file = fileChooser.showOpenDialog(null);
if (file == null || !openFile(file)) { // return true if file was opened correctly
frame.setEnabled(true);
frame.requestFocus(); // window looses focus after enabling
}
所以FileChooser
在这里的行为就像模态窗口一样。缺点是需要控制所有路径以启用窗口后退,这样它就不会永远处于禁用状态。