我最近刚接触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());
}
}
没有出现零点异常。为什么?
答案 0 :(得分:1)
所有public
字段和非public
字段以及@FXML
注释的名称与fx:id
匹配的字段由您指定的控制器中的FXMLLoader
初始化在调用FXMLLoader.setController(Object)
方法时使用{class {使用FXMLLoader.load()
}。
因此,可以假设(因为它未包含在您的问题中)您的FXML文件中ListView
Main.fxml
fx:id="historyLV"
。这就是为什么你没有得到NullPointerException
。