JavaFX对象在启动后始终为空
我正在尝试使用JavaFX创建一个应用程序。但是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{
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上研究一些方法,并使用对我和我的编码风格来说最自然的解决方案。