切换JPanel和keyListeners

时间:2011-11-18 18:43:08

标签: java swing jpanel keylistener

我正在开发一款游戏,你首先进入主屏幕,有多种选择,例如单人游戏,双人游戏,积分等等。

我有一个大问题。如果我单击菜单中的按钮(不是JButtonJPanel的开关,但keyListener会丢失。 Keylistener与游戏代码位于同一类中,后者实现JPanel。我尝试了一切让Keylistener起作用,但事实并非如此。

这是如何调用的东西:主类 - >菜单 - >游戏。我尝试将keylistener添加到主类,但它不起作用。

因此,JPanel切换正常,但Keylistener已消失。我之前用新的JFrame开发游戏,所以当我点击一个菜单时,就会创建一个新的框架。我没有在这里插入代码,因为它太长(2000+行),并且KeyListener正在运行,但只有当它在新的JFrame时才有效。我通过单击按钮在Menu类中设置了int模式。

这是我目前的面板开关:

public void setJPanel() {
     switch (mode) {
        case 1:
            getContentPane().add(s);
            validate();
            break;
        case 2:
            getContentPane().removeAll();
            getContentPane().add(sp);
            validate();
            break;
    }
}

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您是否考虑过或尝试使用Key Bindings而不是使用KeyListener? KeyListeners要求被侦听的组件具有焦点,并且焦点可能由于多种原因而丢失,尤其是在交换视图时(您是否正在使用CardLayout?)。另一方面,键绑定可以设置为响应,即使绑定组件没有焦点,但是当它仅保持在具有焦点的窗口内时。教程:Using a CardLayout

修改
我发现你没有使用CardLayout,我建议你使用它,因为它可以使你的视图交换更清晰,更容易。

编辑2
我同意你不想在这里发布你的整个2000+行程序,因为没有人会有时间阅读它,但考虑将你的问题/问题缩小到一个可编辑的任何一个小的类中,并且可以运行我们,并证明你的问题。换句话说,Short, Self Contained, Compilable, Example or SSCCE

请记住,代码应该是可编译的,并且可以让我们中的许多人能够完全理解它。

答案 1 :(得分:2)

重新聚焦时,Cardlayout实际上很麻烦。

@op,尝试在添加新jpanel后调用requestFocusInWindow()