Java SWT: применить ключевые события из списка в текстовое поле

Я делаю компонент в SWT, который содержит текстовое поле и список. Всякий раз, когда вводится текст, он фильтрует список. Пока что все работает отлично, и я просто пытаюсь добавить несколько приятных юзабилити-функций.

Что я хочу сделать, так это прослушать любые ключевые события в поле «Список», если нажата клавиша «Ввод», я выполняю действие «ОК» (уже сделано), но в противном случае я хочу, чтобы фокус переключился на текстовое поле и получил ключевое событие там срабатывает. По сути, если фокус находится в поле «Список», и пользователь что-то вводит, я хочу, чтобы он автоматически вводился в текстовое поле.

Реагирование на событие keyPressed или keyReleased прекрасно подходит для установки фокуса на текстовое поле, но затем мне нужно каким-то образом повторить keyEvent, чтобы все, что было напечатано, действительно было введено. Есть идеи?


person DaveJohnston    schedule 11.04.2010    source источник


Ответы (2)


Итак, вот что я сделал:

itemList.addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent e) {
        if (e.keyCode == '\r' || e.keyCode == SWT.KEYPAD_CR) {
            okButtonAction();
        } else if (e.keyCode == SWT.ARROW_UP || e.keyCode == SWT.ARROW_DOWN || e.keyCode == SWT.ARROW_LEFT || e.keyCode == SWT.ARROW_RIGHT) {
            super.keyReleased(e);
        } else if (e.character > 0) {
            filterInput.setFocus();
            Event event = new Event();
            event.type = SWT.KeyDown;
            event.keyCode = e.keyCode;
            event.character = e.character;                  
            Display.getCurrent().post(event);
            try {
                Thread.sleep(10);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
            event.type = SWT.KeyUp;
            Display.getCurrent().post(event);
        }
    }
});

Я читал, что метод Display.post был предназначен для автоматического тестирования графического интерфейса, но здесь он работает для моей цели, поэтому я буду использовать его, если только кто-нибудь не сможет дать мне вескую причину, почему бы и нет ??

person DaveJohnston    schedule 12.04.2010

Моя первая идея заключалась в том, что может быть способ повторно запустить ключевое событие (или запустить его копию) в текстовое поле. Но это может не дать желаемого результата, потому что есть некоторые ключевые события, которые вы, вероятно, не хотите переносить из списка в текст, например. нажимая клавиши со стрелками вверх и вниз для навигации по списку.

Таким образом, вы должны решить, какие ключевые события запускают передачу фокуса. Из вашего вопроса я понимаю, что вы реализуете текстовый фильтр, поэтому вы должны ограничить передачу текстовыми символами. Как только вы узнаете введенный символ, вы можете добавить его к тексту фильтра вручную (или вставить в позицию курсора в текстовом поле).

person Christian Semrau    schedule 12.04.2010