Как разрешить использование символа «ПРОБЕЛ» в не редактируемом ComboBox для автозаполнения JavaFX? - PullRequest
0 голосов
/ 10 апреля 2019

Когда я набираю символ SPACE в автозаполнении ComboBox, я могу получить символ пробела, который должен быть принят, кроме кода addEventFilter, который я использую для управления им, умножает и вставляет пробел для каждого символа, ранее набранного до пробела.Вы можете увидеть пример снимка экрана ниже, где 3 пробела были добавлены после 3 символов (ive), затем 4 пробела добавлены после того, как я добавил дополнительный символ (t), каждый после ввода одного пробела, и пробелы появляются только после ввода Iследующий символ (например, 'm').

Adds 3 spaces then adds 4 after next character is typed

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

ComboBoxListViewSkin cbSkin = cbSkin = new ComboBoxListViewSkin(cmb);

// cmb является ComboBox

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

1 Ответ

0 голосов
/ 10 апреля 2019

Мне удалось решить мою проблему. Код события должен быть частью конструктора 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...