2014-12-05 2 views
0

Я хотел бы иметь KeyListener на JComponent в Swing, который реагирует на нажатие и отключение клавиши ctrl. Это наивное, но неоптимальное решение (оно реагирует на каждом нажатии клавиши, а не только на прессе/релиз Ctrl ключа:KeyListener на JComponent для клавиши Ctrl

new KeyAdapater() { 
    public void keyPressed(KeyEvent e) { 
    if (e.isControlDown()) { 
     //do something 
    } 
    } 
    public void keyReleased(KeyEvent e) { 
    if (!e.isControlDown()) { 
     //do something other 
    } 
    } 
} 

Что такое лучший подход срабатывает только, когда Ctrl ключа сама нажата или отпущена

ответ

2

Попробуйте это:

public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_CONTROL) { 
     //do something 
    } 
} 
+0

ARGH! Я использовал такой подход в прошлом, но просто забыл. Благодаря! Это именно то, что я искал. – radlan

+1

@radlan 'Что такое лучший подход только к триггеру, когда сам клавиша ctrl нажата или выпущена?» Вопрос задал вопрос, какой подход лучше. Ну, лучший подход - использовать ключевые привязки. Swing был разработан для использования с Key Bindings. «Я использовал такой подход в прошлом,« нет необходимости использовать этот подход в будущем, теперь, когда вы знаете «лучший подход». – camickr

4

ИМХО используя Key bindings более гибкий и надежный подход что приводит к этим преимуществам:

  • Отделяет действие от ключевых ударов.
  • Существуют различные условия, чтобы вызвать такие действия: WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • Мы можем воспользоваться этими условиями приложить различные действия различных компонентов, опираясь на политику старшинства основе (см пример представлен here).

Сказав, что мы можем создать KeyStrokes нравится следующим образом:

KeyStroke controlKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, 0); 

И мы даже можем указать, что нажатие клавиши будет срабатывать на ключевом событии выпуска:

KeyStroke controlReleasedKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, 0, true); 

Примечание:0 означает, что модификаторы и true - это флаг, указывающий на то, что e ключевой ход представляет собой событие релиза ключа. См. the API для получения более подробной информации.

Смотрите также эту тему: Key bindings vs. key listeners in Java и How to Use Key Bindings учебник

+0

Спасибо, я тоже это рассмотрю. – radlan