【发布时间】:2014-12-01 18:59:17
【问题描述】:
我正在尝试使用 JavaFX 创建一个应用程序。但是JavaFX Application并不是Application的主入口。
我正在使用Main-Class、Controller-Class(控制一切)和其他类,如 JavaFX Application
Main -(calls)-> Controller -(creates)-> JavaFX Application
JavaFX Application对象创建后,Controller调用了一个方法,所以JavaFX Application对象有Controller的实例
但只要我不在方法调用范围内,这个对象就始终为空。
Main
public class Main{
public static void main(String[] args){
Controller c = new Controller();
}
}
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 Instance 始终为空。唯一不为空的时间是在调用setController
【问题讨论】:
-
能否尝试在 setController 方法中打印 ("1" + this),在 initRootLayout 方法中打印 ("2" + this),因为它为 null 的可能性只有 3 种:1。 setter 稍后调用,2. 它在某个地方再次设置为 null,3. 您正在使用 MyApplication 的另一个对象。检查输出对象是否相同,第一个在第二个之前。
-
我的猜测是,launch(args) 会创建一个新的 MyApplication
-
@EyeSpy 没错。在 JavaFX 应用程序中,
Application子类是应用程序的入口点(相当于“传统”Java 应用程序中具有main方法的类)。所以这种自定义引导并不真正支持。 -
@James_D 是否可以有一个“普通”的 Java Main 方法,但是在不使用应用程序的情况下创建一个 JavaFX UI?我想要一个应用程序,主要在系统托盘中运行,但有一些 UI 可以在需要时调用。
标签: java nullpointerexception javafx