我创建了一个简单的Java程序,它使用Thread对象在JPanel周围移动一个方块。方块移动到随机位置,更改其颜色,JPanel更改其背景颜色。然后线程休眠1000毫秒。但后来又添加了一行代码,为JLabel增加了+1,并且方块停止移动(当分数正在工作并添加+1时)。
以下是代码:
@Override
public void run() {
Random random = new Random();
int width = 0;
int height = 0;
while(true) {
width = random.nextInt(area.getSize().width) + 1;
height = random.nextInt(area.getSize().height) + 1;
width -= ((width - 45) > 0) ? 45 : 0;
height -= ((height - 45) > 0) ? 45 : 0;
this.square.setLocation(width, height);
this.square.setIcon(new ImageIcon(getClass().getResource("/img/square" + (random.nextInt(4) + 1) + ".png")));
this.area.setBackground(new Color(random.nextInt(255) + 1, random.nextInt(255) + 1, random.nextInt(255) + 1));
//The following line works, but the setLocation method stops working.
this.score.setText(Integer.toString(Integer.parseInt(this.score.getText()) + 1));
try {
sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(RunThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
有什么想法吗?
感谢。
编辑:这就是我创建线程的方式......
public Click() {
initComponents();
pack();
setLocationRelativeTo(null);
setVisible(true);
RunThread run = new RunThread(jLabel1, jLabel2, jPanel1);
run.run();
}
答案 0 :(得分:5)
调用
中的run()方法
哪个错了。这不是如何使用Thread
。如果您调用run()
方法,那么它就像任何其他方法一样处理,并且您没有使用Thread
。因此,无论何时使用Thread.Sleep(...)
,都会导致Event Dispatch Thread(EDT)
进入睡眠状态,这意味着GUI无法重新绘制。
使用Thread
。您需要在start()
上调用Thead
方法,因此代码应为:
run.start();