JavaFX对象在启动后始终为空

JavaFX对象在启动后始终为空,java,nullpointerexception,javafx,Java,Nullpointerexception,Javafx,我正在尝试使用JavaFX创建一个应用程序。但是JavaFX应用程序并不是该应用程序的主要入口 我使用的是Main-类、Controller-类(控制一切),以及其他类,如JavaFX应用程序 Main -(calls)-> Controller -(creates)-> JavaFX Application 创建JavaFX应用程序对象后,Controller调用一个方法,因此JavaFX应用程序对象有一个Controller public class Controller{

我正在尝试使用JavaFX创建一个应用程序。但是JavaFX应用程序并不是该应用程序的主要入口

我使用的是
Main
-类、
Controller
-类(控制一切),以及其他类,如
JavaFX应用程序

Main -(calls)-> Controller -(creates)-> JavaFX Application
创建
JavaFX应用程序
对象后,
Controller
调用一个方法,因此
JavaFX应用程序
对象有一个
Controller

public class Controller{
    private MyApplication app;

    public Controller(){

        app = new MyApplication(); //create Application
        app.setController(this); //set Controller Object
        app.startApplication(); //launch the application

    }

}
但是这个对象总是空的,只要我在方法调用之外

Main

public class Main{
    public static void main(String[] args){
        Controller c = new Controller();
    }
}
控制器

public class Controller{
    private MyApplication app;

    public Controller(){

        app = new MyApplication(); //create Application
        app.setController(this); //set Controller Object
        app.startApplication(); //launch the application

    }

}
MyApplication

public class MyApplication extends Application {

    private Stage primaryStage;
    private BorderPane rootLayout;
    private Controller controller;

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        initRootLayout();
    }


    public void setController(Controller con){
        this.controller = con;
    }



    public void startApplication(String... args){
        launch(args);
    }

    public void initRootLayout(){
        System.out.println(controller==null); //returns true. But why?

        try{
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MyApplication.class.getResource("view/RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();

            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);   

            primaryStage.show();
        }
        catch(IOException e){
            e.printStackTrace();
        }

    }
}

为什么
MyApplication
中的
Controller
实例总是空的。它唯一不为null的时间是在调用中
setController

因为JavaFX没有系统托盘访问权限,所以基本上需要一个AWT应用程序在系统托盘中运行。然后,我会考虑使用JavaFX在Swing中嵌入方面,并且基本上使它成为一个Swing /AWT应用程序,使用一些JavaFX嵌入。
public class Controller{
    private MyApplication app;

    public Controller(){

        app = new MyApplication(); //create Application
        app.setController(this); //set Controller Object
        app.startApplication(); //launch the application

    }

}
或者,您可以启动
应用程序
子类中的所有内容,只需在
start
方法中引导AWT部分,设置触发器以在需要时执行JavaFX操作。但这感觉更难看


最后,由于需要将对象传递给JavaFX应用程序,您的方法才真正失败。如果将该对象设置为单例对象是有意义的,那么您可以让JavaFX应用程序检索它,而不是将对象传递给它

我认为您的问题在于您正在引用控制器类的不同实例。在调用
launch(args)
JavaFX之后,它将创建自己的应用程序类的私有实例。调用
setController
时,您正在为类的不同实例设置控制器,而不是JavaFX正在使用的实例。解决此问题的一种方法是将控制器变量及其setter设置为静态。

您可以尝试在setController方法中打印(“1”+此)和在initRootLayout方法中打印(“2”+此),因为只有3种可能为空:1。塞特后来打电话来,2。它又被设置为空,3。您正在MyApplication的另一个对象中工作。检查输出对象是否相同,第一个对象是否在第二个对象之前。我的猜测是,launch(args)创建了一个新的MyApplication@EyeSpy这是正确的。在JavaFX应用程序中,
Application
子类是应用程序的入口点(相当于“传统”Java应用程序中带有
main
方法的类)。因此,这种自定义引导实际上不受支持。@James\u D是否可以使用“普通”的Java Main方法,但不使用应用程序创建JavaFXUI?我想有一个应用程序,主要运行在系统托盘中,但有一些用户界面,可以调用,如果需要。谢谢。我将在Tray+JavaFX online上研究一些方法,并使用对我和我的编码风格来说最自然的解决方案。