在 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 嵌入)的主要内容,如果未能解决你的问题,请参考以下文章