【问题标题】:Java FX Issue window manager (Singleton)Java FX 问题窗口管理器(单例)
【发布时间】:2023-03-20 14:57:01
【问题描述】:

我正在尝试做一个窗口管理器,我可以在其中创建一个Stage,并且该阶段是我可以拥有的唯一可能的阶段。这个窗口管理器可以识别我是在登录页面还是在注册页面,或者在任何其他 GUI 中。这个窗口管理器是用单例模式完成的(我需要用它来做......)

这是(丑陋的)登录 GUI(尚未完成,它需要数据库连接等...)

public class LoginGUI {

    static int winID = 1;
    Stage stage;
    WindowManagerGUI winInstance;

    public int getID() {
        return winID;
    }

    public Scene createScene() {
        VBox root = new VBox();
        Scene scene = new Scene(root,500,500);

        Text title = new Text();
        title.setText("Benvenuto in Social Music!");

        TextField text1 = new TextField();
        PasswordField text2 = new PasswordField();

        Button loginBTN = new Button("Accedi");
        Button registerBTN = new Button("Registrati");
        Button recoverDataBTN = new Button("Recupera Dati");

        loginBTN.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent event) {

            }
        });

        registerBTN.setOnAction(new EventHandler<ActionEvent>(){

            public void handle(ActionEvent event) {
                try {
                    WindowManagerGUI.setStage(RegisterGUI.winID);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        recoverDataBTN.setOnAction(new EventHandler<ActionEvent>(){

            public void handle(ActionEvent event) {

            }
        });

        root.setAlignment(Pos.CENTER);
        root.getChildren().addAll(title, text1, text2, loginBTN, registerBTN, recoverDataBTN);
        return scene;
    }

    public void displayInterface() {

        Stage stage = WindowManagerGUI.getStage();
        stage.setScene(createScene());
    }
}

这是注册界面

public class RegisterGUI  {

    Stage stage = WindowManagerGUI.getStage();
    WindowManagerGUI winInstance;
    static int winID = 2;
    Scene scene;

    public int getID() {
        return winID;
    }

    public Scene createScene() {
        VBox root = new VBox();
        this.scene = new Scene(root,500,500);

        Button registerBTN = new Button("Registrati");

        registerBTN.setOnAction(new EventHandler<ActionEvent>(){

            public void handle(ActionEvent event) {

            }
        });

        root.getChildren().addAll(registerBTN);

        scene = new Scene(root,500,500);
        return scene;
    }

    public void displayInterface(Stage stage) {
        stage.setScene(createScene());
        stage.show();
    }
}

这是窗口管理器

public class WindowManagerGUI {

    private static WindowManagerGUI winInstance = null;
    private static Stage stage = null;

    public static WindowManagerGUI getWindowManager() {

        if (WindowManagerGUI.winInstance == null)
            WindowManagerGUI.winInstance = new WindowManagerGUI();
        return winInstance;
    }

    public static Stage getStage() {

        if(WindowManagerGUI.stage == null)
            WindowManagerGUI.stage = new Stage();
        return stage;
    }

    public static void setStage(int ID) {

        switch(ID) {
        case 1:
            LoginGUI login = new LoginGUI();
            login.displayInterface();
        //case 2:
        //  RegisterGUI register = new RegisterGUI();
        //  register.displayInterface(stage);
        }
    }

    public static void main(String[] args){

        WindowManagerGUI.setStage(1);
        WindowManagerGUI.stage.show();
    }
}

现在,我在运行时遇到了这个错误。

线程“主”java.lang.ExceptionInInitializerError 中的异常
javafx.stage.Window.(Window.java:1209) 在
javafx.stage.Stage.(Stage.java:239) 在
javafx.stage.Stage.(Stage.java:227) 在
logic.utils.WindowManagerGUI.getStage(WindowManagerGUI.java:23) 在
logic.boundary.LoginGUI.displayInterface(LoginGUI.java:78) 在
logic.utils.WindowManagerGUI.setStage(WindowManagerGUI.java:33) 在
logic.utils.WindowManagerGUI.main(WindowManagerGUI.java:42) 原因:
java.lang.IllegalStateException:此操作在 仅限事件线程; currentThread = main at
com.sun.glass.ui.Application.checkEventThread(Application.java:443) 在 com.sun.glass.ui.Screen.setEventHandler(Screen.java:285) 在
com.sun.javafx.tk.quantum.QuantumToolkit.setScreenConfigurationListener(QuantumToolkit.java:674) 在 javafx.stage.Screen.(Screen.java:79) ... 7 更多

如何解决这个问题?

【问题讨论】:

    标签: java user-interface javafx


    【解决方案1】:

    WindowManagerGUI.getStage() 静态方法中,您正在实例化一个新的Stage 对象。您正在从主线程调用此方法,但如果在除 JavaFX 应用程序线程之外的任何其他线程中实例化 Stage 对象,您将收到 API 文档 (https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html) 中所述的 IllegalStateException

    在浏览一些在线教程(这里:http://tutorials.jenkov.com/javafx/stage.html,这里:https://www.tutorialspoint.com/javafx/javafx_application.htm)时,似乎需要创建一个扩展 Application 的类并覆盖 start(Stage stage) 方法才能执行JavaFX 应用程序线程。

    我希望这会有所帮助!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多