java - 过滤后的 ComboBox 中的文本编辑器不显示文本
问题描述
我将 Jonathan Stenbackas Answer ( JavaFX - Filtered ComboBox ) 改编为带有 Jooq Record Bean 的 ComboBox,使用自定义 ListCell/ButtonCell 显示其中一个 Beans 字段。过滤工作正常,但我无法让编辑器显示所选项目字段的文本。
我在组合框的选择中添加了一个侦听器,并让它打印出编辑器文本。所以我得到了 bean 的 toString(),但是 Editor 是空的。当我使用侦听器以编程方式设置文本时,以编程方式设置的文本被打印出来,但编辑器不显示它。我还尝试了一个 JavaFX bean 进行测试,结果相同。任何建议将不胜感激。
//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());
}
}
解决方案
我找到了解决方案:我扩展了 Combobox。也许这可能对某人有用:
import javafx.application.Platform;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import org.jooq.impl.TableRecordImpl;
public class FilterComboBox extends ComboBox {
private ObservableList ol;
private ObservableList items;
private FilteredList filteredItems;
private FilteredList filteredOl;
private String field;
private Property selectedBeanProperty = new SimpleObjectProperty();
public FilterComboBox(){
}
public FilterComboBox(ObservableList ol, String field) {
populate(ol,field);
}
public Property selectedBeanProperty() {
return selectedBeanProperty;
}
public void setSelectedBeanProperty(T selectedBeanProperty) {
this.selectedBeanProperty.setValue(selectedBeanProperty);
}
private ObservableList createItems(ObservableList ol, String field) {
this.items = FXCollections.observableArrayList();
for (T t : ol) items.add(t.get(field).toString());
return items;
}
public void populate(ObservableList ol, String field){
this.field=field;
this.ol = ol;
this.items = createItems(this.ol, field);
this.filteredItems = new FilteredList(items, p -> true);
this.filteredOl= new FilteredList(ol, p->true);
this.setEditable(true);
this.setItems(filteredItems);
TextField editor = this.getEditor();
editor.textProperty().addListener((obs, oldValue, newValue) -> {
final String selected = this.getSelectionModel().getSelectedItem();
Platform.runLater(() -> {
if (selected == null || !selected.equals(editor.getText())) {
filteredItems.setPredicate(item -> {
if (item.toLowerCase().contains(newValue.toLowerCase())) {
return true;
} else {
return false;
}
});
}
});
});
this.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> {
if (newValue != null &&!newValue.isEmpty() ) {
setSelectedBeanProperty(this.ol.get(getOlIndex(newValue, field)));
}
});
}
public Integer getOlIndex(String s, String field){
for (T t : ol)
if(t.get(field).toString().equals(s)){
return ol.indexOf(t);
}
return -1;
}
}
推荐阅读
- c++ - 用 in_addr 结构中的点显示 IP 地址
- hibernate - PrimaryKeyJoinColumn 中的列名和反列名
- android - 如何在 Android 中获取特定语言的语言名称?
- jquery - 如何滑动内容?
- python - 图形轴在 Python 中未正确显示
- android - Kotlin Android Studio - onClickListener 使用应用插件:'kotlin-android-extensions'
- mongodb - 嵌套数组中的 MongoDB addToSet
- python - 使用 encode('utf-8') 打印 Python 字符串给出 Execption
- elasticsearch - NEST 如何使用注释设置完成建议上下文
- javascript - 为什么我收到的 websocket 的频率有时为零?