Java 康威《生命游戏》的不断更新
我很难点击一个按钮,不断更新康威的生活游戏。因此,我首先要给出生活游戏中的规则,并模拟和计算计数器的位置。然后通过将背景颜色设置为JButton来更新帧,然后延迟并重复。但问题是,当我按下开始按钮时,由于我试图使用while循环,它被卡住了 有一个单独的软件包叫做AI_处理器,它只是模拟和计算,所有的工作都正确完成,只是更新遇到了一些问题 代码部分:Java 康威《生命游戏》的不断更新,java,swing,animation,graphics,Java,Swing,Animation,Graphics,我很难点击一个按钮,不断更新康威的生活游戏。因此,我首先要给出生活游戏中的规则,并模拟和计算计数器的位置。然后通过将背景颜色设置为JButton来更新帧,然后延迟并重复。但问题是,当我按下开始按钮时,由于我试图使用while循环,它被卡住了 有一个单独的软件包叫做AI_处理器,它只是模拟和计算,所有的工作都正确完成,只是更新遇到了一些问题 代码部分: public void updateFrame() { AI.AI_Movement_Update(); addColour(); }
public void updateFrame() {
AI.AI_Movement_Update();
addColour();
}
public void addColour() {
for (int i = 0; i < fieldHeight; i++) {
for (int j = 0; j < fieldWidth; j++) {
if (AI.getPosB(j, i) == true) {
testMolecules[i][j].setBackground(Color.green);
} else {
testMolecules[i][j].setBackground(Color.black);
}
}
}
}
Timer tm = new Timer(1000,this);
if (ae.getSource() == start) {
while(true) {
updateFrame();
tm.start();
}
}
编辑:
抱歉,以前的解决方案不正确:-
编辑:
您可以为此使用匿名内部类
看
看
如果使用计时器,则应传递ActionListener的实例
计时器创建了一个新线程,所以虽然不是必需的
未测试:
public void updateFrame(){
AI.AI_Movement_Update();
addColour();
}
public void addColour() {
for (int i = 0; i < fieldHeight; i++) {
for (int j = 0; j < fieldWidth; j++) {
if (AI.getPosB(j, i) == true) {
testMolecules[i][j].setBackground(Color.green);
} else {
testMolecules[i][j].setBackground(Color.black);
}
}
}
}
if(ae.getSource() == start)
new Timer(1000,new ActionListener(){
updateFrame();
}).start();
你说:
但问题是,当我按下开始按钮时,由于我试图使用while循环,它被卡住了
然后去掉while-true循环,因为这只会占用Swing事件线程,从而使GUI变得无用。您有一个Swing计时器,您可以在计时器的ActionListener中调用模型的update方法,以便在计时器的每个滴答声中调用它,这样您就不需要while循环了。其他选项包括保留while true循环,但在后台线程中调用它,但是如果这样做,请注意仅在Swing事件线程上更新GUI
…很抱歉格式化了
我已经为你格式化了你的代码,但是为了将来的参考,你需要阅读本网站关于如何格式化问题和包含代码的帮助部分。也看看
其他随机想法:
关于计时器tm=新计时器1000,此;,我尽量避免让我的GUI类实现监听器接口,因为这会迫使类做太多的事情,从而打破单一责任原则。最好使用单独的侦听器类、分配侦听器的控制类或匿名内部类。
有关Swing线程问题的更多信息,请参阅
有关匿名内部类的更多信息,请再次删除while true位,改为尝试以下操作:
// note that TIMER_DELAY is a constant, and needs to be smaller than 1000, perhaps 20?
Timer tm = new Timer(TIMER_DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
updateFrame();
}
});
// the start call below can only be called inside of a method or a constructor
tm.start();
这些是部分代码,意味着如果您看到缺少某些内容,但似乎存在,比如ae.getSource,这意味着我已经实现了actionlistener juz,因为它太长了……为了更快地获得更好的帮助,请发布一个小型完整的可验证示例。欢迎回到Java!:很抱歉,它不会不断更新,但只会根据click@NicholasChoo我要看看你的JButton侦听器代码来帮你,sorry@NicholasChoo:请在此处张贴您的代码,以供所有人查看,不在pastebin中。@NicholasChoo:为了解决每次点击只更新的问题,请使用匿名内部ActionListener类作为计时器,正如我在回答中所建议的那样。把听众分开。例如,请查看对我的答案的编辑。