所有应用程序的JavaFX辅助屏幕"始终位于顶部"

Mat*_*att 5 javafx always-on-top

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

由于我正在使用这种技术为我的主应用程序(弹出窗口等)创建辅助窗口,我需要将它们设置在主窗口的顶部.如果我使用包装黑客要做到这一点,顶部面板是"总在最前面"的一切(包括其他应用程序).

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

jew*_*sea 15

我建议不要使用JDialogJFXPanel,而只使用JavaFX 阶段.

在显示辅助阶段之前,使辅助屏幕成为a Stage并调用secondaryStage.initOwner(primaryStage).

从舞台文档:

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

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


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

我不希望在辅助节点打开后与主舞台进行任何交互(必须关闭辅助窗口才能再次进行交互).

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

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

在api中没有任何明显的东西可以将辅助屏幕置于主屏幕中心.无论主屏幕在哪里,它总是以显示器为中心.

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

没错,公共api中没有任何内容围绕父窗口定位子窗口.我已经为此功能提交了一个功能请求添加帮助方法来定位相对于节点的弹出窗口,但是从JavaFX 2.2开始还没有实现功能请求.

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

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

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

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