在 JFXPanel 中嵌入 JavaFX 阶段(Swing 嵌入)

Posted

技术标签:

【中文标题】在 JFXPanel 中嵌入 JavaFX 阶段(Swing 嵌入)【英文标题】:Embed JavaFX Stage inside JFXPanel (Swing Embed) 【发布时间】:2013-12-23 03:57:24 【问题描述】:

我正在尝试修改现有的 JavaFX GUI 程序,使其具有“始终保持领先”的功能。目前 JavaFX 不支持这一点(为什么!?!?),所以一些谷歌搜索让我相信我必须将 Swing 结合到我的 JavaFX 应用程序中才能实现这一点。不理想,但还可以。

我发现的所有示例模式都使用JFXPanel 而不是Stage,但是由于我的应用程序已经存在并且从一开始就使用JavaFX 编写(目前代码库中的Swing 为零),因此删除了@ 987654323@ 从应用程序开始成为一个主要的重写,只是为了支持这个“顶部”功能。

如何将现有的 JavaFX Stage 嵌入到 JFXPanel 或类似文件中,这将允许我使用标准的 getSomeSwingWindowOrPanel().setAlwaysOnTop(true); 并使我的应用程序按预期浮动在所有其他窗口之上?我是不是错了,即。有没有更好的方法,比如使用 JNI 之类的?

【问题讨论】:

你的舞台有一个有根的场景:把根放在 JFXPanel 中,你应该差不多完成了。 舞台确实有一个根——通过FXMLLoader读入的FXML...但是将stage更改为JFXPanel会删除很多功能,例如特殊的javafx事件处理程序、舞台标题和 stage.setOnCloseRequest() 等等。有没有办法保留现有的程序逻辑并简单地将这个功能应用于Stage 【参考方案1】:

setAlwaysOnTop() 方法已添加到 Java 8u20 中的阶段。

public final void setAlwaysOnTop(boolean value)

设置属性 alwaysOnTop 的值。

属性说明:

定义此阶段是否保持在其他窗口之上。 如果某个其他窗口已经始终位于顶部,则这些窗口之间的相对顺序未指定(取决于平台)。

如果存在安全管理器,则应用程序之间的行为会有所不同。允许具有权限的应用程序在舞台上设置“始终位于顶部”标志。在没有适当权限的应用程序中,设置标志的尝试将被忽略,属性值将恢复为“false”。

该属性是只读的,因为它可以被底层平台从外部更改,因此不能绑定。

默认值:

自:

JavaFX 8u20

【讨论】:

【参考方案2】:

我发现的所有示例模式都使用 JFXPanel 而不是 Stage,但是由于我的应用程序已经存在并且从一开始就是使用 JavaFX 编写的(目前代码库中的 Swing 为零),因此从应用程序中删除 Stage成为一个重大的重写只是为了支持这个“***”功能。

添加“始终保持领先”功能(不删除 Stage)的更好方法是:-

stage.initModality(Modality.APPLICATION_MODAL);

我希望它对你有用........

干杯

[1]http://docs.oracle.com/javafx/2/api/javafx/stage/Stage.html

【讨论】:

嗯...看来Modality.APPLICATION_MODAL 是为了使Stage 浮动在其他Stages 之上,而不是所有其他窗口。 IE。如果您单击它,JavaFX 程序仍将落在您的 Web 浏览器后面。我正在尝试使 JavaFX 应用程序浮动在所有窗口之上; JavaFX 和类似的系统窗口。

以上是关于在 JFXPanel 中嵌入 JavaFX 阶段(Swing 嵌入)的主要内容,如果未能解决你的问题,请参考以下文章

Swing 的 JavaFX 模态窗口所有权

一次扩展2个Titledpanes

在 HTML 网页中嵌入 JavaFX 应用程序

JavaFX : 使用 JavaFX 嵌入浏览器而不是可用的 webview

如何在 JavaFx 2.2 中嵌入 .ttf 字体?

如何在 JavaFX 中获得一个阶段的关闭事件?