所有应用程序的JavaFX辅助屏幕“始终在最前面”

所有应用程序的JavaFX辅助屏幕“始终在最前面”

问题描述:

我已阅读过有关使用JDialog来包装JFXPanel以便使用JDialog的alwaysOnTop方法的信息。它的工作原理,但我有这个黑客小问题。所有应用程序的JavaFX辅助屏幕“始终在最前面”

因为我正在使用这种技术,使我的主要应用程序(弹出窗口等)的辅助窗口,我需要将它们设置在主窗口的顶部。如果我使用wrapper hack来做到这一点,顶部面板是的一切(包括其他应用程序)的“始终在最上面”。

有没有办法把第二屏幕只在我的应用程序的顶部?我不喜欢另一个应用程序可以在我的应用程序的主窗口和辅助窗口之间拖动。

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

在显示第二阶段之前,使第二个屏幕为Stage并调用secondaryStage.initOwner(primaryStage)

从Stage文档:

甲阶段可任选地具有一个所有者Window。当一个窗口是舞台的所有者时,它被认为是该舞台的父母。 。 。一个舞台将始终在其父窗口之上。

我相信设置第二阶段的所有者,正确地满足您的要求,“仅次于我的应用程序的二次屏幕”。


更新:从意见

我不希望这是与主舞台的任何交互一旦次级是开放的回答更多的问题(二级窗口必须关闭允许再次交互)。

要阻止输入到初级阶段,在显示次级阶段之前,请致电:secondaryStage.initModality(Modality.WINDOW_MODAL)

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

api中没有任何明显的内容会将主屏幕上的辅助屏幕居中。无论主屏幕位于何处,它总是以显示器为中心。

这部分的问题是Center location of stage的重复。重复的答案有用于执行子窗口居中的示例代码。

没错,围绕父窗口定位子窗口的公共API中没有任何内容。我已经提交了此功能的功能请求Add helper methods for positioning popups relative to nodes,但功能请求尚未在JavaFX 2.2中实现。

有一个sample project我创建了相对定位的子对话框,这可能是有用的。

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

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

您所请求的所有功能可能都会在JavaFX核心平台中出现,但我认为JavaFX 2.2还没有完全实现。

+0

再次感谢jewelsea!到目前为止,你已经回答了我的几个jfx问题。 :)我只是有几个关于这个问题。打开第二阶段的按钮可以多次点击。我不希望一旦辅助节目开放后,与主节目有任何互动(辅助节目必须关闭才能再次进行互动)。有没有办法做到这一点?另外,在主屏幕上的辅助屏幕居中的api中没有任何明显的表现。无论主屏幕位于何处,它总是以显示器为中心。 – Matt 2013-04-05 22:51:18

+1

我更新了答案以回答其他问题(可能最好在下次新问题中提问更多问题 - 然后其他人更容易找到他们需要的确切答案)。 – jewelsea 2013-04-05 23:24:30

+0

当我正在研究时,在Modal右侧瞥了一眼。谢谢!我会留意你现在在单独的问题上发布的建议。 – Matt 2013-04-05 23:36:06

我同意jewelsea,但是如果您需要使用JDialog JavaFX阶段(就像我的情况那样),那么您无法设置您的primaryStage的父级或模式。

我发现的唯一的解决方案是使用一个小“黑客”:

我用JNA,Java本地访问API使用User32.INSTANCE.setWindowPos(...)与HWND_TOPMOST参数做我自己setAlwaysOnTop()方法。

编辑:看microsoft docjna doc

+0

你能否实施你的实施? – Magcus 2014-02-05 13:06:27