为了账号安全,请及时绑定邮箱和手机立即绑定

JavaFX FXML控制器-构造函数VS初始化方法

JavaFX FXML控制器-构造函数VS初始化方法

汪汪一只猫 2019-07-12 10:24:50
JavaFX FXML控制器-构造函数VS初始化方法我的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创建相应控制器的实例(在FXML文件通过fx:controller)首先调用默认构造函数,然后调用initialize方法:public class MainViewController {     public MainViewController() {         System.out.println("first");     }     @FXML     public void initialize() {         System.out.println("second");     }}产出如下:first second那么,为什么initialize方法存在吗?使用构造函数与initialize方法来初始化控制器所需的东西?谢谢你的建议!
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

一句话:首先调用构造函数,然后调用任意构造函数。@FXML然后填充带注释的字段。initialize()叫做。因此构造函数无法访问@FXML引用.fxml文件中定义的组件的字段,而initialize()确实能接触到他们。

引用FXML简介:

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


查看完整回答
反对 回复 2019-07-12
?
莫回无

TA贡献1865条经验 获得超7个赞

这个initialize方法被调用。@FXML已向附加说明的成员进行了注射。假设您有一个要填充数据的表视图:

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. 
    }}


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 1797 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信