ヘッドレス環境で実行され、BufferedImage
画面ではなく出力する必要があるアプリを作成しています。をDisplay
管理するクラスがありBufferedImage
ます。私のアプリは拡張JPanel
されており、コンポーネントが更新されたときに自動的に再描画するために、次のように再実装repaint()
しました。
public void repaint(){
Graphics2D g = getDisplay().getGraphics();
paint(g);
getDisplay().repaint();
}
ただし、アプリを起動するたびに、NullPointerException
に描画しようとするとが表示されDisplay
ます。これはおそらく、JPanel
再描画を試みるコンストラクター内のコードです。問題は、getDisplay()
nullを返すことです。ただし、この時点でDisplay
はすでにインスタンス化されてアプリに渡されています。Display
アプリに送信する前に、作成時に独自のプロパティを印刷することでこれを確認しました。
例外は次のとおりです。一番上の場所は、以下を含む行を指しますgetDisplay()
。
Exception in thread "main" java.lang.NullPointerException
at com.mypapyri.clay.ui.App.repaint(App.java:28)
at javax.swing.JComponent.setFont(JComponent.java:2746)
at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:208)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
at javax.swing.JComponent.setUI(JComponent.java:655)
at javax.swing.JPanel.setUI(JPanel.java:153)
at javax.swing.JPanel.updateUI(JPanel.java:126)
at javax.swing.JPanel.<init>(JPanel.java:86)
at javax.swing.JPanel.<init>(JPanel.java:109)
at javax.swing.JPanel.<init>(JPanel.java:117)
at com.mypapyri.clay.ui.App.<init>(App.java:18)
at ClayOS.<init>(ClayOS.java:22)
at ClayOS.main(ClayOS.java:84)
編集:私はこれを調査しましたが、満足のいく解決策を見つけることができませんでした。
- repaint()メソッドとGUIスレッド
- コンポーネントのJavadoc
- PaintManagerとRepaintManager