我一直用Java编写模拟,现在在JavaFX中生成结果图。但是,我对如何调用图表感到困惑,以便当我尝试第二次运行模拟(并生成图形)时,我不会得到“不能多次调用launch()” “错误。我读到只能调用一次launch(),那么在第二次模拟运行时我需要更改什么才能成功调用图形?
public class AnswerWorker extends SwingWorker<Void, Integer> {
protected Void doInBackground() throws Exception
{
AMEC.runsimulation();
return null;
}
protected void done()
{
try {
Graphs.launch(Graphs.class, "");
JOptionPane.showMessageDialog(InputGUI.this, AMEC.unsuccesfulpercentage + "% of iterations had trucks that had to sleep over");
AMEC.unsuccesfulpercentage = 0;
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
有一个非常标准的图表类:
public class Graphs extends Application {
@Override public void start(Stage stage) {
....
stage.show();
}
}
答案 0 :(得分:2)
为什么在JavaFX应用程序中使用SwingWorker?如果计算图形以便在JavaFX应用程序中显示,则没有理由使用事件调度线程(AWT)。如果我没有弄错的话,随着JDK 8,JavaFX应用程序线程和事件调度线程will become one的发布,所以你没有理由使用SwingWorker。如果我真的错了,你仍然没有理由使用SwingWorker。虽然可以在JavaFX应用程序中耦合Swing组件,但是在操作Swing组件时应该只使用EDT,而不是JavaFX节点。以下链接说明了这一点:
... JavaFX应用程序线程与Swing和AWT事件调度线程(EDT)不同,因此在将JavaFX代码嵌入Swing应用程序时必须小心......
来源:http://docs.oracle.com/javafx/2/architecture/jfxpub-architecture.htm
要了解如何在后台完成进程,并找出负责处理JavaFX元素的线程,请查看以下链接:
http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
关于你的问题,我认为JavaFX应用程序的开头应该只调用一次。这就是说,当JavaFX应用程序启动时,会捕获main方法的线程,并且仅在完成JavaFX应用程序时返回。只需查看Application DOC(特别是this部分)。另请注意,JavaFX应用程序的生命周期由以下步骤给出:
<强>生命周期强>
JavaFX应用程序的入口点是Application类。无论何时启动应用程序,JavaFX运行时都会按顺序执行以下操作:
- 构造指定Application类的实例
- 调用init()方法
- 调用start(javafx.stage.Stage)方法
- 等待应用程序完成,这发生在任何一个 发生以下情况: 应用程序调用Platform.exit() 最后一个窗口已关闭且Platform上的implicitExit属性为true
- 调用stop()方法
醇>
您可能使用了错误的方法。我相信你应该在处理某些东西时让你的JavaFX应用程序运行。在后台处理完所需的内容后,应该让JavaFX应用程序显示结果。 JavaFX应用程序在后台处理某些内容时的运行方式完全取决于您。也许你应该在处理某些东西时隐藏窗口,并在你的图表完成后再次显示它。正如我所说,这是你必须要决定的。我建议您查看引用窗口系统的类的文档,从Window开始,然后Stage。
有任何问题,我们在这里。祝好运! :)
修改强>:
从我所看到的,用户珠宝是正确的。显然,不确定EDT和JavaFX应用程序线程是否会成为一体(如果发生这种情况,那将非常有趣)。但无论如何,小心不要混淆两个线程的使用。