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 } } } }