在for循环中使用thread.sleep

时间:2014-03-05 16:21:22

标签: java for-loop thread-sleep

如果它有任何区别,我正在使用eclipse。我想按一下按钮更新标签10次,我希望它在更新之间等待。我试图在for循环中使用thread.sleep,但是在for循环到达结束之前它不会更新标签。

代码接近。它还有更多代码来指定将标签更改为的内容。

for (int i = 0; i < 10; i++) {
    try{
        thread.sleep(250);
    }catch(InterruptedException ie) {
        return;
    }
    panel.repaint();
}

谢谢,这确实有帮助!

3 个答案:

答案 0 :(得分:1)

对于要更新的​​标签,主GUI事件循环必须轮到它。但我猜你的代码是在主线程中运行的,所以在你的代码完全完成之前不能进行重绘。

您需要做的是将您的睡眠循环放入单独的线程中。

对于此任务,SwingWorker类可能很有用。

答案 1 :(得分:0)

Swing有一个单独的线程(通常称为Swing线程),并且在该线程中发生所有按钮,重绘,处理,更新等。

这意味着如果您阻止该线程(例如通过在循环中休眠),那么在您完成之前它无法重绘屏幕。

您需要将工作分配到另一个线程,例如使用SwingWorker或用户Timer来安排更新。 Swing有一个Timer类,你可以使用它专为这种情况设计,只需告诉它每250ms回拨一次并在回调中进行更改。

答案 2 :(得分:0)

可能是我没有得到您的确切问题,否则以下是解决方案:

for (int i = 0; i < 10; i++) {
    try{
   panel.repaint();
        thread.sleep(250);
// Or here if you want to wait for 250ms before first update
    }catch(InterruptedException ie) {
        return;
    }
}

Thoguh SwingWorker是更好的选择。将逻辑移到SwingWorker线程上方。示例代码如下:

   class Task extends SwingWorker<Void, Void> {
        @Override
        public Void doInBackground() {
           for (int i = 0; i < 10; i++) {
               try{
                   panel.repaint();
                   thread.sleep(250);
                 // Or here if you want to wait for 250ms before first update
                  }catch(InterruptedException ie) {
                  }
           }
          return null;
        }

    /*
     * Executed in event dispatching thread
     */
    @Override
    public void done() {
      // Do something if you want at the end of all updates like turn off the wait cursor

    }
 }