【问题标题】:JavaFX Secondary Screen "Always on Top" of All ApplicationsJavaFX 辅助屏幕“始终位于所有应用程序的顶部”
【发布时间】:2013-03-27 11:52:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: javafx always-on-top


    【解决方案1】:

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

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

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

    编辑:见microsoft docjna doc

    【讨论】:

    • 你能介绍一下你的实现吗?
    【解决方案2】:

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

    将您的辅助屏幕设为Stage 并在显示辅助阶段之前调用secondaryStage.initOwner(primaryStage)

    来自舞台文档:

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

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


    更新:对来自 cmets 的其他问题的回答

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

    要阻止初级阶段的输入,在显示次级阶段之前,请调用: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的xywidth属性来完成。

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

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

    【讨论】:

    • 再次感谢jewelsea!到目前为止,您已经回答了我的一些 jfx 问题。 :) 我对此有几个问题。可以多次单击打开二级阶段的按钮。一旦次要窗口打开,我不希望与主要阶段有任何交互(必须关闭辅助窗口才能再次进行交互)。有没有办法做到这一点?此外,在 api 中没有任何明显的东西可以将辅助屏幕居中放在主屏幕上。无论主屏幕在哪里,它总是以显示器为中心。
    • 我更新了答案以回答其他问题(可能最好下次在新问题中提出其他问题 - 这样其他人更容易找到他们需要的准确答案)。
    • 我在研究的时候看了一眼 Modal。谢谢!我现在会听取您关于在单独的问题下发布的建议。
    • 另请参阅:Center location of stage 将子窗口置于父窗口的中心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2014-07-31
    相关资源
    最近更新 更多