java keylistener не вызван

Я написал пример кода с помощью KeyListener в Java, я создал JPanel , а затем настроил его на true, я создал KeyListener, запросил фокус, а затем добавил KeyListener в свою панель. Но методы keyListener никогда не называются. Кажется, хотя я запросил фокус, он не фокусируется.

Может ли кто-нибудь помочь?

 listener = new KeyLis(); this.setFocusable(true); this.requestFocus(); this.addKeyListener(listener); class KeyLis implements KeyListener{ @Override public void keyPressed(KeyEvent e) { currentver += 5; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5; break; case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5; break; } repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { } } 

Если какой-либо исполняемый код должен быть необходим:

  import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; import javax.swing.JLabel; public class test extends JFrame { private AreaOfGame areaOfGame; public test() { super(""); setVisible(true); this.setBackground(Color.darkGray); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); setLayout(null); setBounds(200, 10, 400, 700); areaOfGame = new AreaOfGame(); this.add(areaOfGame); startGame(); } public int generateNext() { Random r = new Random(); int n = r.nextInt(7); return n; } public void startGame() { while(!areaOfGame.GameOver()) { areaOfGame.startGame(generateNext()); } } public static void main(String[] args) { new MainFrame(); } import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JPanel; public class AreaOfGame extends JPanel { private static final int rightside = 370; private int bottom; private int top; private int currentPos; private int currentver; private KeyLis listener; public AreaOfGame() { super(); bottom = 650; top = 50; setLayout(null); setBounds(20, 50, 350, 600); setVisible(true); this.setBackground(Color.lightGray); listener = new KeyLis(); this.setFocusable(true); if(this.requestFocus(true)) System.out.println("true");; this.addKeyListener(listener); currentPos = 150; currentver=0; } public void startGame(int n) { while(verticallyInBound()){ System.out.println("anything"); } } public boolean verticallyInBound() { if(currentPos= bottom){ System.out.println("game over"); return true; } else return false; } public boolean horizontalyInBounds() { if(currentPos= 20) return true; else return false; } class KeyLis implements KeyListener{ @Override public void keyPressed(KeyEvent e) { System.out.println("called"); currentver += 5; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5; break; case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5; break; } repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { System.out.println("called 3"); } } } в  import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; import javax.swing.JLabel; public class test extends JFrame { private AreaOfGame areaOfGame; public test() { super(""); setVisible(true); this.setBackground(Color.darkGray); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); setLayout(null); setBounds(200, 10, 400, 700); areaOfGame = new AreaOfGame(); this.add(areaOfGame); startGame(); } public int generateNext() { Random r = new Random(); int n = r.nextInt(7); return n; } public void startGame() { while(!areaOfGame.GameOver()) { areaOfGame.startGame(generateNext()); } } public static void main(String[] args) { new MainFrame(); } import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JPanel; public class AreaOfGame extends JPanel { private static final int rightside = 370; private int bottom; private int top; private int currentPos; private int currentver; private KeyLis listener; public AreaOfGame() { super(); bottom = 650; top = 50; setLayout(null); setBounds(20, 50, 350, 600); setVisible(true); this.setBackground(Color.lightGray); listener = new KeyLis(); this.setFocusable(true); if(this.requestFocus(true)) System.out.println("true");; this.addKeyListener(listener); currentPos = 150; currentver=0; } public void startGame(int n) { while(verticallyInBound()){ System.out.println("anything"); } } public boolean verticallyInBound() { if(currentPos= bottom){ System.out.println("game over"); return true; } else return false; } public boolean horizontalyInBounds() { if(currentPos= 20) return true; else return false; } class KeyLis implements KeyListener{ @Override public void keyPressed(KeyEvent e) { System.out.println("called"); currentver += 5; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5; break; case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5; break; } repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { System.out.println("called 3"); } } } в  import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; import javax.swing.JLabel; public class test extends JFrame { private AreaOfGame areaOfGame; public test() { super(""); setVisible(true); this.setBackground(Color.darkGray); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); setLayout(null); setBounds(200, 10, 400, 700); areaOfGame = new AreaOfGame(); this.add(areaOfGame); startGame(); } public int generateNext() { Random r = new Random(); int n = r.nextInt(7); return n; } public void startGame() { while(!areaOfGame.GameOver()) { areaOfGame.startGame(generateNext()); } } public static void main(String[] args) { new MainFrame(); } import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JPanel; public class AreaOfGame extends JPanel { private static final int rightside = 370; private int bottom; private int top; private int currentPos; private int currentver; private KeyLis listener; public AreaOfGame() { super(); bottom = 650; top = 50; setLayout(null); setBounds(20, 50, 350, 600); setVisible(true); this.setBackground(Color.lightGray); listener = new KeyLis(); this.setFocusable(true); if(this.requestFocus(true)) System.out.println("true");; this.addKeyListener(listener); currentPos = 150; currentver=0; } public void startGame(int n) { while(verticallyInBound()){ System.out.println("anything"); } } public boolean verticallyInBound() { if(currentPos= bottom){ System.out.println("game over"); return true; } else return false; } public boolean horizontalyInBounds() { if(currentPos= 20) return true; else return false; } class KeyLis implements KeyListener{ @Override public void keyPressed(KeyEvent e) { System.out.println("called"); currentver += 5; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5; break; case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5; break; } repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { System.out.println("called 3"); } } } 

Готов поспорить, что вы запрашиваете фокус до того, как JPanel был отображен (до того, как окно верхнего уровня либо вызвало pack() либо setVisible(true) ), и если это так, это не сработает. Запрос фокуса будет предоставлен только после того, как компоненты будут отображены. Вы проверили, что ваш звонок для requestFocus() вернулся? Он должен вернуть истину для вашего звонка, чтобы иметь шанс на успех. Также лучше использовать requestFocusInWindow() а не requestFocus() .

