如何“重启”JavaFX应用程序?

时间:2014-01-15 10:52:41

标签: graph javafx

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

1 个答案:

答案 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运行时都会按顺序执行以下操作:

     
      
  1. 构造指定Application类的实例
  2.   
  3. 调用init()方法
  4.   
  5. 调用start(javafx.stage.Stage)方法
  6.   
  7. 等待应用程序完成,这发生在任何一个   发生以下情况:      应用程序调用Platform.exit()      最后一个窗口已关闭且Platform上的implicitExit属性为true
  8.   
  9. 调用stop()方法
  10.   

您可能使用了错误的方法。我相信你应该在处理某些东西时让你的JavaFX应用程序运行。在后台处理完所需的内容后,应该让JavaFX应用程序显示结果。 JavaFX应用程序在后台处理某些内容时的运行方式完全取决于您。也许你应该在处理某些东西时隐藏窗口,并在你的图表完成后再次显示它。正如我所说,这是你必须要决定的。我建议您查看引用窗口系统的类的文档,从Window开始,然后Stage

有任何问题,我们在这里。祝好运! :)

修改

从我所看到的,用户珠宝是正确的。显然,不确定EDT和JavaFX应用程序线程是否会成为一体(如果发生这种情况,那将非常有趣)。但无论如何,小心不要混淆两个线程的使用。