Graph “我该怎么做?”;“重新启动”;JavaFX应用程序?

Graph “我该怎么做?”;“重新启动”;JavaFX应用程序?,graph,javafx,Graph,Javafx,我一直在用Java编写一个模拟,现在用JavaFX生成结果图。然而,我对如何调用图形感到困惑,因此当我第二次尝试运行模拟(并生成图形)时,不会出现“不能多次调用launch()”错误。我了解到launch()只能调用一次,所以要在第二次运行模拟时成功调用图,需要做哪些更改 public class AnswerWorker extends SwingWorker<Void, Integer> { protected Void doInBackground() throws Exce

我一直在用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();
    }

}
}

为什么在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运行时都会按顺序执行以下操作:

  • 构造指定应用程序类的实例
  • 调用init()方法
  • 调用start(javafx.stage.stage)方法
  • 等待应用程序完成,当 出现以下情况: 应用程序调用Platform.exit() 最后一个窗口已关闭,平台上的implicitExit属性为true
  • 调用stop()方法
  • 您可能使用了错误的方法。我认为您应该在处理某些内容时让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();
        }
    }