Swing键盘没有响应

3
我正在一个设置为全屏窗口的JFrame对象上使用KeyListener,代码类似于这样:

class Game{

private GraphicsDevice device;
...

public void run(){
JFrame frame = new JFrame();
frame.addKeyListener(new MarioKeyListener());
device.setFullScreenWindow(frame);
}

...
}

如果我只在主方法中创建一个游戏对象并调用run(),那么它可以正常工作。

但是,我想在另一个JFrame的MenuItem中添加到mousePressed()函数中完成这个操作。结果是程序可以正常运行,但不接受任何键盘输入。

JMenu gamemenu = new JMenu("Game");
   JMenuItem newGame = new JMenuItem("New Game");
    newGame.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e){
    Game g = new Game();
    g.run();    
    }               
});
gamemenu.add(newGame);

我认为我的框架对象没有聚焦,但是调用setFocusable(true)和requestfocusinwindow()并没有帮助。如果有人知道问题出在哪里或如何修复它,将不胜感激...
Tomi

5
通常应避免使用KeyListeners,而改用Key Bindings。Swing教程将告诉您如何使用它们,并解释为什么它们更优秀。 - Hovercraft Full Of Eels
是的,我在这个网站上已经读过很多次了。如果找不到更快的解决方案,那就是我要做的事情。 - Tomi
2
如果你已经多次阅读了“键绑定”相关的内容,为什么不从一开始就正确地设计你的游戏呢?此外,在处理菜单项点击时,你不应该使用MouseListener。Swing教程也会向你展示正确的做法。我建议你先阅读教程并学习基础知识。 - camickr
1个回答

4

requestFocusInWindow()..

如果此组件的顶层祖先已经是聚焦的窗口,则请求此组件获取输入焦点。

你是否检查了返回值?我怀疑它失败是因为在调用该方法时,新窗口不是聚焦组件。

如果是这种情况,答案可能类似于添加RequestFocusListener对话框焦点策略。


我必须使用JFrame作为顶级容器,因此不是JComponent... 我想做的是设置一个新的JFrame,使其获得键盘焦点。 - Tomi
这是源文件的下载链接:https://www.rapidshare.com/#!download|165|852289592|mario_keylistener_problem.rar|389 - Tomi
相关代码如下: Mariogame - 主类 GameWindow.run() - 运行全屏游戏 ConfigWindow - 构造函数 ScreenManager.setFullscreen() - 设置全屏 MarioKeyListener - 键盘输入 - Tomi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接