如何多次从另一个类调用javafx类

cedebl8k  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(302)

我想从另一个类重新运行javafx应用程序。但error抛出“exception in thread”main“java.lang.illegalstateexception:应用程序启动不能被多次调用”。如何解决这个问题。
在我的代码中,我做控制台部分和外汇部分。我在一个类中做控制台部分,在另一个类中做fx部分。所以我只想将fx部分调用到我的控制台类(switch case)。意思是我只想在我需要的时候打电话给fx part。它可以是好几次。当我从菜单中选择fx选项时,我应该在不同的类中调用fx部分。
只是我想从我的菜单上调用外汇应用程序很多次。但当我这么做的时候,它抛出了一个异常。如何避免和怎样做

import javafx.application.Application;
import java.util.Scanner;

public class Test2{
    static  Scanner sc = new Scanner(System.in);

    public static void main(String[] args){
        System.out.print("ENTER THE CHOICE [OPTION NUMBER]: ");
        String option = sc.nextLine();

        switch (option){
            case ("1"):
               test();
                break;

            case("2"):
                Application.launch(Application1.class,args);// I WANT TO RE RUN THIS SEVERAL TIMES
                break ;

            default:
                System.out.println("invalid option. please re enter");
        }

    }

    private static void test() {
    }
}
import javafx.application.Application;
import javafx.stage.Stage;

public class Application1 extends Application{
    @Override
    public void start(Stage primaryStage){

        //SOMETHING FX

    }

}
2w3kk1z5

2w3kk1z51#

正如注解中所建议的,不要使用 Application 班级。只需将ui设置为常规java类:

import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;

public class Ui {

    private final Pane view ;

    public Ui() {
        view = new StackPane();
        Button button = new Button("Close");
        button.setOnAction(e -> button.getScene().getWindow().hide());
        view.getChildren().add(button);
    }

    public Parent getView() {
        return view ;
    }
}

然后“手动”启动javafx平台,并根据需要显示一个窗口。您只需要在这里稍加注意,以确保在fx应用程序线程上执行ui任务。
您可能希望等到窗口关闭后再提示用户。我用一个 CountDownLatch 为了这个。如果您希望提示立即再次出现(这样用户可以同时打开多个窗口),只需省略该逻辑即可。

import java.util.Scanner;
import java.util.concurrent.CountDownLatch;

import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class App {

    public static void main(String[] args) {

        // Start the JavaFX Platform:
        Platform.startup(() -> {});

        // Don't exit JavaFX platform when the last window closes:
        Platform.setImplicitExit(false);

        try (Scanner scanner = new Scanner(System.in)) {
            while (true) {
                System.out.println("Enter choice (1=test, 2=Show UI, 3=Exit):");
                switch(scanner.nextLine()) {
                case "1": 
                    test();
                    break ;
                case "2":
                    showUI();
                    break ;
                case "3":
                    System.exit(0);
                default:
                    System.out.println("Invalid option");
                }
            }
        }
    }

    private static void test() {
        System.out.println("Test");
    }

    private static void showUI() {

        // latch to indicate window has closed:
        CountDownLatch latch = new CountDownLatch(1);

        // create and show new window on FX Application thread:
        Platform.runLater(() -> {
            Stage stage = new Stage();
            Ui ui = new Ui();
            Scene scene = new Scene(ui.getView(), 600, 600);
            stage.setScene(scene);

            // signal latch when window is closed:
            stage.setOnHidden(e -> latch.countDown());

            // show window:
            stage.show();
        });
        try {
            // Wait for latch (i.e. for window to close):
            latch.await();
        } catch (InterruptedException exc) {
            Thread.currentThread().interrupt();
        }
    }

}

相关问题