Возможна ли в JavaFX привязка наблюдаемого свойства к какому-либо JavaFX-элементу?

88
26 ноября 2020, 03:30

В этом уроке по 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?

Answer 1

Лучше всего, все завязывать на свойствах. Их можно изменять, прослушивать события изменения, связывать

// Свойство кнопки
// 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()));
READ ALSO
Как сделать проверку на процессы Windows [JAVA]

Как сделать проверку на процессы Windows [JAVA]

Как сделать проверку на процессы Windows если процесс VMexe найден тогда программа закрывается если не найден тогда продолжает выполнение

105
Можно ли как сделать, чтобы jar файл запускался на компьютерах без установленного JRE? Может быть как-то внедрить внутрь?

Можно ли как сделать, чтобы jar файл запускался на компьютерах без установленного JRE? Может быть как-то внедрить внутрь?

Есть приложение Javafx, запускается там, разумеется, где есть jreМожно ли как сделать, чтобы jar файл запускался на компьютерах без установленного...

127
Android studio загрузка контента

Android studio загрузка контента

Есть MainActivity и есть menu_list в android studio, надо, что бы в MainActivity по нажатию на кнопку прогружался контент из menu_list в MainActivityПомогите пожалуйста

121
Прошу разъяснения о работе метода [закрыт]

Прошу разъяснения о работе метода [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

101