6

我已经阅读了有关使用 JDialog 包装 JFXPanel 以使用 JDialog 的 alwaysOnTop 方法的信息。它有效,但我对这个黑客有一个小问题。

由于我使用这种技术为我的主应用程序(弹出窗口等)制作辅助窗口,因此我需要将它们设置在主窗口的顶部。如果我使用 wrapper hack 来执行此操作,则顶部面板“始终位于”所有内容(包括其他应用程序)的顶部。

有没有办法将辅助屏幕仅放在我的应用程序之上?我不喜欢可以在我的应用程序的主窗口和辅助窗口之间拖动另一个应用程序的事实。

4

2 回答 2

15

我建议不要使用JDialogJFXPanel,而只使用 JavaFX Stages

使您的辅助屏幕 a并在显示辅助阶段之前Stage调用secondaryStage.initOwner(primaryStage) 。

从舞台文档中:

一个阶段可以选择拥有一个所有者窗口。当一个窗口是一个阶段的所有者时,它被称为该阶段的父级。. . 阶段将始终位于其父窗口的顶部。

我相信设置辅助阶段的所有者,正确地满足了您“仅在我的应用程序之上的辅助屏幕”的要求。


更新:对评论中其他问题的回答

一旦次要窗口打开,我不希望与主要阶段有任何交互(必须关闭辅助窗口才能再次进行交互)。

要阻止输入到主要阶段,在显示次要阶段之前,请调用:secondaryStage.initModality(Modality.WINDOW_MODAL)

如果您希望阻止对任何其他应用程序窗口的所有输入,则可以使用APPLICATION_MODAL而不是WINDOW_MODAL - 使用哪一个取决于您想要的用户体验。

api中没有什么明显的东西可以将辅助屏幕居中放在主屏幕上。无论主屏幕在哪里,它总是以显示器为中心。

这部分问题是舞台中心位置的副本。副本的答案有用于执行子窗口居中的示例代码。

没错,公共 api 中没有关于相对于父窗口定位子窗口的内容。我已经为此功能提交了一个功能请求添加用于定位相对于节点的弹出窗口的辅助方法,但该功能请求尚未在 JavaFX 2.2 中实现。

我创建了一个示例项目来进行子对话框的相对定位,这可能很有用。

只是为了在父级中居中,您最好在显示子级之前查询舞台位置和宽度,然后在显示子级时适当地设置子级的 x 和 y 坐标。所有这些都可以基于窗口的xywidth属性来完成。

JavaFX UI 控件沙箱中还有一个对话框项目,它可能提供您需要的一些功能,因此您无需自己编写代码。

随着时间的推移,您请求的所有功能都可能最终出现在 JavaFX 核心平台中,但我认为 JavaFX 2.2 还没有完全实现。

于 2013-04-05T20:19:38.317 回答
3

我同意jewelsea,但如果您需要使用JDialogJavaFX 阶段(就像我的情况一样),那么您不能设置您的primaryStage 的父级或模态。

我发现的唯一解决方案是使用一点“hack”:

我使用 JNA、Java Native Access API 使用HWND_TOPMOST 参数执行我自己的setAlwaysOnTop()方法。User32.INSTANCE.setWindowPos(...)

编辑:见microsoft docjna doc

于 2013-08-20T16:53:28.780 回答