从不扩展Application的类的Main方法启动JavaFX

Reu*_*aer 12 inheritance javafx javafx-2

我有问题从没有扩展的类的Main方法启动JavaFX应用程序 javafx.application.Application

在我的应用程序中MainApp.java,应该启动其中的override方法start(),该方法MainUIController.java扩展Applciation

当我从MainUIController.java一切工作开始Main方法工作正常.

MainApp.java

public class MainApp {

    public static void main(String[] args) {
        PersonJDBCTemplate jdbc = connect();
        MainUIController mUIc = new MainUIController(jdbc);
        mUIc.start(new Stage());

    }

    public static PersonJDBCTemplate connect() {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "Beans.xml");
        PersonJDBCTemplate personJDBCTemplate = (PersonJDBCTemplate) context
                .getBean("personJDBCTemplate");
        return personJDBCTemplate;
    }
}
Run Code Online (Sandbox Code Playgroud)

MainUIController.java

public class MainUIController extends Application {

    private Stage stage;
    // private User loggedUser;
    private final double MINIMUM_WINDOW_WIDTH = 800.0;
    private final double MINIMUM_WINDOW_HEIGHT = 570.0;
    private String version = "0.6";
    private PersonJDBCTemplate jdbc;

    public MainUIController(PersonJDBCTemplate jdbc) {
        this.jdbc = jdbc;

    }

    @Override
    public void start(Stage primaryStage) {
        try {
            stage = primaryStage;
            stage.setTitle("Sharp");
            stage.setMinWidth(MINIMUM_WINDOW_WIDTH);
            stage.setMinHeight(MINIMUM_WINDOW_HEIGHT);
            stage.setResizable(false);
            gotoLogin();
            primaryStage.show();
        } catch (Exception ex) {
            Logger.getLogger(MainUIController.class.getName()).log(
                    Level.SEVERE, null, ex);
        }
    }

    public void gotoLogin() {
        try {
            LoginController login = (LoginController) replaceSceneContent("/fxml/Login.fxml");
            login.setApp(this);
        } catch (Exception ex) {
            Logger.getLogger(MainUIController.class.getName()).log(
                    Level.SEVERE, null, ex);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行MainApp后,我收到以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
at javafx.stage.Window.<init>(Window.java:1110)
at javafx.stage.Stage.<init>(Stage.java:236)
at javafx.stage.Stage.<init>(Stage.java:224)
at ch.kit.sharp.main.MainApp.main(MainApp.java:15)
Caused by: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = main
at com.sun.glass.ui.Application.checkEventThread(Application.java:445)
at com.sun.glass.ui.Screen.setEventHandler(Screen.java:245)
at com.sun.javafx.tk.quantum.QuantumToolkit.setScreenConfigurationListener(QuantumToolkit.java:600)
at javafx.stage.Screen.<clinit>(Screen.java:80)
... 4 more
Run Code Online (Sandbox Code Playgroud)

Ita*_*iha 22

除了Nejinx所说的,你不能直接调用你的start(),总是调用launch(),因为它设置了JavaFX环境,包括creation of stage并将calls start()阶段作为参数传递给它.

文档有一个特别说明这一点的说明

注意:此方法在JavaFX应用程序线程上调用

launch()可以从所谓的任何一类,考虑到如果直接没有扩展类javafx.application.Application,则必须通过扩展它的类作为参数传递给启动方法.

例如,假设您有一个JavaFXMain扩展的类Application

class JavaFXMain extends Application {...}
Run Code Online (Sandbox Code Playgroud)

您可以使用任何其他类来启动JavaFX应用程序.

class Main {
   ...
   public void someMethod() {
      ...
      JavaFXMain.launch(JavaFXMain.class); // Launch the JavaFX application
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你可以在主要方法中尝试这样的事情MainApp:

// You may remove args if you don't intend to pass any arguments
MainUIController.launch(MainUIController.class, args) 
Run Code Online (Sandbox Code Playgroud)