我刚写了一些小代码试图让我的KeyEvent管理器工作。
正如您所看到的,我创建了一个JFrame并添加了gameComponent,它是Game类的一个对象。我将JPanel设置为可聚焦并请求焦点。然后将名为TAdapter的KeyAdapter设置为KeyAdapter。您可以在扩展KeyAdapter和方法keyPressed()的代码和代码中看到该类。
我告诉程序在按下某个键但是没有任何反应时将“按下”打印到我的控制台。
我无法弄清楚我做错了什么,也许有人看到我自己看不到的一些错误?
感谢任何帮助
提前致谢
public class Game extends JPanel {
public static final int WIDTH = 320;
public static final int HEIGHT = 240;
public static final int SCALE = 3;
public Game() {
addKeyListener(new TAdapter());
setFocusable(true);
requestFocus();
}
public static void main(String[] args) {
Game gameComponent = new Game();
Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE);
JFrame frame = new JFrame("Invaders");
frame.setVisible(true);
frame.setSize(size);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(gameComponent);
}
public class TAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
System.out.println("Pressed");
}
}
}
答案 0 :(得分:4)
requestFocus();
使用的正确方法是:
requestFocusInWindow();
虽然即使该方法也不起作用,因为这些方法只能在可见组件上调用。当您创建组件时,它尚不可见,因此请删除该行代码。
代码的主要问题是在框架可见后将组件添加到框架中。代码应该是这样的:
frame.add(gameComponent);
frame.setSize(size);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
setVisible(true)
应该是将所有组件添加到框架后的最后一件事。
最后你甚至不应该使用KeyListener。 Swing旨在与Key Bindings一起使用。正确使用键绑定时,您不会有焦点问题。