Inheritance 从类的Main方法启动JavaFX,该类不';扩展应用程序
我无法从类的主方法启动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.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(){
返回数据;
}
}