Проблема с фокусировкой кнопки SWT Global KeyListener - PullRequest
3 голосов
/ 13 августа 2010

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

 getShell().getDisplay().addFilter(SWT.KeyDown, new Listener() {

            public void handleEvent(Event arg0) {
                if( arg0.character == 32 ) { /**SPACE*/
                    if( mainTabs.getSelection().equals(analyseSoundFilesTab)) {
                        soundController.playButtonClickHandler();
                    }
                }
            }

        });

Это прекрасно работает в большинстве случаев, но если я выделю кнопке фокус с помощью «вкладки» или «сдвига вкладки», это довольно странно - пробел активирует «нажатие кнопки», как если бы вы щелкнули кнопка с мышью. Я немного застрял сейчас, я не знаю, как этого избежать ... Для кнопок я реализовал SelectionListener.

С уважением.

Ответы [ 2 ]

2 голосов
/ 14 августа 2010

Вы можете использовать TraverseListener и отключить обнаружение события нажатия, используя поле doin. Вот пример кода:

display.addFilter(SWT.KeyDown, new Listener() {
    public void handleEvent(Event e) {
        if (e.character == 32) {
            System.out.printf("Space detected %s\n", e);
        }
    }
});

Button b1 = new Button(shell, SWT.PUSH);
b1.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent se) {
        System.out.printf("Button pressed %s\n", se);
    }
});

b1.addTraverseListener(new TraverseListener() {
    @Override
    public void keyTraversed(TraverseEvent te) {
        System.out.printf("Traverse detected %s\n", te);
        te.doit = true;
    }
});

Если addTraverseListener() не существует, ваша кнопка пробела была обнаружена после фильтра, поэтому вы увидите «Пробел обнаружен ...» и после этого «Кнопка нажата ...». Теперь, когда вы установили te.doit = true, вы говорите SWT сделать обход пробела (который на самом деле ничего не делает) вместо запуска ключевого слушателя. При желании вы можете проверить te.detail, чтобы предотвратить только мнемонические обходы.

2 голосов
/ 13 августа 2010

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

Выход из ситуации будетиспользовать подклассы Button виджетов, которые игнорируют пробел.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...