addKeyListener () не работает для JPanel

Я пытаюсь создать игровой движок. Я создал class Game, но ошибка находится в classе KeyBoard. Здесь я оставляю код.

Класс :: Игра

package transfer2pc.co.cc.game.tileengine; import java.awt.Graphics; import java.util.HashMap; import javax.swing.JPanel; import transfer2pc.co.cc.game.tileengine.input.KeyBoard; public abstract class Game extends JPanel implements Runnable { /** * */ private static final long serialVersionUID = 640206679500196209L; HashMap maps = null; KeyBoard keyBoard = null; public Game(){ super(); keyBoard = new KeyBoard(this); setKeyBoard(keyBoard); Thread th = new Thread(this); th.start(); } public void run(){ while(true){ repaint(); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void paint(Graphics g){ } public void addMap(){ } public void setMap(){ } public abstract void keyPressed(int code); public abstract void keyReleased(int code); public abstract void keyTyped(int code); public void setKeyBoard(KeyBoard key){ addKeyListener(key); } } 

Класс :: KeyBoard

 package transfer2pc.co.cc.game.tileengine.input; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import transfer2pc.co.cc.game.tileengine.Game; public class KeyBoard extends KeyAdapter implements KeyListener { Game game = null; public KeyBoard(Game gm){ this.game = gm; } @Override public void keyPressed(KeyEvent e) { System.out.println("KeyPressed"); game.keyPressed(e.getKeyCode()); } @Override public void keyReleased(KeyEvent e) { game.keyReleased(e.getKeyCode()); } @Override public void keyTyped(KeyEvent e) { game.keyTyped(e.getKeyCode()); } public static char getChar(int key){ return (char)key; } } 

Класс :: KeyTest

 package transfer2pc.co.cc.game.tileengine.test; import java.awt.Graphics; import javax.swing.JFrame; import transfer2pc.co.cc.game.tileengine.Game; import transfer2pc.co.cc.game.tileengine.input.KeyBoard; public class KeyTest extends Game { /** * */ private static final long serialVersionUID = 8557676950779023327L; char pressed; public KeyTest(){ super(); addKeyListener(new KeyBoard(this)); } @Override public void keyPressed(int code) { pressed = KeyBoard.getChar(code); } @Override public void keyReleased(int code) { } @Override public void keyTyped(int code) { } @Override public void paint(Graphics g){ g.drawString("You pressed: "+pressed, 20, 20); } public static void main(String[] args){ JFrame frame = new JFrame("KeyTest"); frame.setSize(640, 480); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.add(new KeyTest()); frame.setVisible(true); } } 

Но ошибка заключалась в том, что исключение не было, и вход не читается. Может ли кто-нибудь сказать мне правильный способ сделать это.

Просто ваша панель должна быть настраиваемой. Добавьте туда, где вы создаете панель:

 panel.setFocusable(true); panel.requestFocusInWindow(); 

Вот SSCCE (я предлагаю задать вопросы с одним из них в будущем):

 import java.awt.Dimension; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class SimpleKeyTest { public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { JFrame frame = new JFrame(); JPanel panel = new JPanel(); frame.getContentPane().add(panel); panel.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) {} @Override public void keyReleased(KeyEvent e) {} @Override public void keyPressed(KeyEvent e) { System.out.println("Pressed " + e.getKeyChar()); } }); panel.setFocusable(true); panel.requestFocusInWindow(); frame.setSize(new Dimension(300, 300)); frame.setVisible(true); } }; SwingUtilities.invokeLater(r); } } 

Кроме того, https://www.google.com/search?q=jpanel+keylistener

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

  • Отправка сообщений между двумя объектами JPanel
  • Как настроить столбцы JTable для размещения самого длинного содержимого в ячейках столбца
  • Как добавить кнопку закрытия на вкладку JTabbedPane?
  • Автозаполнение JComboBox
  • Java swing GUI зависает
  • Поворотная квадратная панель в Java GUI
  • Как закрыть приложение Java Swing из кода
  • paintComponent не работает, если его вызывается рекурсивной функцией?
  • Java Swing: зачем изменять размер frameworks, чтобы добавить компоненты, добавленные
  • Java Swing: как я могу реализовать экран входа в систему, прежде чем показывать JFrame?
  • Нарисуйте круг с радиусом и острием по краю
  • Interesting Posts

    Как сказать PowerShell дождаться окончания каждой команды до начала следующего?

    Устранение неполадок не удалось выполнить обновление до Windows 7?

    Связать Vs Лямбда?

    Плагин jquery.validate – как обрезать значения перед проверкой формы

    Тайм-аут сценария приложения Google ~ 5 минут?

    Как скопировать содержимое одного streamа в другой?

    Подтвердить поле формы только для отправки или ввода пользователем

    Что случилось с этим делением?

    Инструмент для аннотирования изображений (скриншоты) для целей документации?

    Создание сборки Xml Serialization как части моей сборки

    Как вы добавляете пользовательский интерфейс внутри ячеек в электронную таблицу google с помощью сценария приложения?

    Как читать текст из скрытого элемента с помощью Selenium WebDriver?

    Как проверить, является ли число палиндром?

    Как повторно включить путь в адресной строке Chrome?

    Ссылка на объект требуется для доступа к нестационарному элементу

    Давайте будем гением компьютера.