Я пишу составной компонент, основанный на Combobox
, для выполнения автозаполнения токенов.Основная идея заключается в том, что Combobox
запрашивает модель для элементов, соответствующих текущему тексту, и когда пользователь выбирает что-либо из представленных опций, он добавляется в другой список для представления токенов.В целом это выглядит как входные данные, которые вы, возможно, видели в Facebook, Apple Mail и других местах.
Моя текущая проблема, по-видимому, связана с невозможностью определить, когда пользователь выбрал что-то из списка, каквместо простого перемещения вверх / вниз по списку с помощью клавиш курсора.Combobox#onSelect
, кажется, срабатывает при навигации по списку опций в выпадающем списке, и мне действительно нужен способ получить выбор, когда пользователь выполнил действие "Я хочу это", обычно нажимая Enter с выделениемв раскрывающемся списке или вручную выбирая запись в раскрывающемся списке с помощью мыши.
Лучшее, что я до сих пор придумал, - это мониторинг Combobox#onOpen
, проверка, ложно ли OpenEvent#isOpen
, и затемосмотрите модель для выбора вручную.
Есть ли лучший способ узнать или обнаружить сценарий "Я хочу этот" и отличить его от событий onSelect
, инициированных во время "Я хочу третий"?опцию вниз, так что я буду ВНИЗ, ВНИЗ, ВНИЗ + ВВОД "?
Код ниже в основном то, что я сейчас смотрю
public void onOpen$input(OpenEvent oe) {
logger.info("OpenEvent.isOpen: {}", oe.isOpen());
if (oe.isOpen() == false) {
ListModel model = this.input.getModel();
logger.info("model: {}", model);
if (model instanceof Selectable) {
logger.info("model is Selectable");
Set<?> selection = ((Selectable) model).getSelection();
logger.info("selection: {}", selection);
for (Object selected : selection) {
logger.info("selected: {}", selected);
if (selected instanceof Comboitem) {
logger.info("selected is Comboitem");
selected = ((Comboitem) selected).getValue();
logger.info("selected: {}", selected);
}
addToken(selected);
}
}
}
}