【问题标题】:How do I start again an external JavaFX program? Launch prevents this, even if the JavaFX program ended with Platform.Exit如何重新启动外部 JavaFX 程序?即使 JavaFX 程序以 Platform.Exit 结束,启动也会阻止这种情况
【发布时间】:2015-06-28 06:46:16
【问题描述】:

从我的 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 调用 Print 模块,尽管我认为它已关闭。

一旦 PrintModul 模块完成,launch 不记得它之前运行过,对吧?

怎么了?

谢谢。

【问题讨论】:

    标签: javafx instance restart launch


    【解决方案1】:

    Application::launch(args) 方法的文档指出:

    不能多次调用,否则会抛出异常。

    所以:

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

    您的另一种选择是启动一个新进程,而不是在与 MainProject 相同的进程中运行 JavaFX 应用程序,但总的来说,我建议使用上述方法而不是创建新进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2013-12-27
      • 2022-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      相关资源
      最近更新 更多