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的美少女粉丝" 以及各位关注这个的问题大佬 帮助
这是我画图使用的类:
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();
}
}
貌似是Sleep阻塞进程了 UI线程被阻塞了 说真的,你这个命名和代码编写我看着有点头大。。
你变量和类名要么用英文,要么都用汉字吧,拼音和英文看起来好难受啊。。。 catch了Exception 你就打印一下,还有就是 这个程序 debugger模式启动不行么? 本帖最后由 xuehan9527 于 2021-1-22 21:52 编辑
感谢各位大佬, 找到问题了
页:
[1]