В этом уроке по JavaFX предложено создать приложение - адресную книгу. Человека, занесённого в эту адресную книгу, можно удалить, предварительно выбрав его в списке, однако нужно как-то адаптировать приложение к случаю, когда пользователь нажал кнопку "удалить" предварительно никого не выбрав.
Мы должны сообщать пользователю о том, что он, перед тем как нажимать кнопку Delete, должен выбрать запись в таблице. (Ещё лучше совсем деактивировать кнопку, чтобы у пользователя не было соблазна сделать что-то не так).
Автор урока абсолютно прав насчёт дезактивации кнопки, но почему-то пошёл именно первым путём. Однако умение менять состояние элементов является необходимым при изучении UI-фреймворков.
Конечно, мы можем прицепить к обработчику события выбора адресата personTable.getSelectionModel().selectedItemProperty().addListener() разблокировщик кнопки, но хотелось бы использовать концепцию привязки свойств и данных, которая имеется не только в веб-приложениях, но и, например, Windows Presentation Foundation и Universal Windows Platform.
<ButtonBar>
<buttons>
<Button text="Add new…" />
<Button text="Edit …" />
<Button
onAction="#handleDeletePerson"
text="Delete"
<!-- Неверный синтаксис -->
disabled="{{selectedIndex < 0}}"
/>
</buttons>
</ButtonBar>
Разумеется, что selectedIndex < 0 разумно вынести в какое-либо отдельное свойство:
@FXML
private disableDeleteButtonFlag = selectedIndex < 0;
Возможно ли это в JavaFX?
Лучше всего, все завязывать на свойствах. Их можно изменять, прослушивать события изменения, связывать
// Свойство кнопки
// BooleanProperty buttonDisableProperеy = button.disableProperty();
BooleanProperty buttonDisableProperеy = new SimpleBooleanProperty(true);
// Наше свойство, где будет хранится условие для отключения кнопки
BooleanProperty myProperty = new SimpleBooleanProperty(false);
System.out.println(String.format("Button disabled:%s, myProp:%s", buttonDisableProperеy.get(), myProperty.get()));
// Связываем два свойства
buttonDisableProperеy.bindBidirectional(myProperty);
/*
//в слушателе событий списка при выборе проверяем выбран ли хоть один элемент
//если не выбран ни один, то значение будет false, деактивироваь кнопку
else myProperty.setValue(selectedElemenеs ==0);
*/
myProperty.setValue(true);
System.out.println("myProperty has been changed");
System.out.println(String.format("Button disabled:%s, myProp:%s", buttonDisableProperеy.get(), myProperty.get()));
Продвижение своими сайтами как стратегия роста и независимости