我正在为一堂课做一个基本的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();
}
});
}
任何想法?
答案 0 :(得分:4)
Swing是一个单线程框架。
也就是说,UI的所有交互和修改都是在Event Dispatching Thread的上下文中进行的。任何阻止此线程的东西都会阻止它处理重绘请求和用户输入/交互等。
我的猜测playGame
正在使用类似Thread.sleep
或某种while(true)
的内容并阻止了EDT,导致您的程序看起来好像被冻结了
详细阅读Concurrency in Swing。
一个简单的解决方案是使用Swing Timer
作为游戏循环。每次滴答时,您都会更新游戏状态并在游戏组件上调用repaint
答案 1 :(得分:0)
看起来你的括号不属于你的倒数第二个分号。尝试删除它。