Inheritance 从类的Main方法启动JavaFX,该类不';扩展应用程序

Inheritance 从类的Main方法启动JavaFX,该类不';扩展应用程序,inheritance,javafx,javafx-2,Inheritance,Javafx,Javafx 2,我无法从类的主方法启动JavaFX应用程序,该类不扩展JavaFX.Application.Application class JavaFXMain extends Application {...} 在我的应用程序中有MainApp.java,它应该在MainApp.java中启动覆盖的方法start(),该方法扩展了application class JavaFXMain extends Application {...} 当我从Main uicontroller.java启动Main方

我无法从类的主方法启动JavaFX应用程序,该类不扩展
JavaFX.Application.Application

class JavaFXMain extends Application {...}
在我的应用程序中有
MainApp.java
,它应该在
MainApp.java
中启动覆盖的方法
start()
,该方法扩展了
application

class JavaFXMain extends Application {...}
当我从
Main uicontroller.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;
    }
}
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);
        }
    }
}
MainUIController.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;
    }
}
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);
        }
    }
}
运行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
线程“main”java.lang.ExceptionInInitializeError中的异常 在javafx.stage.Window。(Window.java:1110) 在javafx.stage.stage.(stage.java:236) 在javafx.stage.stage.(stage.java:224) 位于ch.kit.sharp.main.MainApp.main(MainApp.java:15) 导致原因:java.lang.IllegalStateException:仅允许在事件线程上执行此操作;currentThread=main 位于com.sun.glass.ui.Application.checkEventThread(Application.java:445) 位于com.sun.glass.ui.Screen.setEventHandler(Screen.java:245) 在com.sun.javafx.tk.quantum.QuantumToolkit.setScreenConconfigurationListener上(QuantumToolkit.java:600) 在javafx.stage.Screen.(Screen.java:80) ... 4更多
您需要初始化JavaFX环境,不能在启动(args)之外创建新阶段;在扩展应用程序的类上首先被调用。

除了Nejinx所说的,您不能直接调用您的
start()
,始终调用,因为它设置了JavaFX环境,包括
阶段的创建
调用start()
将阶段作为参数传递给它

class Main {
   ...
   public void someMethod() {
      ...
      JavaFXMain.launch(JavaFXMain.class); // Launch the JavaFX application
      ...
   }
}
有特别说明这一点的便条吗

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

可以从任何类调用,考虑到如果该类未直接扩展,则必须将扩展该类的类作为参数传递给启动方法。

例如,考虑有一个类<代码> javaFXMeX,它扩展了<代码>应用程序< /C> < /P>

class JavaFXMain extends Application {...}
您可以使用任何其他类来启动JavaFX应用程序

class Main {
   ...
   public void someMethod() {
      ...
      JavaFXMain.launch(JavaFXMain.class); // Launch the JavaFX application
      ...
   }
}
在您的情况下,您可以在
MainApp
的主方法中尝试以下操作:

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

这非常有帮助,但将FX应用程序保留为一个独立的应用程序。您无法从非FX代码传入对象,并且未向您提供创建的应用程序实例的句柄

我提出了一个我并不热衷的解决方案,但它确实允许传入参数

package hacks;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 * Created by WorkDay on 8/11/16.<br>
 * <br>
 * HelloWorld is a javaFX app that needs parameters that are real objects
 */

class AppParameterLauncher {
    public static void main(String[] args) {
        HelloWorld.launch(new ObjectThatContainsData("brave"), new ObjectThatContainsData("new"));
    }
}


public class HelloWorld extends Application {

    private static ObjectThatContainsData staticData1 = null;
    private static ObjectThatContainsData staticData2 = null;


    public static void launch(ObjectThatContainsData data1, ObjectThatContainsData data2) {
        HelloWorld.staticData1 = data1;
        HelloWorld.staticData2 = data2;
        Application.launch(HelloWorld.class);
    }

    private final ObjectThatContainsData data1 = HelloWorld.staticData1;
    private final ObjectThatContainsData data2 = HelloWorld.staticData2;

    @Override
    public void start(Stage primaryStage) {

        String Text = "Hello "+data1+" "+data2+" World!";
        primaryStage.setTitle(Text);
        Button btn = new Button();
        btn.setText("Say '"+Text+"'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.setX(0);
        primaryStage.setY(0);
        primaryStage.show();
    }
}

class ObjectThatContainsData {
    public final String data;

    ObjectThatContainsData(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return data;
    }
}
包黑客;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
/**
*由WorkDay于2016年8月11日创建。
*
*HelloWorld是一个javaFX应用程序,需要真实对象的参数 */ 类AppParameterLauncher{ 公共静态void main(字符串[]args){ HelloWorld.launch(新对象包含数据(“勇敢”),新对象包含数据(“新”); } } 公共类HelloWorld扩展了应用程序{ 包含数据staticData1的私有静态对象=null; 包含数据staticData2的私有静态对象=null; 公共静态无效启动(包含数据1的对象,包含数据2的对象){ HelloWorld.staticData1=data1; HelloWorld.staticData2=data2; Application.launch(HelloWorld.class); } 包含数据1的私有最终对象=HelloWorld.staticData1; 包含数据2的私有最终对象=HelloWorld.staticData2; @凌驾 公共无效开始(阶段primaryStage){ String Text=“Hello”+data1+“”+data2+“World!”; 初级阶段。设置标题(文本); 按钮btn=新按钮(); btn.setText(“说“'+Text+””); btn.setOnAction(新的EventHandler(){ @凌驾 公共无效句柄(ActionEvent事件){ System.out.println(“你好,世界!”); } }); StackPane root=新的StackPane(); root.getChildren().add(btn); 原始阶段。设置场景(新场景(根,300250)); 初生阶段setX(0); 初生阶段:setY(0); primaryStage.show(); } } 包含数据的类对象{ 公共最终字符串数据; 包含数据(字符串数据)的对象{ 这个数据=数据; } @凌驾 公共字符串toString(){ 返回数据; } }