如何在计时器结束后以重复结构设置标签位置?

时间:2017-04-12 10:19:22

标签: java swing timer jlabel

我有这段代码。它会在棋盘上移动一个棋子。

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++;
}

同样的结果。

2 个答案:

答案 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();

现在按预期工作。