Как мне разрешить символ «ПРОБЕЛ» в автозаполняемом выпадающем списке JavaFX, который нельзя редактировать?

#combobox #autocomplete #javafx-8

#выпадающий список #автозаполнение #javafx-8

Вопрос:

Когда я ввожу ПРОБЕЛ в выпадающем списке автозаполнения, я могу заставить символ пробела быть принятым, за исключением кода addEventFilter, который я использую для управления им, умножается и вставляет пробел для каждого символа, ранее введенного до пробела. Вы можете увидеть пример скриншота ниже, где после 3 символов (ive) было добавлено 3 пробела, затем добавлено 4 пробела после добавления дополнительного символа (t), каждый после ввода одного ПРОБЕЛА, а пробелы появляются только после ввода следующего символа (например, ‘m’).

Добавляет 3 пробела, затем добавляет 4 после ввода следующего символа

Я пробовал это с автозаполнением ContolsFX, но он не может обработать редактируемый выпадающий список — и не смог найти ничего противоположного. В онлайн-кейсах, которые я изучаю, было рекомендовано использовать всплывающий скин выпадающего списка — addEventFilter для управления событием символа пробела. Почти во всех случаях это было для использования () и предотвращения выделения и закрытия пробела. Я не нашел ничего, что строго разрешало вводить пробел. Я пытался добавить ПРОБЕЛ в код до и после этого кода события, но событие addEventFilter.consume() удалит его. Символ ПРОБЕЛА появится только в том случае, если я управляю его добавлением в методе addEventFilter. Я пробовал разные события, такие как KeyEvent.ЛЮБОЕ, ключевое событие.KEY_TYPED и KeyEvent.KEY_RELEASE и прочитайте документацию по KeyEvent, но только KeyEvent.Похоже, что KEY_PRESSED разрешает символ ПРОБЕЛА, он просто умножает количество пробелов и не вставляется до следующего текстового символа.

 ComboBoxListViewSkin cbSkin = cbSkin = new ComboBoxListViewSkin(cmb);
  

// cmb — это выпадающий список

     cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
        if(event.getCode() == KeyCode.SPACE){
            filter  = " ";
            event.consume();}
    });
  

Ответ №1:

Я смог решить свою проблему. Код события должен был быть частью конструктора ComboBoxAutoComplete, а не частью события onKeyPressed.

 private ComboBoxListViewSkin cbSkin;

public ComboBoxAutoComplete(ComboBox<T> cmb) {
    this.cmb = cmb;
    cbSkin = new ComboBoxListViewSkin(cmb);
    originalItems = FXCollections.observableArrayList(cmb.getItems());
    cmb.setOnKeyPressed(this::handleOnKeyPressed);
    cmb.setOnHidden(this::handleOnHiding);
    cmb.setSkin(cbSkin);
    cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
        if(event.getCode() == KeyCode.SPACE){
            filter  = " ";
            event.consume();}
    });
}
  

addFilterEvent_in_Constructor