#combobox #autocomplete #javafx-8
#выпадающий список #автозаполнение #javafx-8
Вопрос:
Когда я ввожу ПРОБЕЛ в выпадающем списке автозаполнения, я могу заставить символ пробела быть принятым, за исключением кода addEventFilter, который я использую для управления им, умножается и вставляет пробел для каждого символа, ранее введенного до пробела. Вы можете увидеть пример скриншота ниже, где после 3 символов (ive) было добавлено 3 пробела, затем добавлено 4 пробела после добавления дополнительного символа (t), каждый после ввода одного ПРОБЕЛА, а пробелы появляются только после ввода следующего символа (например, ‘m’).
Я пробовал это с автозаполнением 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();}
});
}