4

ヘッドレス環境で実行され、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)

編集:私はこれを調査しましたが、満足のいく解決策を見つけることができませんでした。

4

1 に答える 1

1

niduが最初に言ったが、彼が答えないので私はそれを置いた。

おそらくコンストラクターメソッドでsuper()を呼び出しており、JPanelコンストラクターは表示が設定される前に再描画しようとしています。

于 2012-12-17T20:01:37.713 に答える