所以我正在编写一个针对玩家玩Reversi / Othello的程序。我写了一个方法来制作片段翻转的简短动画 -
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方法正在混淆。我认为这是因为有些线程将颜色设置为绿色,一些设置为黑色,一些设置为白色。我该如何解决这个问题?
答案 0 :(得分:7)
您应该在从主程序创建的专用线程中运行此方法。
答案 1 :(得分:3)
在这种情况下,您应该在单独的flip
中运行Thread
。最简单的例子:
Thread t = new Thread(new Runnable() {
public void run() {
flip();
}
});
t.start();
答案 2 :(得分:3)
您的目标是异步编程:安排javax.swing.Timer
每次触发时执行一个动画步骤。这将是GUI程序的惯用方法;使用单独的线程在一个循环中休眠并在每个步骤中使用invokeLater
的方法也可以工作,但不太优雅,因为它使用了更多的系统资源(另一个主要只是睡觉的线程)。
答案 3 :(得分:1)
您需要创建一个处理动画的单独线程。该线程可以调用Thread#sleep
,因为Thread#sleep
不会暂停&#34;整个程序&#34;,而只是当前线程。在动画的每一步,它应该改变一些状态,指示片段翻转动画的当前阶段,然后请求重新绘制。