从Java启动Javafx并传递值
我使用的是NetBeans,在同一个包下有两个类(main.java使用带有按钮的swing容器。FXapp.java使用JavaFX在单独的窗口中播放媒体)。单击main.java上的按钮应该在其自己的线程中启动FXapp.java。但是,使用下面的代码,我启动了应用程序,但我的java应用程序挂起。有没有关于如何在没有这个问题的情况下启动JavaFX应用程序的建议? 此外(可能相关),我希望Java应用程序能够传递值,以显示在FXapp的文本框中。这可能是因为我无法获得FXapp的句柄 Java按钮代码:从Java启动Javafx并传递值,java,multithreading,parameter-passing,javafx,Java,Multithreading,Parameter Passing,Javafx,我使用的是NetBeans,在同一个包下有两个类(main.java使用带有按钮的swing容器。FXapp.java使用JavaFX在单独的窗口中播放媒体)。单击main.java上的按钮应该在其自己的线程中启动FXapp.java。但是,使用下面的代码,我启动了应用程序,但我的java应用程序挂起。有没有关于如何在没有这个问题的情况下启动JavaFX应用程序的建议? 此外(可能相关),我希望Java应用程序能够传递值,以显示在FXapp的文本框中。这可能是因为我无法获得FXapp的句柄 Ja
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) {
}
}
JavaFX管理自己的线程,您不应该尝试指定JavaFX要使用的线程 我建议使用
JFXPanel
保存JavaFX应用程序实例创建的场景,而不是通过调用Swing应用程序中的application.launch
方法来启动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);
}
});
关于集成的JavaFXforSwing开发人员教程详细介绍了上述方法
当您使用JFXPanel
时,JavaFX系统将使用由JavaFX系统管理的JavaFX应用程序线程,Swing将使用它的事件调度线程。JavaFX应用程序线程将不同于Swing事件调度线程(如我链接的JavaFX文档中所述)。必须注意,所有JavaFX处理都是在JavaFX应用程序线程上完成的(通过使用构造),而Swing处理是在Swing事件调度线程上完成的(通过使用构造)
对于在现有Swing应用程序中使用JavaFX播放媒体的具体情况,在问题的答案中有一个示例解决方案:请注意,要实现这一点,您实际上不需要创建新的JavaFX应用程序,而是创建一个JavaFX场景
,你可以把它放在JFXPanel
中setRefObj(obj1)
做什么?工作完成后,您如何中断线程?你有例外吗?