Нажатие клавиши захвата в рамке

Это похоже на простое поведение, но мне трудно это сделать. Я работаю над программным обеспечением, которое отображает данные. Я хочу перерисовать график, когда пользователь нажимает Enter. Точнее, я хочу нарисовать график, когда пользователь нажимает Enter и не имеет выбранного текстового поля; но на данный момент я буду доволен рисованием всякий раз, когда пользователь нажимает Enter.

Я попытался сначала установить базовый KeyListener в кадр, но это не работает, поскольку дети JFrame, а не фрейм, получают событие.

Затем я попытался использовать KeyEventDispatcher, но это оказалось слишком глобальным понятием. Я могу иметь сразу два графика на экране, а старый граф можно закрыть или заменить новым графиком. С KeyEventDispatcher у меня нет простого способа узнать, какой сюжет я хочу активировать из нескольких графиков, открытых одновременно, а теперь открытые участки теперь могут не быть графиками, которые были открыты при создании экземпляра диспетчера ключей. Я знаю, что это решение все еще может работать, но для этого требуется хранить дополнительные данные о том, какой сюжет в данный момент активен, что плохо вписывается в архитектуру программы.

Кажется, что должен быть более простой способ захватить любой KeyEvents, отправленный в JFrame/JPanel или любой из JFrame's детей; но игнорировать события, отправленные в другие фреймы. Предпочтительный способ, который может быть добавлен к кадру и, таким образом, автоматически расположен, когда кадр расположен. Может ли кто-нибудь предложить более простой метод, чем то, что я пробовал?

2 ответа

Не используйте KeyListener.

Добавьте привязку клавиш к панели графиков.


This works very well

this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "fecharAction"); this.getRootPane().getActionMap().put("fecharAction", new AbstractAction() { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { int resp = JOptionPane.showConfirmDialog(MainForm.this, "Encerrar sistema?", "Confirmação", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (resp == 0) { MainForm.this.setVisible(false); MainForm.this.dispose(); } } });

licensed under cc by-sa 3.0 with attribution.