«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему мои KeyListeners не работают в моей JPanel?

Почему мои KeyListeners не работают в моей JPanel?

Опубликовано 8 ноября 2024 г.
Просматривать:828

Why Aren\'t My KeyListeners Working in My JPanel?

Прослушиватели клавиш не отвечают в 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