Java 在for循环中使用thread.sleep

Java 在for循环中使用thread.sleep,java,for-loop,thread-sleep,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) { re

我正在使用eclipse,如果它能带来任何不同的话。我试图更新一个标签10次在按下一个按钮,我希望它等待之间的更新。我正在尝试在for循环中使用thread.sleep,但在for循环结束之前,它不会更新标签

代码接近于。它还包含更多的代码来指定将标签更改为什么

for (int i = 0; i < 10; i++) {
    try{
        thread.sleep(250);
    }catch(InterruptedException ie) {
        return;
    }
    panel.repaint();
}
for(int i=0;i<10;i++){
试一试{
睡眠(250);
}捕获(中断异常ie){
返回;
}
panel.repaint();
}

谢谢,这真的很有帮助

要更新标签,必须轮到主GUI事件循环。但是我猜你的代码是在主线程中运行的,所以在你的代码完全完成之前,重画是不会发生的

你需要做的是把睡眠循环放到一个单独的线程中

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

Swing有一个线程(通常称为Swing线程),所有按钮的按下、重画、处理、更新等都发生在该线程中

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


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

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

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;
    }
}
for(int i=0;i<10;i++){
试一试{
panel.repaint();
睡眠(250);
//如果您想在第一次更新前等待250毫秒,请单击此处
}捕获(中断异常ie){
返回;
}
}
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

    }
 }
类任务扩展SwingWorker{
@凌驾
公共无效doInBackground(){
对于(int i=0;i<10;i++){
试一试{
panel.repaint();
睡眠(250);
//如果您想在第一次更新前等待250毫秒,请单击此处
}捕获(中断异常ie){
}
}
返回null;
}
/*
*在事件调度线程中执行
*/
@凌驾
公众假期结束(){
//如果您想在所有更新结束时执行某些操作,例如关闭等待光标
}
}

发布更多代码,特别是更新laabel的位置和方式。请格式化您的代码。@user3258139作为测试,您可以在循环之前说
System.out.println(SwingUtilities.isEventDispatchThread())
。如果它说
true
,那么您的循环正在事件调度线程上运行,并阻止任何GUI事件发生。