最も古いデータを捨てるリスト #3

適当に応用。

EverchangingPane.java
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.Ellipse2D;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class EverchangingPane extends JComponent {
    private class AttributedShape {
        final Shape shape;
        final Stroke drawStroke;
        final Paint drawPaint;
        final Paint fillPaint;

        AttributedShape(Shape shape, Stroke drawStroke, Paint drawPaint, Paint fillPaint) {
            this.shape = shape;
            this.drawStroke = drawStroke;
            this.drawPaint = drawPaint;
            this.fillPaint = fillPaint;
        }
    }

    private LRAList<AttributedShape> list = new LRAList<AttributedShape>(20);
    private Random random = new Random();

    public EverchangingPane() {
        setDoubleBuffered(true);
        setPreferredSize(new Dimension(640, 400));
    }

    private static final Stroke[] STROKE = {new BasicStroke(1), new BasicStroke(3), new BasicStroke(5)};
    private static final Paint[] PAINT = {Color.RED, Color.BLUE, Color.GREEN, new GradientPaint(0, 0, Color.RED, 100, 100, Color.BLUE, true)};

    public void updateShapes() {
        int x = random.nextInt(600), y = random.nextInt(360), w = random.nextInt(640 - x), h = random.nextInt(400 - y);
        list.add(new AttributedShape(
            random.nextInt(2) == 0 ? new Rectangle(x, y, w, h) : new Ellipse2D.Double(x, y, w, h),
            STROKE[random.nextInt(STROKE.length)],
            PAINT[random.nextInt(PAINT.length)],
            PAINT[random.nextInt(PAINT.length)]
        ));
    }

    @Override
    public void paintComponent(Graphics g) {
        if (! (g instanceof Graphics2D)) return;
        Graphics2D g2 = (Graphics2D)g;
        for (AttributedShape s : list) {
            g2.setPaint(s.fillPaint);
            g2.fill(s.shape);
            g2.setStroke(s.drawStroke);
            g2.setPaint(s.drawPaint);
            g2.draw(s.shape);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                final EverchangingPane e = new EverchangingPane();
                f.add(e);
                f.pack();
                f.setVisible(true);
                new Timer(true).schedule(new TimerTask() {
                    @Override
                    public void run() {
                        e.updateShapes();
                        e.repaint();
                    }
                }, 1000, 200);
            }
        });
    }
}