繁体   English   中英

Java FX 问题窗口管理器(单例)

[英]Java FX Issue window manager (Singleton)

我正在尝试做一个窗口管理器,我可以在其中创建一个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());
    }
}

这是注册 GUI

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();
    }
}

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

线程“main”中的异常 java.lang.ExceptionInInitializerError at
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 = 主要在
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 更多

如何解决这个问题?

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

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

我希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM