最も古いデータを捨てるリスト #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); } }); } }