我的问题是,当我点击框架屏幕的空间时,它会停止注册键盘键,以便我的播放器停止移动。
提前感谢您的帮助。
代码:
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();
答案 0 :(得分:9)
我假设您正在使用KeyListener来侦听键输入。请注意,这仅在被收听的组件具有焦点时才有效,并且当您在JFrame上按下鼠标时,您收听的组件会失去焦点。
解决方案不是使用KeyListener,而是使用比KeyListener和更高级别概念更强大的Key Bindings。
此外,您还想停止使用 this 作为您的听众。如果你的程序不仅仅是一个玩具程序,那么维护一个将自己用作自己的监听器的GUI类就变得非常困难。
另外,关于:“哦,是的Game.java扩展Canvas”:你不想不必要地混合AWT和Swing组件,因为这会导致副作用。相反,只需使用所有Swing组件,例如JPanels而不是Canvases。