0

最近、Java 2D のコーディングを始めました。

私はこれを作りました:

    public void paintComponent(Graphics comp) {
         Graphics2D comp2D = (Graphics2D) comp;
         Font fontx = new Font("Verdana", Font.BOLD, 5);
         comp2D.setFont(fontx);
         comp2D.drawString("Hello World!", 5, 50);
}  

JFrame と java.awt.* をインポートしましたが、まだ問題があります。

実行すると、次のようになります。

    Exception in thread "main" java.lang.NullPointerException
    at game.Game.paintComponent(Game.java:41) - comp2D.setFont(fontx); - Sets Font
    at game.Game.next(Game.java:36) - paintComponent(null); - calls the paintComponent public void from the next() public void
    at game.Game.main(Game.java:26) - next.next(); - calls a public void called "next" using an object called "next" (this public void throws InterruptedException)
Java Result: 1

どうすれば解決できますか?

4

1 に答える 1

4

あなたは次のように述べています:

Exception in thread "main" java.lang.NullPointerException
at game.Game.paintComponent(Game.java:41) -  
    comp2D.setFont(fontx); - Sets Font

これは、comp2D が null であり、null 変数でメソッドを呼び出そうとしていることを意味します。

at game.Game.next(Game.java:36) - paintComponent(null); 
     - calls the paintComponent public void from the next() public void

これは、paintComponent を直接呼び出して null を渡すことを意味します。

つまり、paintComponentを直接呼び出して null を渡しています。Graphics オブジェクトが null であり、メソッドを呼び出そうとすると NPE がスローされることは当然のことです。

解決:

  • paintComponent を直接呼び出すことはほとんどありません。
  • 代わりに、repaint() を呼び出すときに JVM にそれを呼び出させます。JVM は有効な Graphics オブジェクトを渡します。
  • 最も重要なことは、Swing チュートリアルを使用した絵画を読むことです。このようなことを推測して、それが機能することを期待することはできません。
  • paintComponent メソッドが JPanel または他の JComponent 派生コンポーネント内に保持されていることを確認してください。
  • @OverridepaintComponentのアノテーションを使用して、オーバーライドが有効であることを確認してください。
  • super.paintComponent(...)オーバーライド内でメソッドを呼び出すことを怠らないでください。
  • たとえば、他のメソッドにクラス フィールドを変更させます。たとえば、text という名前の String フィールドを変更させてから、 を呼び出しrepaint()てから、paintComponent(...)メソッドに text フィールドを使用してテキストを JPanel に出力させます。これはほんの一例です。描画コンポーネントの任意のフィールドを変更して、 内で使用できますpaintComponent(...)
于 2013-10-06T18:07:35.197 に答える