2

所以我正在编写一个程序,它可以对一名球员播放黑白棋/黑白棋。我写了一个方法来制作片段翻转的简短动画-

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 暂停了整个程序,它一次只能翻转一个。我可以做些什么来暂停该方法而不中断程序的其余部分吗?

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

4

4 回答 4

7

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

于 2013-01-16T20:03:40.553 回答
3

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

Thread t = new Thread(new Runnable() {
    public void run() {
        flip();
    }
});
t.start();
于 2013-01-16T20:07:01.373 回答
3

您的目标是异步编程:安排一个javax.swing.Timer,每次触发时,执行一个动画步骤。这将是 GUI 程序的惯用方式;在循环中休眠并在每个步骤中使用的单独线程的方法invokeLater也将起作用,但不太优雅,因为它使用更多系统资源(另一个主要只是休眠的线程)。

于 2013-01-16T20:07:47.230 回答
1

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

于 2013-01-16T20:07:23.110 回答