从Java启动Javafx并传递值

时间:2013-03-25 21:16:24

标签: java multithreading parameter-passing javafx

我正在使用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) {
    }
}

1 个答案:

答案 0 :(得分:0)

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

我没有尝试通过从Swing应用程序调用{​​{1}}方法来启动JavaFX应用程序,而是建议使用Application.launch来保存由JavaFX应用程序实例创建的场景:

JFXPanel

关于集成JavaFX into a Swing application的JavaFX for Swing Developers教程详细介绍了上述方法。

当您使用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系统将使用由JavaFX系统管理的JavaFX Application线程,Swing将使用它的Event Dispatch Thread。 JavaFX Application Thread与Swing Event Dispatch线程不同(如我链接的JavaFX文档中所述)。必须注意所有JavaFX处理都是在JavaFX应用程序线程上完成的(通过使用Platform.runLater构造),并且Swing处理是在Swing Event Dispatch线程上完成的(使用SwingUtilities.invokeLater构造)。

对于使用JavaFX从现有Swing应用程序中播放媒体的特定情况,问题的答案中有一个示例解决方案:Playing audio using JavaFX MediaPlayer in a normal Java application?请注意,要实现此目的,您实际上不需要创建一个新的JavaFX应用程序,而只是创建一个JavaFX JFXPanel,您可以将其置于Scene内。