Graph “我该怎么做?”;“重新启动”;JavaFX应用程序?
我一直在用Java编写一个模拟,现在用JavaFX生成结果图。然而,我对如何调用图形感到困惑,因此当我第二次尝试运行模拟(并生成图形)时,不会出现“不能多次调用launch()”错误。我了解到launch()只能调用一次,所以要在第二次运行模拟时成功调用图,需要做哪些更改Graph “我该怎么做?”;“重新启动”;JavaFX应用程序?,graph,javafx,Graph,Javafx,我一直在用Java编写一个模拟,现在用JavaFX生成结果图。然而,我对如何调用图形感到困惑,因此当我第二次尝试运行模拟(并生成图形)时,不会出现“不能多次调用launch()”错误。我了解到launch()只能调用一次,所以要在第二次运行模拟时成功调用图,需要做哪些更改 public class AnswerWorker extends SwingWorker<Void, Integer> { protected Void doInBackground() throws Exce
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();
}
}
}
为什么在JavaFX应用程序中使用SwingWorker?如果您的图形是为在JavaFX应用程序中显示而计算的,那么您没有理由使用事件调度线程(AWT)。如果我没有弄错的话,在JDK 8的发行版中,JavaFX应用程序线程和事件调度线程,那么您没有理由(现在)使用SwingWorker。如果我真的错了,你仍然没有理由使用SwingWorker。尽管JavaFX应用程序中可能存在Swing组件的耦合,但您应该仅在操作Swing组件时使用EDT,而不是JavaFX节点。下面的链接是这样说的: …JavaFX应用程序线程与Swing和AWT事件调度线程(EDT)不同,因此在将JavaFX代码嵌入Swing应用程序时必须小心 资料来源: 要了解如何在后台完成进程,并找出哪个线程负责处理JavaFX元素,请查看以下链接: 关于您的问题,我认为JavaFX应用程序的开头应该只调用一次。非常重要的是,当JavaFX应用程序启动时,将捕获main方法的线程,并且仅在JavaFX应用程序完成时返回。请看文档(特别是部分)。还请注意,JavaFX应用程序的生命周期由以下步骤给出: 生命周期 JavaFX应用程序的入口点是应用程序类。每当启动应用程序时,JavaFX运行时都会按顺序执行以下操作:
在我看来,用户jewelsea是对的。显然,EDT和JavaFX应用程序线程是否会合二为一还不确定(如果发生这种情况,那将非常有趣)。但无论如何,请注意不要混淆两个线程的使用。在您的示例中,Sebastian给出了答案:使用
JFXPanel
“随着JDK 8的发布,JavaFX应用程序线程和事件调度线程将成为一个”=>您错了。这种支持仅在JDK 8中通过使用未记录的实验标志启用。默认情况下,JavaFX应用程序线程和事件调度线程是不同的线程。
public class Graphs extends Application {
@Override public void start(Stage stage) {
....
stage.show();
}
}