我读过关于使用JDialog来包装JFXPanel以便使用JDialog的alwaysOnTop方法。它工作,但我有一个小问题,这个hack。
由于我使用这种技术为我的主应用程序(弹出窗口等)制作辅助窗口,我需要将它们设置在主窗口的顶部。如果我使用包装器hack来做到这一点,那么顶部面板"总是在所有内容(包括其他应用程序)的顶部"。
是否有办法把辅助屏幕只在我的应用程序的顶部?我不喜欢在我的应用程序的主窗口和副窗口之间拖拽另一个应用程序。
我建议不要使用JDialog和JFXPanel,而只使用JavaFX stage。
将您的辅助屏幕设置为Stage
,并在显示辅助屏幕之前调用secondaryStage.initOwner(primaryStage)。
来自Stage文档:
一个stage可以有一个owner Window。当一个窗口是一个阶段的所有者,它被称为该阶段的父…阶段将始终位于其父窗口的顶部。
我相信设置二级阶段的所有者,正确地满足了您的要求,"二级屏幕只在我的应用程序之上"。
更新:对来自评论的其他问题的回答
我不希望在次要窗口打开后与主阶段有任何交互(次要窗口必须关闭以允许再次交互)。
在显示次要阶段之前,调用:secondarystage . initmodal (modal . window_modal)。
你可以用APPLICATION_MODAL来代替WINDOW_MODAL,如果你想要阻止所有输入到你的任何其他应用程序窗口——使用哪一个取决于你想要的用户体验。
在api中没有什么明显的东西会把副屏幕放在主屏幕的中间。它总是以显示器为中心,无论主屏幕在哪里。
问题的这一部分是舞台中心位置的重复。副本的答案有执行子窗口居中的示例代码。
没错,在公共api中没有关于子窗口相对于父窗口的定位。我已经为这个功能提交了一个特性请求,添加帮助器方法来相对于节点定位弹出窗口,但是这个特性请求在JavaFX 2.2中还没有实现。
我创建了一个示例项目来对子对话框进行相对定位,这可能会很有用。
只是为了在父元素中居中,你可能最好在显示子元素之前查询舞台位置和宽度,然后在显示时适当设置子元素的x和y坐标。所有这些都可以基于窗口的x, y和宽度属性来完成。
在JavaFX UI控件沙箱中还有一个对话框项目,它可能会提供一些你需要的功能,这样你就不需要自己编写了。
随着时间的推移,你所要求的所有功能可能最终会在JavaFX核心平台中结束,但我认为JavaFX 2.2还没有完全到位。
我同意jewelsea,但是如果你需要使用JDialog 和 JavaFX阶段(就像我的情况一样),那么你不能设置你的primaryStage的父级或模态。
我找到的唯一解决方案是使用一个小"hack":
我使用JNA, Java本地访问API来做我自己的setAlwaysOnTop()
方法使用User32.INSTANCE.setWindowPos(...)
与HWND_TOPMOST参数。
edit:参见microsoft docjna doc