我只是写了一些小代码试图使我的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");
    }
}
}

最佳答案

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一起使用。正确使用“键绑定”时,不会出现焦点问题。

10-08 00:43