我正在上一堂基本的Pong游戏。我正在工作Pong,并且在启动时有GUI显示,很遗憾,我似乎无法从JButton开头开始游戏。我已在代码中指出问题所在,并删除了不相关的代码。
frame.add(GUIPanel); JButton startButton = new JButton("Start!"); GUIPanel.add(startButton, BorderLayout.CENTER); startButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.getContentPane().remove(GUIPanel); frame.validate(); frame.repaint(); drawPanel = new DrawPanel(); drawPanel.requestFocus(); frame.getContentPane().add(BorderLayout.CENTER, drawPanel); //This is the part that freezes it, everything else works fine //except that the playGame method isn't called. If I remove the whole //startButton and whatnot I can call playGame and it works perfectly. playGame(); } }); }
有任何想法吗?
Swing是一个单线程框架。
也就是说,对UI的所有交互和修改都应在事件调度线程的上下文内进行。阻塞此线程的所有内容都将阻止其处理,尤其是重画请求和用户输入/交互。
我的猜测是playGame正在使用类似Thread.sleep或类似的东西while(true)并且阻止了EDT,导致您的程序看起来像被冻结了一样
playGame
Thread.sleep
while(true)
阅读Swing中的并发以了解更多详细信息。
一个简单的解决方案是使用SwingTimer充当游戏循环。每次打勾时,您都将更新游戏状态并调用(类似)repaint游戏组件
Timer
repaint