Когда я набираю символ ПРОБЕЛ в поле со списком автозаполнения, я могу получить символ пробела, который будет принят, за исключением того, что код addEventFilter, который я использую для управления им, умножает и вставляет пробел для каждого символа, ранее введенного перед пробелом. Вы можете увидеть пример снимка экрана ниже, где 3 пробела были добавлены после 3 символов (пять), затем 4 пробела добавлены после того, как я добавил дополнительный символ (t), каждый после ввода одного ПРОБЕЛа, и пробелы появляются только после того, как я набрал следующий символ (например, 'm').
Я пробовал это с автозаполнением ContolsFX, но он не может обрабатывать нередактируемый ComboBox - и не нашел ничего обратного. В онлайн-кейсах, которые я исследовал, было рекомендовано использовать всплывающую обложку ComboBox — addEventFilter для управления событием символа ПРОБЕЛ. Почти во всех случаях нужно было использовать Consumer() и предотвращать выбор и закрытие пробела. Я не нашел ничего, что строго разрешало бы ввод пробела. Я пытался добавить ПРОБЕЛ в код до и после этого кода события, но addEventFilter event.consume() удалит его. Символ ПРОБЕЛ появится только в том случае, если я управляю его добавлением в методе addEventFilter. Я пробовал разные события, такие как KeyEvent.ANY, KeyEvent.KEY_TYPED и KeyEvent.KEY_RELEASE, и читал документацию по KeyEvent, но только KeyEvent.KEY_PRESSED, похоже, разрешает символ SPACE, он просто умножает количество пробелов и не не вставлять до следующего текстового символа.
ComboBoxListViewSkin cbSkin = cbSkin = new ComboBoxListViewSkin(cmb);
// cmb — это поле со списком
cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
if (event.getCode() == KeyCode.SPACE){
filter += " ";
event.consume();}
});
Я смог решить свою проблему. Код события должен быть частью конструктора 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();}
});
}