createImageでnullが返る問題。

JPanelをインスタンスにした時点ではpeerが無いので、
createImageをしてもnullが返る。

pack()やshow()するとどうやらpeerが作成するらしいので、
その後にcreateImageをすれば多分問題ない。

参考

http://hiloshi.nce.buttobi.net/tips/gui/createimage.html
import javax.swing.JFrame;

public class MainFrame extends JFrame{

	private static final long serialVersionUID = 1L;
	private static MainFrame instance = null;
	private final static String TITLE = "title";

	private MainFrame() {
	}

	public void showFrame() {
		setTitle(TITLE);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		Screen screen = new Screen();

		add(screen);
		pack();// ここでpeerができるらしい

		setResizable(false);
		setVisible(true);

		screen.make();// ここでcreateImage()
	}

	public static MainFrame getInstance() {
		if(instance == null) {
			instance = new MainFrame();
		}
		return instance;
	}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

public class Screen extends Panel implements Runnable{

	private static final long serialVersionUID = 1L;
	private final static int WIDTH = 400;
	private final static int HEIGHT = 400;

	private Thread thread = null;
	private int count;

	// ダブルバッファ用
	private Graphics g;
	private BufferedImage backImage = null;


	public Screen() {
		setPreferredSize(new Dimension(WIDTH, HEIGHT));
	}

	public void make() {
		// コンストラクタでcreateImageするとココでnullが返る
		backImage = (BufferedImage)createImage(WIDTH, HEIGHT);
		// nullPointerException
		g = backImage.getGraphics();

		count = 0;

		thread = new Thread(this);
		thread.start();
	}

	public void run() {
		while (true) {
			// ここらへんはてきとう。
			count++;

			g.setColor(Color.BLACK);
			g.fillRect(0, 0, WIDTH, HEIGHT);

			g.setColor(Color.WHITE);
			g.drawString(count+"", count%WIDTH, count%HEIGHT);

			{
				Graphics g = getGraphics();
				g.drawImage(backImage, 0, 0, null);
				Toolkit.getDefaultToolkit().sync();
				g.dispose();
			}

			System.out.println(count);
			try {
				Thread.sleep(100);
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}