2

我的问题是当我单击框架屏幕的空间时,它会停止注册键盘键,因此我的播放器停止移动。

在此先感谢您的帮助。

编码:

private Component comp;
....

public InputManager(Component comp) {
    this.comp = comp;
    mouseLocation = new Point();
    centerLocation = new Point();

    // register key and mouse listeners
    comp.addKeyListener(this);
    comp.addMouseListener(this);
    comp.addMouseMotionListener(this);
    comp.addMouseWheelListener(this);

    // allow input of the TAB key and other keys normally
    // used for focus traversal
    comp.setFocusTraversalKeysEnabled(false);
}

图形用户界面代码:

Game game = new Game();
    game.setMinimumSize(new Dimension(WIDTH * 2, HEIGHT * 2));
    game.setPreferredSize(new Dimension(WIDTH * 2, HEIGHT * 2));
    game.setMaximumSize(new Dimension(WIDTH * 2, HEIGHT * 2));

    frame = new JFrame(Game.NAME);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.add(game);
    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    game.start();
4

1 回答 1

9

我假设您正在使用 KeyListener 来监听键输入。请注意,这仅在被侦听的组件具有焦点时才有效,并且可能当您在 JFrame 上按下鼠标时,您被侦听的组件失去焦点。

解决方案不是使用 KeyListener,而是使用比 KeyListener 和更高级别概念更健壮的键绑定。

此外,您将希望停止使用作为您的侦听器。如果您的程序变得不仅仅是一个玩具程序,那么维护一个将自己用作自己的侦听器的 GUI 类将变得非常困难。

此外,关于:“哦,是的 Game.java 扩展 Canvas”:您不想不必要地混合 AWT 和 Swing 组件,因为这会导致副作用。相反,只需使用所有 Swing 组件,例如 JPanel,而不是 Canvases。

于 2012-08-03T21:54:33.630 回答