Почему не работает ComboBox с условием if-else в JavaFX
Подскажите, пожалуйста, как добавить условие if-else к comboBox в JavaFX.
Хочу сделать второй ComboBox зависимым от выбора в первом ComboBox.
@FXML
private ComboBox<String> Region_Box;
@FXML
private ComboBox<String> State_Box;
// Массив первого списка
private String[] Region_Box_Arr = {"Санкт-Петербург", "Москва", "Алтайский край"};
// Массивы второго списка
private String[] SPB = {"Санкт-Петербург"};
private String[] MSK = {"Москва"};
private String[] AltKr = {"Барнаул", "Бийск", "Рубцовск", "Новоалтайск", "Заринск", "Камень-на-Оби", "Славгород", "Алейск"};
@FXML
void initialize() {}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
Region_Box.getItems().addAll(Region_Box_Arr);
State_Box.getItems().addAll(AltKr); // если комментирую эту строку
// и снимаю комментарий с условия if else , то второй ComboBox не работает
// if (Region_Box.getSelectionModel().equals("Алтайский край"))
// {
// State_Box.getItems().addAll(AltKr);
// }
// else if (Region_Box.getSelectionModel().equals("Санкт-Петербург"))
// {
// State_Box.getItems().addAll(SPB);
// }
// else if (Region_Box.getSelectionModel().equals("Москва"))
// {
// State_Box.getItems().addAll(MSK);
// }
// else State_Box.getItems().addAll("");
}
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
В JavaFX нужно добавлять слушатель ChangeListener для значения в комбобоксе, которое возвращается из метода ComboBoxBase::valueProperty:
@Override
public void initialize(URL location, ResourceBundle resources) {
Region_Box.getItems().addAll(Region_Box_Arr);
Region_Box.valueProperty().addListener((observable, oldVal, newVal) -> {
// очистить связанный комбобокс
State_Box.getItems().clear();
if (newVal == null) {
State_Box.setDisable(true);
} else {
if ("Санкт-Петербург".equals(newVal)) {
State_Box.getItems().addAll(SPB);
} else if ("Москва".equals(newVal)) {
State_Box.getItems().addAll(MSK);
} else { // осталось только значение "Алтайский край"
State_Box.getItems().addAll(AltKr);
}
State_Box.setDisable(false);
}
});
}