0

我正在使用 NetBeans,并且在同一个包下有两个类(main.java 使用带有按钮的 swing 容器。FXapp.java 使用 JavaFX 在单独的窗口中播放媒体)。单击 main.java 上的按钮应该会在其自己的线程中启动 FXapp.java。但是,使用下面的代码,我启动了应用程序,但我的 java 应用程序挂起。有关如何在没有此问题的情况下启动 JavaFX 应用程序的任何建议?另外(可能相关)然后我希望 Java 应用程序能够传递值以显示在 FXapp 的文本框中。这可能是因为我无法处理 FXapp。

Java 按钮代码:

FXApp xvp = new FXapp();

FXapp中的主要方法代码为:

public static void main(String[] args) throws Throwable {
    FXapp obj1 = new FXapp();
    new Thread(obj1).run();
    setRefObj(obj1);
}

FXapp“运行”方法代码:

public void run() {
    try {
        Application.launch();
    } catch (Throwable t) {
    }
}
4

1 回答 1

0

JavaFX 管理它自己的线程,您不应该尝试指定一个线程供 JavaFX 使用。

我建议不要尝试通过调用Application.launchSwing 应用程序中的方法来启动 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.

于 2013-03-25T22:27:15.183 回答