2010-08-13 2 views
3

для моего приложения Мне нужен пробел, чтобы вызвать функцию, независимую от сфокусированного виджета, везде в приложении, но только если соответствующая вкладка открыта. Я обнаружил, что один может добавить фильтр к дисплею, как это:SWT Global KeyListener Button Задача фокуса

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

Вы можете использовать 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() не существует, ваша кнопка пространства была обнаружена после того, как фильтр, так что вы увидите «Space обнаружен ...», после чего «нажата кнопка ...». Теперь, когда вы установили te.doit = true, вы говорите SWT, чтобы сделать обход пробела (что фактически ничего не делает) вместо того, чтобы запускать прослушиватель клавиш. Вы можете дополнительно проверить te.detail только для того, чтобы мнемонические обходы.

2

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

Путем использования подкласса Button виджетов, игнорирующих пространство.

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

+0

Чтобы уточнить, что я хочу: Возможно, вы знаете инструмент CoolEdit. У них есть «игровой файл» functon на пробеле, и мой шеф-повар также хочет его таким образом. Вы правы, он будет смешивать стандартный способ. : / – InsertNickHere

Смежные вопросы