线程运行不正常

时间:2016-11-26 23:47:45

标签: java multithreading swing

我创建了一个简单的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();

}

1 个答案:

答案 0 :(得分:5)

  

调用

中的run()方法

哪个错了。这不是如何使用Thread。如果您调用run()方法,那么它就像任何其他方法一样处理,并且您没有使用Thread。因此,无论何时使用Thread.Sleep(...),都会导致Event Dispatch Thread(EDT)进入睡眠状态,这意味着GUI无法重新绘制。

使用Thread。您需要在start()上调用Thead方法,因此代码应为:

run.start();