#java #swing #events #awt #key-events
#java #swing #Мероприятия #awt #ключевые события
Вопрос:
Я практикуюсь с событиями и хотел настроить его так, чтобы у меня был класс, который реагировал как на нажатие кнопки, так и на нажатие клавиши, он отлично компилируется, но ключевые события вообще не вызывают метод / не работают.
Это класс:
class CircleListener extends KeyAdapter implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == nlrg_button) canvas.enlarge();
else if (e.getSource() == shrink_button) canvas.shrink();
else if (e.getSource() == superenlarger_button) canvas.enlargeAlot();
else if (e.getSource() == supershrinker_button) canvas.shrinkAlot();
repaint();
}
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN: canvas.circleDown(); break;
case KeyEvent.VK_UP: canvas.circleUp(); break;
case KeyEvent.VK_LEFT: canvas.circleLeft(); break;
case KeyEvent.VK_RIGHT: canvas.circleRight(); break;
}
repaint();
}
}
это создание экземпляра регистрация:
CircleListener listener = new CircleListener();
// Bind buttons with respective eventlistener class
nlrg_button.addActionListener(listener);
shrink_button.addActionListener(listener);
superenlarger_button.addActionListener(listener);
supershrinker_button.addActionListener(listener);
// Bind canvas to keylistener class
canvas.addKeyListener(listener);
Методы, которые они пытаются вызвать, существуют и работают по назначению, я заверил их, вызвав их с помощью кнопок, прежде чем спрашивать.
Почему это не работает / чего мне не хватает? и есть ли более эффективная форма?
Комментарии:
1. Не могли бы вы опубликовать полный экземпляр регистрационный код? Похоже, проблема находится за пределами этого небольшого фрагмента…
Ответ №1:
Почему это не работает / чего мне не хватает?
Ключевые события отправляются только тому компоненту, который имеет фокус. Поскольку на вашей панели много компонентов, панель никогда не будет иметь фокуса. Вы не должны использовать KeyEvents для этого.
У меня был класс, который реагировал как на нажатие кнопки, так и на нажатие клавиши
Это хороший дизайн, однако вы не должны использовать KeyEvents для этого. Вместо этого вы должны использовать Key Bindings
.
Когда вы используете привязки клавиш, вы можете разделить действие как между кнопкой, так и нажатием клавиши. Прочитайте раздел из руководства по Swing о том, как использовать привязки клавиш, для получения дополнительной информации и примеров.
Создание вашего приложения с использованием действий — хороший дизайн. В руководстве также есть раздел, на How to Use Action
который вам следует обратить внимание. Все компоненты Swing используют действия и привязки клавиш. Вы можете проверить привязки клавиш для привязок по умолчанию для компонентов Swing, а также некоторые примеры кода для использования привязок клавиш.