带有更改图标的螺纹JLabel,在另一个更改图标上方

时间:2015-04-05 01:57:23

标签: java multithreading swing paintcomponent

我已经创建了一个JLabel,它的图像会像这样在两帧之间来回变换。

private class CustomLabel extends JLabel implements Runnable
{       
    ImageIcon car1=new ImageIcon(/*icon*/);//makes the wave equal to the wave in outer class (passing reference)
    ImageIcon car2=new ImageIcon(/*icon*/);
    ImageIcon currentCar;
    int current=0;


    public CustomLabel()
    {
        if(x>0 && y<11)setIcon(wave1);

        new Thread(this).start();//am i starting this right?
    }

    @Override
    public void run()
    {
       while (true) 
       {
        if(current == 0)
        {
        setIcon(wave1); 
        current++;
        }
        else
        {
         setIcon(wave2);
         current--;
        }
        repaint();
        try { Thread.sleep(150); }
        catch (InterruptedException e) { }
       }
   }
}

因此,当我添加这个JLabel时,它将在两张汽车图片之间交替。 首先,我是通过在构造函数中启动它来正确启动线程的吗?

现在让我们说我希望在汽车顶部有另一个动画,那就是当我点击JLabel时发生的5帧爆炸动画。如何在当前动画上覆盖第二个线程动画。我觉得我需要覆盖paintComponent(),但我不太清楚如何做到这一点。

2 个答案:

答案 0 :(得分:2)

是的,您正在正确启动线程,但是您正在后台线程中进行Swing状态更改调用,setIcon(...)以及 存在风险。

我自己,我使用Swing Timer来驱动我的动画和定时器,其ActionListener中的所有调用都将在Swing事件线程上进行,从而实现更安全的循环。我不确定我是否会为此扩展JLabel,因为我没有改变任何类的天生行为。相反,我会使用JLabel。

我还要在我的标签上添加一个MouseListener,在mousePressed上,我会停止这个Timer并启动爆炸动画Timer。

答案 1 :(得分:2)

您应该可以使用JLayer在标签上绘制不同的图像(图标)。

阅读How to Decorate Components With the JLayer Class上的Swing教程中的部分。 Animating a Busy Indicator上的部分看起来与您想要的相似。