Здравствуйте. Я включил странное поведение отфильтрованного comboBox: когда я удаляю текст, он остается до тех пор, пока я не удалю его во второй раз (но в первый раз и после удаления (ctrl + A), я вижу, чтообъект не выделен, но текст остается).
Мой список со списком удерживает список объектов Статья:
@FXML
private ComboBox<Article> artSortCombo = new ComboBox<>();
В моем поле со списком имеется наблюдаемый список статей:
ObservableList<Article> arts = FXCollections.observableArrayList();
Я добавил конвертер: artSortCombo.setConverter (new StringConverter () {
@Override
public String toString(Article object) {
if(object == null){
System.out.println("toString STRING IS CALLED for NULL");
return null;
}else{
System.out.println("toString STRING IS CALLED for"+object);
return object.getDesignation();
}
}
@Override
public Article fromString(String des) {
System.out.println("FROM STRING IS CALLED for"+des);
return arts.stream()
.filter(item -> String.valueOf(item.getDesignation()).equals(des))
.findFirst().orElse(null);
}
});
Я добавил прослушиватель для загрузки данных в другом комбо:
artSortCombo.getEditor().textProperty().addListener((obs, oldVal, newVal) ->{
artSortCombo.show();
final TextField editor = artSortCombo.getEditor();
final Article art = artSortCombo.getValue();
final Article selected = artSortCombo.getSelectionModel().getSelectedItem();
Platform.runLater(() -> {
System.out.println("chouuf:"+newVal+":OLDVal"+oldVal);
if (selected == null || ! selected.toString().equals(editor.getText())) {
if(selected == null ){
System.out.println("SELECTED is NULL");
}
filteredItems.setPredicate(item -> {
if (item.getDesignation().toUpperCase().startsWith(newVal.toUpperCase())) {
return true;
} else {
return false;
}
});
}else{
System.out.println(selected);
}
});
artSortCombo.setItems(filteredItems);
И я установилфабрика ячеек для отображения только обозначения статьи:
artSortCombo.setCellFactory(new Callback<ListView<Article>,ListCell<Article>>(){
@Override
public ListCell<Article> call(ListView<Article> p) {
final ListCell<Article> cell = new ListCell<Article>(){
@Override
protected void updateItem(Article t, boolean bln) {
super.updateItem(t, bln);
if(t != null){
setText(t.getDesignation() );
}else{
setText(null);
}
}
};
return cell;
}
});
Я слышал о создании Platform.RunLater, но я не думаю, что проблема возникает здесь, может быть, updateItem ..