Я адаптировал Jonathan Stenbackas Answer ( JavaFX - Filtered ComboBox ) к ComboBox с компонентом Jooq Record Bean, отображая одно из полей Beans с помощью пользовательского ListCell / ButtonCell.
Фильтрация работает нормально, но я не могу заставить Редактор показать текст поля выбранных элементов.
Я добавил слушателя в список выпадающих списков и позволил ему печатать текстовые редакторы. Итак, я получил toString () компонента, но редактор пуст. Когда я использую слушатель для программной установки текста, программно установленный текст распечатывается, но редактор не показывает его.
Я также попробовал bean-компонент JavaFX для тестирования с тем же результатом.
Любая рекомендация будет высоко оценена.
//retrieving data from database
ObservableList<MyRecord> items = applicationContext.getFetchData().fetchOList();
//wrapping in a FilteredList
FilteredList<MyRecord> filteredItems = new FilteredList<>(items, p -> true);
ComboBox<MyRecord> cb = new ComboBox<>(filteredItems);
cb.setEditable(true);
cb.setCellFactory(c_ -> new NamenCell());
cb.setButtonCell(new NamenCell());
TextField editor = cb.getEditor();
editor.textProperty().addListener((obs, oldValue, newValue) -> {
final MyRecord selected = cb.getSelectionModel().getSelectedItem();
Platform.runLater(() -> {
if (selected == null || !selected.getSurname().equals(editor.getText())) {
filteredItems.setPredicate(item -> {
if (item.getSurname().toLowerCase().contains(newValue.toLowerCase())) {
return true;
} else {
return false;
}
});
}
});
});
cb.getSelectionModel().selectedItemProperty().addListener(
(ob, oldValue, newValue) -> {
if (newValue != null) {
cb.getEditor().setText(newValue.getSurname());
System.out.println(cb.getEditor().getText());
}
});
//The Cell class:
public class NamenCell extends ListCell<MyRecord> {
public NamenCell() { }
@Override
protected void updateItem(MyRecord item, boolean empty) {
super.updateItem(item, empty);
setText(item == null ? "" : item.getSurname());
}
}