Java Swing如何实现按下空格键在多个JFrame窗口间切换
问题根源
你的MainCode里的if(GP.flagCheck==true)判断仅在程序启动初始化时执行1次,此时玩家还没通关,flagCheck默认是false,判断直接跳过。后续你通关按空格把flagCheck改成true之后,不会再触发这个判断,自然不会执行窗口切换逻辑。
修复方案
你可以直接在Gameplay的空格键触发逻辑里处理窗口切换,不需要在主类里做判断,修改步骤如下:
1. 给Gameplay类添加主窗口和第二关面板的引用
在Gameplay类的成员变量区新增两个变量:
public JFrame mainFrame; public GameplayLv2 level2Panel;
2. 在主类初始化时把对应实例传给第一关对象
修改MainCode的main方法,删除原有的无效切换判断:
import javax.swing.JFrame; public class MainCode{ public static void main(String args[]){ JFrame f=new JFrame(); Gameplay GP = new Gameplay(); // 把主窗口、第二关面板的引用传给第一关实例 GP.mainFrame = f; GameplayLv2 g2 = new GameplayLv2(); GP.level2Panel = g2; f.setBounds(10,10,1000,700); f.setTitle("Breakout Ball"); f.setResizable(false); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(GP); } }
3. 修改空格键触发逻辑,直接执行切换
找到Gameplay类keyPressed方法中的空格键判断块,修改为以下内容:
if(e.getKeyCode()==KeyEvent.VK_SPACE){ if(!play && score==30){ // 单JFrame切换面板方案(推荐) mainFrame.remove(Gameplay.this); mainFrame.add(level2Panel); mainFrame.revalidate(); mainFrame.repaint(); // 如果要保留双JFrame的原有方案,就注释上面的代码,用下面的逻辑 /* JFrame frame2 = new JFrame(); frame2.setBounds(10,10,1000,700); frame2.setTitle("Breakout Ball"); frame2.setResizable(false); frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame2.add(level2Panel); frame2.setVisible(true); mainFrame.dispose(); // 销毁第一关窗口 */ } }
优化建议
- 优先使用单JFrame切换多个JPanel的方案,避免多窗口管理混乱,用户体验也更统一
- 变量命名尽量遵循Java规范,首字母小写,比如把
GP改为gameplay可读性更高
内容的提问来源于stack exchange,提问作者MED
相关产品推荐
相关产品推荐

