JFrame鼠标单击停止键盘按钮

时间:2012-08-03 21:30:23

标签: java swing awt keylistener

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

提前感谢您的帮助。

代码:

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);
}

GUI代码:

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();

1 个答案:

答案 0 :(得分:9)

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

解决方案不是使用KeyListener,而是使用比KeyListener和更高级别概念更强大的Key Bindings

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

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