我正在使用Java Swing编写游戏。我希望每次循环执行时都会绘制一个小延迟,以在屏幕上创建级联效果。我相信系统中的效率例程会将对repaint()
的调用折叠成单个调用。无论如何,在总延迟之后,所有变化都会立即发生。有没有办法强制系统立即重绘,然后延迟循环的每次迭代?
我的代码:
for(int i=0;i<10;i++){
JButton[i].setBackground(Color.WHITE);
JButton[i].repaint();
Thread.sleep(2000);
JButton[i].setBackground(Color.GRAY);
JButton[i].repaint();
}
答案 0 :(得分:6)
您可以使用JComponent.paintImmediately
强制立即重新绘制。
编辑:再次阅读你的问题后,我发现你可能正在事件发送线程上执行你的逻辑。这意味着重复请求将在您的方法返回之后才会执行。如果你把你的代码放到另一个线程中,那么这可能会解决问题,并且比使用paintImmediately
要好得多。
void uiFunction() {
new Thread() {
public void run() {
for(int i = 0; i < 10; i++) {
final JButton b = buttons[i];
SwingUtilities.invokeLater(new Runnable() {
b.setBackground(Color.WHITE);
b.repaint();
}
Thread.sleep(2000);
SwingUtilities.invokeLater(new Runnable() {
b.setBackground(Color.GRAY);
b.repaint();
}
}
}
}.run();
}
这有点笨拙,但希望它能让你知道从哪里开始。
答案 1 :(得分:2)
不确定我是否在正确的轨道上,但这是一个线程问题?因为睡眠将使当前线程进入睡眠状态。因此,如果重绘在当前线程上,您将有效地排队重新绘制,持有,然后排队另一个重绘。然后该方法结束并且图形线程的事件处理循环触发,执行两次重绘(折叠)使一切都立即发生。
根据这个想法,我认为你可能有两种选择:
将代码放在第二个线程上,这样它就不会停止主图形线程,也因为这意味着图形线程会在睡眠发生时重新绘制。
在你睡觉之前(我不会真的推荐),触发事件循环以强制重绘。我得看看这个。不记得如何做到这一点。 : - )
我可能会认为#1是最好的选择。