for (var i = 0; i < 3; i++) {
createfunc(i)();
}
function createfunc(i) {
return function(){console.log("My value: " + i);};
}
Метод 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.
}
}
В нескольких словах: сначала вызывается конструктор, затем заполняются любые @FXML
аннотированные поля, затем вызывается initialize()
. Поэтому конструктор НЕ имеет доступа к полям @FXML
, относящимся к компонентам, определенным в файле .fxml, тогда как initialize()
имеет к ним доступ.
Цитирование из Введение в FXML :
[...] контроллер может определить метод initialize (), который будет вызываться один раз на контроллере реализации, когда содержимое его связанного документа будет полностью загружено [. ..] Это позволяет классу-исполнителю выполнять любую необходимую пост-обработку содержимого.
blockquote>