2013-01-16 106 views
2

因此,我正在编写一个可以对玩家玩黑白棋/黑白棋的程序。我写了一个方法,使作品的动画短片flipping-如何让方法暂停而不暂停整个程序?

public void flip(int row, int col, Graphics window) 
{ 
Color a; 
if (pieces[row][col]==1) 
    a = Color.black; 
else 
    a = Color.white; 
for (int size = 90; size>0; size-=2) 
{ 
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){} 
    window.setColor(new Color(0, 100, 0)); 
    window.fillRect(row*100+3, col*100+3, 94, 94); 
    window.setColor(a); 
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size); 
} 
if (a==Color.black) 
    a=Color.white; 
else 
    a=Color.black; 
for (int size = 0; size<90; size+=2) 
{ 
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){} 
    window.setColor(new Color(0, 100, 0)); 
    window.fillRect(row*100+3, col*100+3, 94, 94); 
    window.setColor(a); 
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size); 
} 
} 

它工作得很好,看上去很不错,但问题是,由于暂停了Thread.Sleep整个程序,它只能在翻转一块时间。有没有什么我可以做,暂停这种方法,而不会中断程序的其余部分?

谢谢大家。新的线程工作,但现在我有一个不同的问题。 flip方法中的三种setcolor方法正在混淆。我认为这是因为一些线程将颜色设置为绿色,一些变为黑色,一些变为白色。我该如何解决?

回答

3

在这种情况下,您应该在单独的Thread中运行flip。最简单的例子:

Thread t = new Thread(new Runnable() { 
    public void run() { 
     flip(); 
    } 
}); 
t.start(); 
7

您应该在您的主程序创建的专用线程内运行此方法。

+1

+1不要做任何可能在GUI线程中花费大量时间的事情。始终将此工作传递给antoher线程,并使用SwingUtils.invokeLater从另一个线程更新GUI。 –

1

您需要创建一个单独的线程来处理动画。该线程可以调用Thread#sleep,因为Thread#sleep不会暂停“整个程序”,而只是当前线程。在动画的每一步中,它应该改变一些状态来指示片段翻转动画的当前阶段,然后请求重绘。

3

你的目标是异步编程:安排一个javax.swing.Timer,每次启动时,执行一个动画步骤。这将是GUI程序的惯用方式;一个单独的线程睡眠在一个循环中,并且在每个步骤中都使用invokeLater也可以工作,但不太优雅,因为它使用了更多的系统资源(另一个线程大多只是睡眠)。