Я хочу перезапустить приложение 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
}
}
У вас XY-проблема. Вы не можете использовать launch
несколько раз, но в этом нет необходимости. Пожалуйста, объясните, что вы действительно хотите сделать, а не то, что, по вашему мнению, вам нужно сделать.
Для будущих вопросов (и при редактировании этого вопроса), пожалуйста, отформатируйте свой код
@NomadMaker в своем коде я делаю консольную часть и часть FX. Я делаю консольную часть в одном классе, а часть FX в другом классе. Поэтому я просто хочу вызвать часть FX в свой консольный класс (в корпус переключателя). Означает, что я просто хочу вызвать часть FX, когда мне это нужно. это может быть несколько раз. Когда я выбираю опцию FX из меню, она должна вызывать часть FX в другом классе. .
Объясните это в самом вопросе, а не в комментариях
Просто я хочу много раз вызывать приложение FX из своего меню. Но когда я это делаю, это вызывает исключение. Как этого избежать и как это сделать
Как предлагается в комментариях, не используйте предопределенный жизненный цикл приложения, определенный классом 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();
}
}
}
Пожалуйста, объясните, что вы действительно хотите сделать. Вы не можете вызывать Application.launch() более одного раза, но может быть другой способ выполнить то, что вы хотите сделать.