我正在开发一款游戏,你首先进入主屏幕,有多种选择,例如单人游戏,双人游戏,积分等等。
我有一个大问题。如果我单击菜单中的按钮(不是JButton
)JPanel
的开关,但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;
}
}
提前感谢您的帮助!
答案 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()