JavaFX 管理它自己的线程,您不应该尝试指定一个线程供 JavaFX 使用。
我建议不要尝试通过调用Application.launch
Swing 应用程序中的方法来启动 JavaFX 应用程序,而是使用 aJFXPanel
来保存由 JavaFX 应用程序实例创建的场景:
JFrame frame = new JFrame("Swing and JavaFX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setSize(300, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final FXApp xvp = new FXapp();
final String initialText = "xyzzy";
Platform.runLater(new Runnable() {
@Override public void run() {
// createRootScene is a new public method you write and expose on FXApp.
Scene scene = xvp.createRootScene(String customText);
fxPanel.setScene(scene);
}
});
上述方法在 JavaFX for Swing Developers 教程中详细介绍了将 JavaFX 集成到 Swing 应用程序中。
当您使用 aJFXPanel
时,JavaFX 系统将使用由 JavaFX 系统管理的 JavaFX Application 线程,而 Swing 将使用它的 Event Dispatch Thread。JavaFX 应用程序线程将不同于 Swing 事件调度线程(如我链接的 JavaFX 文档中所述)。必须注意,所有 JavaFX 处理都是在 JavaFX 应用程序线程上完成的(通过使用Platform.runLater构造),而 Swing 处理是在 Swing Event Dispatch 线程上完成的(通过使用SwingUtilities.invokeLater构造)。
对于您在现有 Swing 应用程序中使用 JavaFX 播放媒体的特定情况,在问题的答案中有一个示例解决方案:在普通 Java 应用程序中使用 JavaFX MediaPlayer 播放音频? 请注意,要做到这一点,您实际上并不需要创建一个新的 JavaFX 应用程序,而只需创建一个 JavaFX Scene
,您可以将其放置在JFXPanel
.