Как убрать выделение на входе в редактируемом ComboBox

Да, есть более ранние темы и руководства по этому вопросу. И они говорят мне, что либо setValue(null) или же getSelectionModel().clearSelection() должен быть ответ. Но выполнение любого из них дает мне java.lang.IndexOutOfBoundsException,

Что я хочу сделать, так это очищать выделение каждый раз, когда что-то записывается в поле со списком. Это потому, что это вызывает проблемы и выглядит странно, когда вы пишете что-то в поле со списком, а что-то еще остается выбранным во всплывающем окне со списком.

Вот SSCCE:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.HBox;

import javafx.stage.Stage;
import javafx.util.converter.IntegerStringConverter;

public class SSCCE extends Application {

    @Override
    public void start(Stage stage) {

        HBox root = new HBox();

        ComboBox<Integer> cb = new ComboBox<Integer>();
        cb.setEditable(true);
        cb.getItems().addAll(1, 2, 6, 7, 9);
        cb.setConverter(new IntegerStringConverter());

        cb.getEditor().textProperty()
                .addListener((obs, oldValue, newValue) -> {
                    // Using any of these will give me a IndexOutOfBoundsException
                    // Using any of these will give me a IndexOutOfBoundsException
                    //cb.setValue(null);
                    //cb.getSelectionModel().clearSelection();
                    });

        root.getChildren().addAll(cb);

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

1 ответ

Вы работаете с этим значением изменения JavaFX ComboBox, вызывает проблему IndexOutOfBoundsException, которая вызывает IndexOutOfBoundsException, Это своего рода боль.

В любом случае, есть некоторая логическая проблема с вашими попытками: очистка выбранного значения приведет к тому, что редактор обновит свой текст, поэтому даже если это сработает, пользователь не сможет набрать текст. Таким образом, вы хотите проверить, что измененное значение не соответствует введенному. Это, кажется, решает обе проблемы:

    cb.getEditor().textProperty()
            .addListener((obs, oldValue, newValue) -> {
                if (cb.getValue() != null && ! cb.getValue().toString().equals(newValue)) {
                    cb.getSelectionModel().clearSelection();
                }
            });

Возможно, вам придется изменить toString() звоните, в зависимости от того, какой именно конвертер вы используете. В этом случае это будет работать.

Другие вопросы по тегам