Java 康威《生命游戏》的不断更新

Java 康威《生命游戏》的不断更新,java,swing,animation,graphics,Java,Swing,Animation,Graphics,我很难点击一个按钮,不断更新康威的生活游戏。因此,我首先要给出生活游戏中的规则,并模拟和计算计数器的位置。然后通过将背景颜色设置为JButton来更新帧,然后延迟并重复。但问题是,当我按下开始按钮时,由于我试图使用while循环,它被卡住了 有一个单独的软件包叫做AI_处理器,它只是模拟和计算,所有的工作都正确完成,只是更新遇到了一些问题 代码部分: public void updateFrame() { AI.AI_Movement_Update(); addColour(); }

我很难点击一个按钮,不断更新康威的生活游戏。因此,我首先要给出生活游戏中的规则,并模拟和计算计数器的位置。然后通过将背景颜色设置为JButton来更新帧,然后延迟并重复。但问题是,当我按下开始按钮时,由于我试图使用while循环,它被卡住了

有一个单独的软件包叫做AI_处理器,它只是模拟和计算,所有的工作都正确完成,只是更新遇到了一些问题

代码部分:

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类作为计时器,正如我在回答中所建议的那样。把听众分开。例如,请查看对我的答案的编辑。