Но что более важно, вы не должны использовать KeyListeners для этого, а скорее для привязки клавиш, более высокую концепцию уровня, которую сам Swing использует для ответа на нажатия клавиш.

редактировать
Пример SSCCE :

 import java.awt.Dimension; import java.awt.event.*; import javax.swing.*; public class TestKeyListener extends JPanel { private KeyLis listener; public TestKeyListener() { add(new JButton("Foo")); // something to draw off focus listener = new KeyLis(); this.setFocusable(true); this.requestFocus(); this.addKeyListener(listener); } @Override public Dimension getPreferredSize() { return new Dimension(300, 200); } private class KeyLis extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: System.out.println("VK_LEFT pressed"); break; case KeyEvent.VK_RIGHT: System.out.println("VK_RIGHT pressed"); break; } } } private static void createAndShowGui() { TestKeyListener mainPanel = new TestKeyListener(); JFrame frame = new JFrame("TestKeyListener"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

Изменить 2
И эквивалентный SSCCE с использованием привязок клавиш:

 import java.awt.*; import java.awt.event.*; import javax.swing.*; @SuppressWarnings("serial") public class TestKeyBindings extends JPanel { public TestKeyBindings() { add(new JButton("Foo")); // something to draw off focus setKeyBindings(); } private void setKeyBindings() { ActionMap actionMap = getActionMap(); int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; InputMap inputMap = getInputMap(condition ); String vkLeft = "VK_LEFT"; String vkRight = "VK_RIGHT"; inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), vkLeft); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), vkRight); actionMap.put(vkLeft, new KeyAction(vkLeft)); actionMap.put(vkRight, new KeyAction(vkRight)); } @Override public Dimension getPreferredSize() { return new Dimension(300, 200); } private class KeyAction extends AbstractAction { public KeyAction(String actionCommand) { putValue(ACTION_COMMAND_KEY, actionCommand); } @Override public void actionPerformed(ActionEvent actionEvt) { System.out.println(actionEvt.getActionCommand() + " pressed"); } } private static void createAndShowGui() { TestKeyBindings mainPanel = new TestKeyBindings(); JFrame frame = new JFrame("TestKeyListener"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

Редактировать 3
Что касается вашего недавнего SSCCE, ваши while (true) циклы блокируют stream событий Swing и могут препятствовать взаимодействию пользователя или картине. Лучше использовать таймер Swing, а не while (true) . Например:

 import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing.*; public class BbbTest extends JFrame { private AreaOfGame areaOfGame; public BbbTest() { super(""); // setVisible(true); this.setBackground(Color.darkGray); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); setLayout(null); setBounds(200, 10, 400, 700); areaOfGame = new AreaOfGame(); this.add(areaOfGame); setVisible(true); startGame(); } public int generateNext() { Random r = new Random(); int n = r.nextInt(7); return n; } public void startGame() { // while (!areaOfGame.GameOver()) { // areaOfGame.startGame(generateNext()); // } areaOfGame.startGame(generateNext()); } public static void main(String[] args) { new BbbTest(); } class AreaOfGame extends JPanel { private static final int rightside = 370; private int bottom; private int top; private int currentPos; private int currentver; private KeyLis listener; public AreaOfGame() { super(); bottom = 650; top = 50; setLayout(null); setBounds(20, 50, 350, 600); setVisible(true); this.setBackground(Color.lightGray); listener = new KeyLis(); this.setFocusable(true); if (this.requestFocus(true)) System.out.println("true"); ; this.addKeyListener(listener); currentPos = 150; currentver = 0; } public void startGame(int n) { // while (verticallyInBound()) { // System.out.println("anything"); // } int timeDelay = 50; // msecs delay new Timer(timeDelay , new ActionListener() { public void actionPerformed(ActionEvent arg0) { System.out.println("anything"); } }).start(); } public boolean verticallyInBound() { if (currentPos <= bottom - 50) return true; return false; } public boolean GameOver() { if (top >= bottom) { System.out.println("game over"); return true; } else return false; } public boolean horizontalyInBounds() { if (currentPos <= rightside && currentPos >= 20) return true; else return false; } class KeyLis implements KeyListener { @Override public void keyPressed(KeyEvent e) { System.out.println("called"); currentver += 5; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: if (horizontalyInBounds()) currentPos -= 5; break; case KeyEvent.VK_RIGHT: if (horizontalyInBounds()) currentPos += 5; break; } repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { System.out.println("called 3"); } } } } 

Можно использовать кнопку «TAB» для переключения между кнопками и прослушивателем клавиш. У меня есть программа с одной кнопкой, которая после того, как я нажимаю ее, прослушиватель клавиш не работает. Я понял, что если вы нажмете кнопку «TAB», «Внимание» или «Фокус» программы вернется к прослушивателю клавиш.

возможно, это поможет: http://docstore.mik.ua/orelly/java-ent/jfc/ch03_08.htm

  • JTable row hightlighter на основе значения TableCell
  • Рисование прямоугольника, который не исчезнет в следующей краске
  • Ключевые привязки и ключевые слушатели в Java
  • Как установить AUTO-SCROLLING JTextArea в Java GUI?
  • Eclipse WindowBuilder, перекрывающиеся JPanels
  • Как обновить поле метки каждые 2 секунды в java fx?
  • Расширяет JFrame и создает его внутри программы
  • Как добавить флажок в узел JTree для управления мультиселекцией?
  • Как заменить AWQ EventQueue собственной реализацией
  • Есть ли альтернатива JPasswordField?
  • Могу ли я добавить JRadioButton в JTable
  • Давайте будем гением компьютера.