Java 切换JPanel和KeyListener

Java 切换JPanel和KeyListener,java,swing,jpanel,keylistener,Java,Swing,Jpanel,Keylistener,我正在开发一个游戏,你首先进入主屏幕,有多种选择,例如,单人,双人,信用卡等 我有一个大问题。如果我单击菜单中的一个按钮,(而不是JButton),则JPanels开关将丢失keyListener。keylister与实现JPanel的游戏代码在同一个类中。我想尽一切办法让keylister正常工作,但就是不行 这些东西的名称如下:主类-->菜单-->游戏。我尝试将keylistener添加到主类,但它不起作用 因此,JPanel切换是正常的,但是keysteners不见了。我以前是用newJF

我正在开发一个游戏,你首先进入主屏幕,有多种选择,例如,单人,双人,信用卡等

我有一个大问题。如果我单击菜单中的一个按钮,(而不是
JButton
),则
JPanel
s开关将丢失keyListener。
keylister
与实现
JPanel
的游戏代码在同一个类中。我想尽一切办法让
keylister
正常工作,但就是不行

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

因此,
JPanel
切换是正常的,但是
keystener
s不见了。我以前是用new
JFrame
s开发这个游戏的,所以当我点击一个菜单时,一个新的框架被创建了。我没有在这里插入代码,因为它太长了(2000多行),而且
KeyListener
正在工作,但只有当它位于新的
JFrame
中时才工作。我通过单击按钮在菜单类中设置模式int

这是当前我的面板开关:

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

提前谢谢你的帮助

您是否考虑过或尝试过使用键绑定,而不是使用键侦听器?KeyListeners要求正在侦听的组件具有焦点,并且由于许多原因,焦点可能会丢失,特别是在交换视图时(您是否为此使用CardLayout?)。另一方面,键绑定可以设置为响应,即使绑定的组件没有焦点,但仅在有焦点的窗口中保持。教程:

编辑
我发现您没有使用CardLayout,我建议您使用它,因为它可以使您的视图交换更干净、更容易

编辑2
我同意你不想在这里发布你的整个2000 +线程序,因为没有人有时间阅读它,但是考虑把你的问题/问题浓缩成一个由我们任何人都可以编译和运行的小类,并演示你的问题。换言之,这是一个错误


请记住,代码应该是可编译和可运行的,这样我们中的许多人才能完全理解它。

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

编辑
我发现您没有使用CardLayout,我建议您使用它,因为它可以使您的视图交换更干净、更容易

编辑2
我同意你不想在这里发布你的整个2000 +线程序,因为没有人有时间阅读它,但是考虑把你的问题/问题浓缩成一个由我们任何人都可以编译和运行的小类,并演示你的问题。换言之,这是一个错误


请记住,代码应该是可编译和可运行的,这样我们中的许多人才能完全理解它。

重新聚焦时,Cardlayout实际上是扭曲的


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

重新聚焦时,Cardlayout实际上是扭曲的


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

yep,这也是我使用CardLayout的经验。幸运的是,键绑定可以解决这个问题。1+用于你有用的答案。我添加了它,但什么也不做:(JPanels被切换,但KeyListener消失了:(是的,这也是我使用CardLayout的经验。幸运的是,键绑定可以解决这个问题。1+用于你有用的答案。我添加了它,但什么也不做:(JPanels被切换,但KeyListener消失了:(谢谢!是的,我读过CardLayout,但它只隐藏面板,而不移除面板(对吗?),而且可能会导致FPS下降。我真的无法编写示例代码,它太大了。相反,我只是解释一下。KeyListener是简单的public void keyPressed(KeyEvent e)和KeyReleased。有两个类,它们在JPanel中,有两个不同的KeyListener。您必须在主类(JFrame)中添加和删除JPanel。我想我只需要一个添加和删除KeyListener的方法。再次感谢!)另外,为了更好,我重写了切换。我为JPanel创建了一个launcher类:并且,我向主类添加了一个方法,如下所示:当输入一个按钮时会调用它:main.singlePlay(sc);where sc=menu。非常感谢!@SimonTamás:基于这段代码片段,我不能告诉你太多,对不起。好吧,现在我使用cardLayout,jpanels开关正确,但键盘列表器仍然出错:(。例如,我有菜单和单人播放器。它们基本上是一样的。它们都有一个TAdapter类,用键盘输入()、keyReleased()和keyPressed()。这些在新窗口中打开时可以工作,但不能在同一窗口中打开:(.感谢您的帮助!@SimonTamás:再次提醒,使用键绑定怎么样?谢谢!是的,我读到了CardLayout,但它只隐藏面板,而不会移除面板(对吗?),它可能会导致FPS下降。我不能真正制作示例代码,它太大了。相反,我只解释一下。KeyListener是简单的public void keyPressed(KeyEvent e)和KeyReleased。有两个类,它们在JPanel中,有两个不同的KeyListener。您必须在主类(JFrame)中添加和删除JPanel。我想我只需要一个添加和删除KeyListener的方法。再次感谢!)另外,为了更好,我重写了切换。我为JPanel创建了一个launcher类:并且,我向主类添加了一个方法,如下所示:当输入一个按钮时会调用它:main.singlePlay(sc)