Как много раз вызывать класс JAVA FX из другого класса

Я хочу перезапустить приложение java FX из другого класса. Но ошибка выдает «Исключение в потоке «основной» java.lang.IllegalStateException: запуск приложения не должен вызываться более одного раза». Как это решить.

В моем коде я делаю консольную часть и часть FX. Я делаю консольную часть в одном классе, а часть FX в другом классе. Поэтому я просто хочу вызвать часть FX в свой консольный класс (в корпус переключателя). Означает, что я просто хочу вызвать часть FX, когда мне это нужно. это может быть несколько раз. Когда я выбираю опцию FX из меню, она должна вызывать часть 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

    }

}

Пожалуйста, объясните, что вы действительно хотите сделать. Вы не можете вызывать Application.launch() более одного раза, но может быть другой способ выполнить то, что вы хотите сделать.

NomadMaker 10.12.2020 19:38

У вас XY-проблема. Вы не можете использовать launch несколько раз, но в этом нет необходимости. Пожалуйста, объясните, что вы действительно хотите сделать, а не то, что, по вашему мнению, вам нужно сделать.

Polygnome 10.12.2020 19:42

Для будущих вопросов (и при редактировании этого вопроса), пожалуйста, отформатируйте свой код

James_D 10.12.2020 19:53

@NomadMaker в своем коде я делаю консольную часть и часть FX. Я делаю консольную часть в одном классе, а часть FX в другом классе. Поэтому я просто хочу вызвать часть FX в свой консольный класс (в корпус переключателя). Означает, что я просто хочу вызвать часть FX, когда мне это нужно. это может быть несколько раз. Когда я выбираю опцию FX из меню, она должна вызывать часть FX в другом классе. .

Nathindu Dias 10.12.2020 20:06

Объясните это в самом вопросе, а не в комментариях

James_D 10.12.2020 20:07

Просто я хочу много раз вызывать приложение FX из своего меню. Но когда я это делаю, это вызывает исключение. Как этого избежать и как это сделать

Nathindu Dias 10.12.2020 20:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
263
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как предлагается в комментариях, не используйте предопределенный жизненный цикл приложения, определенный классом Application. Просто сделайте пользовательский интерфейс обычным классом 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.

Вы, вероятно, захотите подождать, чтобы снова предложить пользователю, пока окно не будет закрыто. Я использую 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();
        }
    }

}

Другие вопросы по теме