如何重新运行JavaFX应用程序

如何重新运行JavaFX应用程序,java,javafx,javafx-2,Java,Javafx,Javafx 2,我的主线程启动javafx.application.application,它在完成任务后终止它的lef。当我再次尝试启动同一个JavaFX应用程序时,我总是会收到IllegalStateException:不能多次调用应用程序启动。 简单示例: public class MainApp { public static void main(String[] args) { for (int i = 0; i < 10; i++) { FXApp.setCount

我的主线程启动
javafx.application.application
,它在完成任务后终止它的lef。当我再次尝试启动同一个JavaFX应用程序时,我总是会收到
IllegalStateException:不能多次调用应用程序启动。

简单示例:

public class MainApp {  
  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
      FXApp.setCounter(i);
      System.out.println("launching i="+i);
      FXApp.launch(FXApp.class, args);
    }
  }
}

public class FXApp extends Application {    

  private static int counter;

  public static void setCounter(int counter) {
    FXApp.counter = counter;
  }

  @Override
  public void start(Stage primaryStage) throws Exception {
    try {
      Thread.sleep(1000);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      Platform.exit();
    }
  }

  @Override
  public void stop() throws Exception {
    super.stop();
    System.out.println("stopping counter="+counter);
  }

}

如何解决这个问题?

应用程序类表示整个正在运行的应用程序。名为
launch()
的静态方法用于启动应用程序。根据定义,在应用程序的生命周期中,您只能启动任何给定的应用程序一次,因此在应用程序的生命周期中多次调用
launch
是非法的,这样做会引发异常

调用
launch()
创建表示正在运行的应用程序的
Application
子类的实例,启动JavaFX工具包,并对应用程序实例调用
start()
。因此,
start()
方法实际上是应用程序的入口点。请注意,
start()
是在FX应用程序线程上调用的(因此这里不能有长时间运行或阻塞的代码)。同样,所有细节都在报告中详细说明

你还没有说你实际上想做什么,而且因为你使用的方法和类与它们的预期用途完全相反,所以很难猜出这个问题的意思。但是,可以通过以下方式实现等效功能:

public class FXApp extends Application {

    @Override
    public void start(Stage primaryStage) {
        Thread pausingAndIteratingThread = new Thread(() -> {
            for (int i = 0 ; i < 10 ; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException exc) {
                    exc.printStackTrace();
                } finally {
                    final int counter = i ;
                    Platform.runLater(() -> endIteration(counter));
                }
            }
        };

        pausingAndIterartingThread.start();
    }

    private void endIteration(int counter) {
        System.out.println("stopping: counter="+counter);
    }
}

应用程序
类表示整个正在运行的应用程序。名为
launch()
的静态方法用于启动应用程序。根据定义,在应用程序的生命周期中,您只能启动任何给定的应用程序一次,因此在应用程序的生命周期中多次调用
launch
是非法的,这样做会引发异常

调用
launch()
创建表示正在运行的应用程序的
Application
子类的实例,启动JavaFX工具包,并对应用程序实例调用
start()
。因此,
start()
方法实际上是应用程序的入口点。请注意,
start()
是在FX应用程序线程上调用的(因此这里不能有长时间运行或阻塞的代码)。同样,所有细节都在报告中详细说明

你还没有说你实际上想做什么,而且因为你使用的方法和类与它们的预期用途完全相反,所以很难猜出这个问题的意思。但是,可以通过以下方式实现等效功能:

public class FXApp extends Application {

    @Override
    public void start(Stage primaryStage) {
        Thread pausingAndIteratingThread = new Thread(() -> {
            for (int i = 0 ; i < 10 ; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException exc) {
                    exc.printStackTrace();
                } finally {
                    final int counter = i ;
                    Platform.runLater(() -> endIteration(counter));
                }
            }
        };

        pausingAndIterartingThread.start();
    }

    private void endIteration(int counter) {
        System.out.println("stopping: counter="+counter);
    }
}
public class MainApp {
    public static void main(String[] args) {
        Application.launch(FXApp.class, args);
    }
}