Создадим свой компонент (виджет) для демонстрации анимации:
1) Создадим класс, который унаследуем от JComponent и который будет реализовывать интерфейс ActionListener
2) Реализуем конструктор, который будет принимать изображения для анимации
3) Реализуем методы для рисования и перерисовки (перерисовка будет запускаться по таймеру)
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
public class JAnimatedImage extends JComponent implements ActionListener {
protected final ArrayList<Image> images = new ArrayList<>();
protected int currentImage = 0;
protected Timer timer;
public JAnimatedImage(Image ... images) {
this.images.addAll(Arrays.asList(images));
this.timer = new Timer(100, this);
timer.start();
}
@Override
public void paint(Graphics g) {
g.drawImage(images.get(currentImage), 0, 0, this);
}
@Override
public void actionPerformed(ActionEvent e) {
currentImage = (currentImage + 1) % images.size();
repaint();
}
}
Пример использования в классе приложения
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.File;
public class Main {
public static Image loadImage(String fileName){
File file = new File(fileName);
try {
return ImageIO.read(file);
} catch (Exception e){
throw new RuntimeException();
}
}
public static void main(String[] args) {
JFrame window = new JFrame();
window.setSize(800, 600);
window.setLayout(null);
JAnimatedImage animatedLabel = new JAnimatedImage(
loadImage("img1.png"),
loadImage("img2.png")
);
animatedLabel.setBounds(10, 10, 300, 300);
window.add(animatedLabel);
window.setVisible(true);
}
}