如何重新启动外部JavaFX程序?即使JavaFX程序以Platform.Exit结束,启动也会阻止此操作

时间:2015-04-21 08:17:01

标签: javafx instance restart launch

在我的MainProject(Java 8)中,我启动了一个JavaFX 8类。

public void startFX() {
    if (isRestartPrintModul() == true) {
        fxMain.init();
    } else {
        setRestartPrintModul(true);
        fxMain.main(new String[] {"ohne"});
    }
}

这是我的FXMain:

        package quality;

    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.event.ActionEvent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
    import javafx.stage.WindowEvent;

    /**
     *
     * @author pu_laib
     */
    public class FXMain extends Application {

        private static Stage primaryStage;

        @Override
        public void init() {
            Platform.setImplicitExit(false);
            if (getPrimaryStage() != null) {
                getPrimaryStage().show();
            } else {
            }
        }

        @Override
        public void start(Stage primaryStage) {
            setPrimaryStage(primaryStage);
            // -> Applicationerror: getPrimaryStage().initModality(Modality.NONE);
            // -> Applicationerror: getPrimaryStage().initModality(Modality.APPLICATION_MODAL);
            Button btn = new Button();
            btn.setText("Say 'Hello World'");
            btn.setOnAction((ActionEvent event) -> {
                System.out.println("Hello World!");
            });

            StackPane root = new StackPane();
            root.getChildren().add(btn);

            Scene scene = new Scene(root, 300, 250);

            getPrimaryStage().setTitle("Hello World!");
            getPrimaryStage().setScene(scene);
            getPrimaryStage().show();
            this.primaryStage.setOnCloseRequest((WindowEvent event) -> {
                Platform.exit();
            });

        }

        public static void main(String[] args) {
            launch(args);
        }

        public Stage getPrimaryStage() {
            return primaryStage;
        }

        public void setPrimaryStage(Stage primaryStage) {
            this.primaryStage = primaryStage;
        }

    }

虽然在我看来它已经关闭,但是无法再次从我的MainProject调用打印模块。

一旦PrintModul模块完成,启动就不记得以前运行过了,对吗?

有什么问题?

谢谢。

1 个答案:

答案 0 :(得分:2)

Application::launch(args)方法的文档声明:

  

不得多次调用它或抛出异常。

所以:

  1. 只需拨打一次电话。
  2. 调用Platform.setImplicitExit(false),以便即使所有阶段都关闭,JavaFX运行时也将继续运行。
  3. 一旦JavaFX应用程序完成其工作,不要调用Platform.exit(),但即使您没有积极使用它,也要让JavaFX平台继续运行。
  4. 不再尝试再次启动应用程序,而是调用应用程序的start()方法(或者您在接受要传递的参数的应用程序上提供的其他公共方法)来运行"运行&# 34;应用程序第二次或更多次(如果需要,可能实例化一个新阶段以传递给start方法)。
  5. 完成所有工作后,请在此时调用Platform.exit()以彻底关闭JavaFX系统。

  6. 您的另一个选择是启动一个新流程,而不是在与MainProject相同的流程中运行JavaFX应用程序,但是,一般来说,我推荐上述方法而不是创建新流程。