为Jlabel更新图像时很奇怪

时间:2011-12-11 02:56:17

标签: java jlabel

我正在处理一项正在处理的任务。

部分原因是“动画”一对模具的滚动。我有6个JPEGS,每个边都有一个。而不是滚动,我希望它循环通过图像。我试图在循环中反复使用setIcon,并使用Thread.sleep()进行延迟。除其他外,这一切都发生在用户点击按钮(事件)时。它不会显示图像,而是等待正确的时间并仅显示最后一张图像。这是我正在调用的函数来执行循环:

private void aniRoll(){
    for(int i = 0; i < 10; i++){
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));
        try{
            Thread.sleep(1000); // Sleep for 1 sec
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face3.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face4.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face5.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face6.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}

    }

}

die1Disp是我的JLabel的名称,aniRoll()是我正在调用以执行循环的函数(私有,因为我不想在我的GUI类之外调用它),以及faceX.jpg是我的形象。

我无法理解的是无论我把Thread.sleep()放在哪里,它都会先延迟程序,然后只显示最后一张图像。例如:

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));

//bunch of extra code

try{
    Thread.sleep(10000); // Sleep for 10 sec
}
catch(InterruptedException e){}

这将等待10秒钟,然后仅显示第二张图像。它不会快速显示第一个,显示第二个,然后等待,它等待,只显示第二个图像。这个怪癖让我感到困惑,我不知道如何纠正它。我正在使用NetBeans IDE 7.01作为编辑器,并使用Component Palette进行基本布局和代码生成。

- 由于

2 个答案:

答案 0 :(得分:3)

首先,您必须在gui线程上进行更改。参见

SwingUtils.invokeLater。

Thread.sleep也不会削减它,你应该使用javax.swing.Timer指定何时切换图标。

答案 1 :(得分:1)

有一个UI线程管理事件和重新绘制(更新屏幕)。你让它入睡。这样做意味着在它醒来之前不会发生任何其他事情(关于UI)。

在actionPerformed方法中,启动一个将进行重新绘制的新线程。那应该解决它。