我已经创建了一个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(),但我不太清楚如何做到这一点。
答案 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
上的部分看起来与您想要的相似。