2012-05-15 2 views
3

Что является точкой привязки клавиш, если вы могли бы просто сделать:Разница между комбинации клавиш и KeyListeners

// Imports 

public void Test { 
    JButton button1; 
    JButton button2; 
    JButton button3; 
    ... 

    Test() { 
     button1 = new JButton(); 
     button1.addKeyListener(this); 

     button2 = new JButton(); 
     button2.addKeyListener(this); 

     button3 = new JButton(); 
     button3.addKeyListener(this); 

     ... 
    } 

    public void keyPressed(KeyEvent e) { 
    } 

    public void keyReleased(KeyEvent e) { 
    } 

    public void keyTyped(KeyEvent e) { 

     Object src = e.getSource(); 

     if (src == button1) { 
      ... 
     } 

     else if (src == button2) { 
      ... 
     } 

     else if (src == button3) { 
      ... 
     } 
     ... 
    } 
} 

Скажем, у меня есть десять кнопок. Затем, если вы используете KeyBindings, вам нужно будет сделать отдельную привязку клавиш для каждой кнопки. Разве это не тот пример, который я показал более эффективно? Почему нет?

ответ

2

Если вы просто считаете CPU-циклы, да, это (возможно) более эффективно (и после тщательного рассмотрения, я даже не уверен в этом). Но есть некоторые сильные стороны против него:

  1. это делает ваш код довольно некрасиво (представьте, у вас есть тысячи тестов)
  2. это менее многоразовое
  3. менее объектно-ориентированное: это более OO связывать объект KeyStroke к объекту действий (см больше действия here)
  4. больше подвержены ошибкам, потому что ваш код менее читаемым и может стать гигантским
  5. код тесно связан (вряд ли можно переместить KeyListener в отдельный класс)
  6. в вашем тесте, вы проверяете, какая кнопка активировала событие, но вы еще не знаете, какой ключ был введен. Вам нужно будет добавить больше тестов, чтобы найти это.

Так что для очень локализованных проблем ваш подход может быть достаточным, в то время как для большего вида его невозможно удерживать.

Вы можете найти в третьем абзаце here, некоторые похожие и дополнительные комментарии по этому вопросу.

Наконец, немного странно положить KeyListener на JButton. Обычно мы регистрируем ActionListener.

+0

Означает ли это, что мне нужно будет сделать семь объектов действия? – Anonymous181

+0

@ Anonymous181 Да. Это позволит вам повторно использовать одно и то же действие для разных элементов управления пользовательского интерфейса (например, MenuItem, Button и KeyStroke). Если вы думаете о полном приложении, это очень полезно (у вас часто есть разные способы выполнения одного и того же действия). Но, как я сказал, для очень местных проблем, вашего подхода может быть достаточно. KeyListener - это низкоуровневый интерфейс, в то время как KeyBindings предлагает интерфейс более высокого уровня. –

+0

+1 Кроме того, «KeyListener» _requires_ фокусируется и плохо масштабируется. – trashgod

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