Прослушиватели клавиш не отвечают в JPanel: распространенная проблема
При использовании прослушивателей клавиш для обнаружения нажатий клавиш в JPanel разработчики часто сталкиваются с проблемой, при которой слушатели не могут инициировать желаемые действия. Эта проблема может возникнуть из-за нескольких факторов.
Ограничения сфокусированного компонента
KeyListeners полагаются на присоединение к сфокусированному компоненту для правильной работы. По умолчанию фокус не предоставляется автоматически JPanel. Чтобы решить эту проблему, явно установите возможность фокусировки и запросите фокус в конструкторе JPanel:
public JPanel extends JPanel implements KeyListener {
public JPanel() {
this.addKeyListener(this);
this.setFocusable(true);
this.requestFocusInWindow();
}
Альтернатива: привязки клавиш
Хотя установка фокуса вручную является жизнеспособным решением, более надежным подходом является использование привязок клавиш. Привязки клавиш предоставляют гибкий механизм связывания нажатий клавиш с конкретными действиями. Чтобы реализовать привязки клавиш в JPanel:
public JPanel extends JPanel implements ActionListener {
public JPanel() {
setupKeyBinding();
this.setFocusable(true);
this.requestFocusInWindow();
}
private void setupKeyBinding() {
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inMap = getInputMap(condition);
ActionMap actMap = getActionMap();
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
actMap.put("Left", new leftAction());
}
private class leftAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
System.out.println("test");
}
}
}
В этом примере класс leftAction определяет действие, которое будет выполнено при нажатии клавиши со стрелкой влево (в данном случае вывод «test» на консоль).
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3