れんだらー

JTableなどでおなじみのレンダラーの尻尾をつかみました。
どうもSwingはL&Fの仕組みのせいでわかりづらい。

import java.awt.*;
import javax.swing.*;

public class RendererTest extends JPanel {
      JLabel renderer = new JLabel();
      RendererTest() {
            this.setLayout(null);
            renderer.setDoubleBuffered(false);
      }
      public void paintComponent(Graphics g) {
            this.add(renderer);
            for (int y=0; y<10; y++) {
                  for (int x=0; x<10; x++) {
                        renderer.setText("("+x+","+y+")");
                        renderer.setHorizontalAlignment(JLabel.CENTER);
                        renderer.validate();
                        renderer.setBounds(x*100, y*20, 100, 20);
                        Graphics cg = g.create(x*100, y*20, 100, 20);
                        try {
                              renderer.paint(cg);
                        }
                        finally {
                            cg.dispose();
                        }
                        renderer.setBounds(-100, -20, 0, 0);
                  }
            }
            this.remove(renderer);
      }

      public static void main(String[] args) {
            JFrame frame = new JFrame();
            RendererTest test = new RendererTest();
            frame.getContentPane().add(test);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(640, 480);
            frame.setVisible(true);
      }
}

註:多分、サンプルとしても完成度が低いです。
(2006-02-05追記)これだと再描画が無限に続きます。これではダメです。