xuehan9527 发表于 2021-1-22 15:33

Java 细胞自动机 卡循环

本帖最后由 xuehan9527 于 2021-1-23 16:29 编辑

尝试写了个细胞自动机的程序, 但是在点了开始后 循环会卡死, 如果把循环注释掉, 手动一次一次的点开始, 程序正常
谁能帮忙看看原因? 循环在 yunxing 这个方法里

import java.awt.event.*;
import java.util.concurrent.TimeUnit;

public class Jianting implements ActionListener, MouseMotionListener {
    private boolean flag=false;
    private int shubiaoX,shubiaoY;
    private Xianshimianban xianshimianban;
    private Luoji panduan;

    public Jianting(Xianshimianban xianshimianban)
    {
      this.xianshimianban=xianshimianban;
      this.panduan= new Luoji();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      String mingling= e.getActionCommand();
      switch(mingling)
      {
            case "qingkong":
                xianshimianban.clean();
                xianshimianban.repaint();
                break;
            case "kaishi":
                this.flag=true;
                this.yunxing();
                break;
            case "tingzhi":
                this.flag=false;
                //System.out.println("停止");
                break;
      }
    }

    @Override
    public void mouseDragged(MouseEvent e) {

            this.shubiaoX = e.getX() / 16;
            this.shubiaoY = e.getY() / 16;
            //System.out.println("x: "+shubiaoX+", y:"+shubiaoY);
            if (this.shubiaoY < 50 && this.shubiaoX < 50) {
                xianshimianban.setgaibian(shubiaoX, shubiaoY);

            }

      //xianshimianban.repaint();
    }

    public void yunxing()
    {
      panduan.linshishuzu(xianshimianban.getXianshishuzu());
while(flag)
{
            try{
                panduan.zidongji(xianshimianban.getXianshishuzu());
                TimeUnit.MILLISECONDS.sleep(500);
                xianshimianban.setXianshishuzu(panduan.getShuzutmp());
            }catch(Exception e){}
}
    }

    @Override
    public void mouseMoved(MouseEvent e) {

    }

    public int getShubiaoX() {
      return shubiaoX;
    }

    public int getShubiaoY() {
      return shubiaoY;
    }
}

加上循环后的状态



去掉循环后运行状态:


感谢各位大佬, 问题找到了
感谢QQ群中 "rose的美少女粉丝" 以及各位关注这个的问题大佬 帮助








xuehan9527 发表于 2021-1-22 15:49

这是我画图使用的类:
import javax.swing.*;
import java.awt.*;

public class Xianshimianban extends JPanel {
    private int[][] xianshishuzu=null;

    public Xianshimianban()
    {
      xianshishuzu=new int;
      for(int i=0;i<50;i++)
      {
            for(int j=0;j<50;j++)
            {
                xianshishuzu=0;
            }
      }
    }
    public void paint (Graphics g)
    {
      super.paint(g);
      for(int i=0;i<50;i++)
      {
            for(int j=0;j<50;j++)
            {
                g.setColor(Color.WHITE);
                g.drawRect(i*16,j*16,16,16);
                if(xianshishuzu==0)
                {
                  g.setColor(Color.LIGHT_GRAY);
                  g.fill3DRect((i*16+1),(j*16+1),15,15,false);
                }else{
                  g.setColor(Color.BLACK);
                  g.fill3DRect((i*16+1),(j*16+1),15,15,true);
                }
            }
      }
    }

    public void clean()
    {
      for(int i=0;i<50;i++)
      {
            for(int j=0;j<50;j++)
            {
                xianshishuzu=0;
            }
      }
    }

    public void setgaibian(int x, int y)
    {
      xianshishuzu=1;
      this.repaint();
    }
    public int[][] getXianshishuzu() {
      return xianshishuzu;
    }

    public void setXianshishuzu(int[][] xianshishuzu) {
      this.xianshishuzu = xianshishuzu;
      this.repaint();
    }
}

c03xp 发表于 2021-1-22 16:10

貌似是Sleep阻塞进程了

堕落ぁ狼 发表于 2021-1-22 16:35

UI线程被阻塞了

马云爱逛京东 发表于 2021-1-22 16:37

说真的,你这个命名和代码编写我看着有点头大。。
你变量和类名要么用英文,要么都用汉字吧,拼音和英文看起来好难受啊。。。

Kiss灬唯 发表于 2021-1-22 16:53

catch了Exception 你就打印一下,还有就是 这个程序 debugger模式启动不行么?

xuehan9527 发表于 2021-1-22 17:33

本帖最后由 xuehan9527 于 2021-1-22 21:52 编辑

感谢各位大佬, 找到问题了
页: [1]
查看完整版本: Java 细胞自动机 卡循环