我应该在java swing程序中使用thread.sleep在哪里?

时间:2012-02-08 13:58:07

标签: java swing

现在我编写了一个用于swing程序的方法,该方法应该减慢调用它所调用的方法的速度(通过thread.sleep(x)),而不是减慢刷新的速度它只是导致整个程序挂起,并在方法执行结束时刷新屏幕。

这是我的代码:

public final void doBubbleSort(String numbers[], JButton numButton[]){
for (int k = 0; k < numbers.length - 1; k++){  
  String str1 = "";
  boolean isSorted = true;  

  for (int i = 1; i < numbers.length - k; i++){  
     if (Integer.parseInt(numbers[i]) < Integer.parseInt(numbers[i - 1])  ){  
        try{
        String tempVariable = numbers[i];  
        numbers[i] = numbers[i - 1];  
        numbers[i - 1] = tempVariable;  
        isSorted = false; 
        str1 = numButton[i].getText();
        numButton[i].setText(numButton[i-1].getText());
        Thread.sleep(100);
        }catch(Exception e){ System.err.println("Error: " +e.getMessage()); }
        numButton[i-1].setText(str1);
     }   
  }  

  if (isSorted)  
     break;  

}

}

如果有人可以告诉我应该在哪里放置thread.sleep()以使其延迟显示正在交换的项目,我将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:4)

你不能通过在这样的事件处理程序中放置一个循环来做动画。 必须通过显式或使用javax.swing.Timer类使用单独的线程来执行此操作。如果您正在循环并在事件线程上休眠,那么在循环运行的整个过程中,事件线程将无法执行其他任务,例如绘制屏幕。

有关使用Swing计时器类的信息,请参阅this article

答案 1 :(得分:4)

你永远不应该在事件派遣线程中睡觉。

  1. 创建模型,(在您的情况下为列表)
  2. 创建视图(你的摇摆gui)
  3. 确保模型更改后更新视图(例如,通过添加侦听器
  4. 创建一个单独的帖子,定期更新模型(如果您愿意,可以使用Thread.sleep
  5. 更改“速度”时更改更新程序线程的休眠时间
  6. 您可能希望查看Timer类(为定期执行操作提供更好的界面)或Swing Workers。