JavaFX FXML控制器 – 构造函数与初始化方法

我的Application类看起来像这样:

 public class Test extends Application { private static Logger logger = LogManager.getRootLogger(); @Override public void start(Stage primaryStage) throws Exception { String resourcePath = "/resources/fxml/MainView.fxml"; URL location = getClass().getResource(resourcePath); FXMLLoader fxmlLoader = new FXMLLoader(location); Scene scene = new Scene(fxmlLoader.load(), 500, 500); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

FXMLLoader通过首先调用默认的构造函数和initialize方法FXMLLoader创build相应控制器的实例(通过fx:controllerFXML文件中给出):

 public class MainViewController { public MainViewController() { System.out.println("first"); } @FXML public void initialize() { System.out.println("second"); } } 

输出是:

 first second 

那么,为什么initialize方法存在? 使用构造函数或initialize方法初始化控制器所需的东西有什么区别?

感谢您的build议!

简而言之:首先调用构造函数,然后填充任何@FXML注释字段,然后调用initialize() 。 所以构造函数不能访问指向.fxml文件中定义的组件的@FXML字段,而initialize()却可以访问它们。

从FXML简介中引用:

控制器可以定义一个initialize()方法,当相关文档的内容已经完全加载时,这个方法将在实现控制器上调用一次[…]。这允许实现类执行任何必要的post对内容进行处理。

在注入所有@FXML注释成员之后调用initialize方法。 假设你有一个你想用数据填充的表格视图:

 class MyController { @FXML TableView<MyModel> tableView; public MyController() { tableView.getItems().addAll(getDataFromSource()); // results in NullPointerException, as tableView is null at this point. } @FXML public void initialize() { tableView.getItems().addAll(getDataFromSource()); // Perfectly Ok here, as FXMLLoader already populated all @FXML annotated members. } }