2012-08-03 62 views
2

我的问题是,当我点击框架屏幕的空间时,它停止键盘按键被注册,所以我的播放器停止移动。JFrame鼠标单击停止键盘按钮

在此先感谢您的帮助。

代码:

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

回答

9

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

解决方案不是使用KeyListener,而是使用Key Bindings,它比KeyListener和更高级别的概念更健壮。

此外,您将要停止使用作为您的听众。如果你的程序不仅仅是一个玩具程序,它还很难维护一个GUI类,它将自己用作自己的听众。

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

+2

+1键绑定。停止使用+1作为侦听器,使用+1作为混音备注。嗯,我需要upvote两个其他职位给你你的信用? – Robin 2012-08-03 22:07:18

+0

谢谢,这帮助了很多。我一定会尝试关键绑定。 – DCSoft 2012-08-03 22:34:25

+0

我找到了一个临时解决方案,我已经将游戏类传入InputManager类而不是JFrame。 – DCSoft 2012-08-03 22:50:13

相关问题