在JFXPanel中嵌入JavaFX Stage(Swing嵌入)

5
我正在尝试修改一个现有的JavaFX GUI程序,使其具备“始终置顶”的功能。目前JavaFX不支持此功能(为什么?!),因此我在Google上搜索后得知必须将Swing与我的JavaFX应用程序结合起来才能实现这一点。虽然不是最理想的方法,但也可以。
我找到的所有示例模式都使用JFXPanel而不是Stage,但由于我的应用程序已经存在并且从一开始就使用了JavaFX编写(代码库中没有任何Swing),因此删除Stage以支持此“始终置顶”功能开始变得重要而需要大量重写。
我该如何在JFXPanel或类似的控件中嵌入现有的JavaFX Stage,以便使用标准的getSomeSwingWindowOrPanel().setAlwaysOnTop(true);并使我的应用程序浮动在所有其他窗口之上?我是否走错了路,例如是否有更好的方法,例如使用JNI或其他方法?

你的舞台有一个场景,其中有一个根节点:将根节点放置在JFXPanel中,你就快完成了。 - assylias
1
舞台确实有一个根节点 - 通过 FXMLLoader 读入的 FXML... 然而将 stage 更改为 JFXPanel 会移除很多功能,比如特殊的 JavaFX 事件处理程序、舞台标题和 stage.setOnCloseRequest() 等等。没有办法保留现有程序逻辑并将这些功能应用到 Stage 吗? - SnakeDoc
2个回答

1
在Java 8u20中,给舞台添加了一个setAlwaysOnTop()方法。

public final void setAlwaysOnTop(boolean value)

设置alwaysOnTop属性的值。

属性描述:

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

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

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

默认值:

false

自从:

JavaFX 8u20


0
我所找到的所有示例模式都使用JFXPanel而不是Stage,但由于我的应用程序已经存在并且从一开始就使用JavaFX编写(目前代码库中没有零Swing),因此从应用程序中移除Stage开始变成一个主要的重写,仅支持这个“在顶部”的特性。

一个更好的方法来添加“始终保持在顶部”功能(不需要移除Stage)是:-

stage.initModality(Modality.APPLICATION_MODAL);

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

干杯

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


1
嗯...看起来Modality.APPLICATION_MODAL是用于使一个Stage浮动在其他Stages之上,而不是所有其他窗口。也就是说,如果您单击它,JavaFX程序仍然会掉落到您的Web浏览器后面。我正在尝试使JavaFX应用程序浮动在所有窗口之上;包括JavaFX和系统窗口。 - SnakeDoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接