JavaFX FXML构造函数和初始化方法

时间:2017-10-14 15:50:01

标签: javafx

我最近刚接触javafx,我总是在控制器类的构造函数中加载fxml,然后直接使用组件。

我刚刚了解到只能在调用initialize之前访问组件。

但即使我在构造函数中使用组件也没有错误发生,这很奇怪。 我的代码看起来像这样。

@Override
public void start(Stage primaryStage){

    new MainController(primaryStage,this);
}


public class MainController{
    @FXML
    private ListView<HistoryPlay> historyLV;
public MainController(Stage primaryStage, Main main) {

        initFxml();
        initView();


}
private void initFxml() {
        FXMLLoader loader=new FXMLLoader();
        loader.setController(this);
        try {
            loader.setLocation(new File("fxml\\Main.fxml").toURL());
            loader.load();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


    }

private void initView() {

        historyLV.setCellFactory(param -> new HistoryListCell(MainController.this,main));
        historyLV.setItems(main.getHistoryManager().getHistoryList());


    }

}

没有出现零点异常。为什么?

1 个答案:

答案 0 :(得分:1)

所有public字段和非public字段以及@FXML注释的名称与fx:id匹配的字段由您指定的控制器中的FXMLLoader初始化在调用FXMLLoader.setController(Object)方法时使用{class {使用FXMLLoader.load()}。

因此,可以假设(因为它未包含在您的问题中)您的FXML文件中ListView Main.fxml fx:id="historyLV"。这就是为什么你没有得到NullPointerException