Странное поведение отфильтрованного Combobox в javafx - PullRequest
0 голосов
/ 28 сентября 2019

Здравствуйте. Я включил странное поведение отфильтрованного 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 ..

...