我有这段代码。它会在棋盘上移动一个棋子。
while(i<end)
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
System.out.println(e);
}
Label.setBounds(x+i, y, xsize, ysize);
i++;
}
我的问题:
在经过所有时间(end
秒)之后,Label仅被设置一次。
也尝试过:
1:
while(i<end)
{
for(int v;v<9999999;v++);
Label.setBounds(x+i, y, xsize, ysize);
i++;
}
2:
while(i<end)
{
for(int v;v<9999999;v++)
{
Label.setBounds(x+i, y, xsize, ysize);
}
i++;
}
同样的结果。
答案 0 :(得分:2)
只有在经过所有时间(结束秒数)后,Label才会被设置一次。
问题是从Thread.sleep(...)
调用了Event Dispatch Thread (EDT)
,这阻止了GUI重新绘制,直到循环执行完毕。
请勿在{{1}}上使用Thread.sleep()
。
阅读Concurrency上Swing教程中的部分,了解有关为何会发生这种情况的更多信息。
简单的解决方案是使用EDT
来安排事件。本教程还有一个关于Swing Timer
的部分,其中包含一个可以帮助您入门的工作示例。
答案 1 :(得分:2)
阅读Concurrency上Swing教程中的部分,了解有关为何会发生这种情况的详细信息。
使用javax.swing.Timer
我将代码修改为此格式:
int delay = 1000;
ActionListener taskPerformer = (ActionEvent evt) ->
{
Label.setBounds(x+1, y, xsize, ysize);
if(condition)
{
timer.stop();
}
};
timer = new Timer(delay, taskPerformer);
timer.setRepeats(true);
timer.start();
现在按预期工作。