我们正在做一个包含javafx和javaswing的项目。我们有一个由Java Swing制作的主菜单。我们需要在主菜单中点击一个swing按钮时启动JavaFX应用程序。我们的JavaFX部分的程序是2400行,所以我们不能将其转换为JFXPanel。我已经对JavaFX有了一定的经验。但是我解决不了这个问题。任何帮助都将不胜感激。谢谢你。
主要建议是,除非确实需要,否则不要混合使用Swing和JavaFX。一般来说,最好使用单一的UI工具包,而不是混合使用。
使用JFXPanel(推荐)
遵循javafx swing集成文档,该文档解释了如何编写代码。
我链接的文档有点过时了。代码保持不变,但从JDK/JavaFX 11起,JavaFX被模块化并从大多数JDK发行版中删除,因此您需要做一些额外的工作。
- 在StackOverflow上使用JFXPanel的另一个示例。
将JFXPanel应用到现有JavaFX应用程序
我链接的javafx swing集成文档是用于将javafx内容放在swing面板(JFXPanel
)中,但我注意到您说您不能在应用程序中使用这样的面板。我不太明白你为什么不能那样做。JFXPanel
只是一个通用的swing组件,可以容纳任何JavaFX场景。链接的javadoc还展示了如何使用它。
要将JFXPanel
应用于现有的JavaFX应用程序,让JavaFX应用程序提供一个方法,该方法提供它通常在应用程序start
方法的主要阶段上设置的场景。调用新方法将场景嵌入到Swing应用程序框架内的JFXPanel
中。您不需要使用此方法在JavaFX应用程序上调用launch
。
获取JavaFX组件和模块化
要使用模块化JavaFX,也请遵循openjfix .io中的说明:
-
所需的maven依赖项是
org.openjfx:javafx-swing:<version>
<dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-swing</artifactId> <version>18</version> </dependency>
-
模块信息(如果你需要它)是:
requires javafx.swing;
模块信息仅在编写提供module-info.java
的模块化应用程序时才需要,否则您需要通过命令行开关将模块添加到模块路径中以进行编译和运行(如openjfx. xml中概述的那样)。IO文档链接)。
或者,你可以依赖一个JDK,它在发行版中包含JavaFX和swing模块,并将它们放在引导模块路径上,例如:
- Azul Zulu "JDK FX"(在下载链接上确保选择JDK FX)。
- Bellsoft Liberica "Full JDK"(在下载链接上确保你选择了完整的JDK)。
从Swing启动JavaFX应用程序(不推荐)
也可以直接调用JavaFX应用程序的launch
方法。
如果这样做,请在链接的javadoc上研究应用程序生命周期文档。
你只能调用一次launch,它会阻塞调用线程,直到JavaFX应用程序退出。
如果需要多个非阻塞调用,则需要做一些工作来使用这种方法。例如,生成一个单独的执行线程来启动应用程序(这样就不会阻塞Swing线程)。一旦JavaFX应用程序启动,根据需要使用Platform.runLater
从Swing与JavaFX应用程序通信(例如请求JavaFX应用程序显示或隐藏)。
如果您想多次调用launch(这在单个JVM实例中是做不到的),那么,另一种方法是:
- java中如何多次调用launch()
如果您使用的是现代JDK和JavaFX发行版,那么该方法的模块设置要求与JFXPanel方法相同。
我建议使用JFXPanel,而不是从Swing启动JavaFX应用程序。
Swing in JavaFX
如果你想走另一条路,在JavaFX应用程序中嵌入swing内容(例如,正如James_D在评论中建议的那样,"在JavaFX中编写"主菜单"),那么你可以使用SwingNode
,这是一个JavaFX节点,显示在可以包含swing组件的JavaFX应用程序中:
- 在JavaFX应用程序中嵌入Swing内容