Когда FXML анализируется, FXMLLoader
создает TabPane
, создает Tab
s и добавляет их к TabPane
. При добавлении первой вкладки она становится выделенной, поэтому ее состояние selected
изменяется и вызывается ее обработчик onSelectionChanged
. Поскольку TabPane
появляется в файле FXML перед текстовым полем searchEntry
, это происходит до инициализации searchEntry
, и, следовательно, ваш метод switchTabs()
вызывает исключение нулевого указателя.
Вы можете просто добавить нулевую проверку в метод обработчика:
@FXML
public void switchTabs() {
if (searchEntry == null) {
return ;
}
int selectedTab = tabPane.getSelectionModel().getSelectedIndex();
switch (selectedTab){
case 0:
searchEntry.setPromptText("Enter booking ID");
break;
case 1:
searchEntry.setPromptText("Enter event name");
break;
case 2:
searchEntry.setPromptText("Enter list ID");
break;
}
}
Добавление этого кода только для обработки особого случая, который происходит только во время загрузки, немного уродливо. Я бы предпочел просто зарегистрировать обработчик в методе initalize()
. Удалите все обработчики onSelectionChanged
со вкладок в файле FXML и добавьте следующее к методу initialize()
вашего контроллера:
@Override
public void initialize(URL location, ResourceBundle resources) {
tabPane.getSelectionModel().selectedIndexProperty().addListener(
(obs, oldIndex, newIndex) -> switchTabs());
// initialize prompt text for initially-selected tab:
switchTabs();
// searchEntry.setPromptText("");
}