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