2011-10-09 77 views
1

我正在ChessBoard Game上做一个演示。我想你一定知道它。我遇到过什么问题。结果只是显示得很快。我想看看它是如何缓慢运行的。Java:我如何等待updateUI?

下面是主要代码:

public void ChessBoard(int tr, int tc, int dr, int dc, int size) throws InterruptedException { 
     if (size == 1) { 
      return; 
     } 
     Random rd = new Random(); 
     float red = rd.nextFloat(); 
     float green = rd.nextFloat(); 
     float blue = rd.nextFloat(); 
     Color col = new Color(red, green, blue); 
     int s = size/2; 
     if (dr < tr + s && dc < tc + s) { 
      ChessBoard(tr, tc, dr, dc, s); 
     } else { 
      button[tr + s - 1][tc + s - 1].setBackground(col); 
      ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s); 
     } 
     if (dr < tr + s && dc >= tc + s) { 
      ChessBoard(tr, tc + s, dr, dc, s); 
     } else { 
      button[tr + s - 1][tc + s].setBackground(col); 
      ChessBoard(tr, tc + s, tr + s - 1, tc + s, s); 
     } 
     if (dr >= tr + s && dc < tc + s) { 
      ChessBoard(tr + s, tc, dr, dc, s); 
     } else { 
      button[tr + s][tc + s - 1].setBackground(col); 
      ChessBoard(tr + s, tc, tr + s, tc + s - 1, s); 

     } 
     if (dr >= tr + s && dc >= tc + s) { 
      ChessBoard(tr + s, tc + s, dr, dc, s); 
     } else { 
      button[tr + s][tc + s].setBackground(col); 
      ChessBoard(tr + s, tc + s, tr + s, tc + s, s); 
     } 


     mainPanel.updateUI(); 
     for (long i=1;i<10000;i++){ 
      for (long j=0;j<10000;j++){ 
       i+=1; 
       i-=1; 
      } 
     } 

    } 

但结果只是在一瞬间变成了似乎mainPanel中并没有完成其工作。 mainJanel是一个JPanel对象。

+0

也许你应该把用不同的方法绘制动画的不同部分的代码,然后,一次一个地调用它们,并在两者之间进行睡眠?那是你的追求? –

回答

3

我也开始处添加的睡眠,但只有进展缓慢下来,似乎没有任何与显示出来

看来你的代码是在执行事件调度线程。你永远不要告诉EDT睡觉()。这可以防止GUI重新绘制自己。有关更多信息,请参阅Concurrency的Swing教程部分。

相反,您应该使用摆动计时器来安排每个动作的动画。该教程还有一个关于定时器的部分。

+0

非常感谢你的建议!我正在尝试:) –

0

只需使用Thread.sleep(/* time in milliseconds */)即可减慢执行速度。

+0

进度放慢。但结果仍然突然出现。所有的按钮在一秒钟内改变了颜色。 –

+0

您必须使用mainPanel.redraw()作为“Francisco Puga”提到的每一步。 – MasterCassim

+0

是的。我已经更改为repaint()。我也在开始时加入睡眠,但只有进度放慢,似乎与放映无关。 –

2

updateUI用于更改组件的外观&。要重画面板的内容,您应该使用

mainPanel.repaint() 
+0

是的,我犯了一个愚蠢的错误... –

+0

+1,欢迎来到论坛。 – camickr

0

使用sleep停止执行。

public class SleepMessages { 
    public static void main(String args[]) throws InterruptedException { 
     String importantInfo[] = { 
      "Mares eat oats", 
      "Does eat oats", 
      "Little lambs eat ivy", 
      "A kid will eat ivy too" 
     }; 

     for (int i = 0; i < importantInfo.length; i++) { 
      //Pause for 4 seconds 
      Thread.sleep(4000); 
      //Print a message 
      System.out.println(importantInfo[i]); 
     } 
    } 
} 

这样它会你的程序慢下来。

//Pause for 4 seconds 
    Thread.sleep(4000); 
+0

这个例子适用于它。然而它只能减慢进度而不是结果的速度 –