[英]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.