Java SWT: применить ключевые события из списка в текстовое поле - PullRequest
2 голосов
/ 12 апреля 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

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

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 использовался для автоматического тестирования графического интерфейса, но здесь он работает для моей цели, поэтому я буду использовать его, если кто-то не может дать мне вескую причину, почему бы и нет ??

0 голосов
/ 12 апреля 2010

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

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

...