2011-10-13 10 views
0

簡単な描画プログラムを作成したいと思います。ここで Graphics2Dオブジェクトは常にNullPointerExceptionを返します

I私のプログラムののmousePressedとmouseDraggedイベント:私は、メソッドpaintComponentをオーバーライド graphics2D.drawLine(touch.x, touch.y, p.x, p.y);

この行の

private void mousePressed(java.awt.event.MouseEvent evt) { 
    touch = evt.getPoint(); 
    pressed = true; 
} 


private void mouseDragged(java.awt.event.MouseEvent evt) { 
    Point p = evt.getPoint(); 
    if(pressed){ 
     graphics2D.drawLine(touch.x, touch.y, p.x, p.y); 
    } 
    repaint(); 
} 

しかし、私はいろいろ書い描画しようとすると、それは常に与える"Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException"

public void paintComponent(Graphics g){ 
    if(image == null){ 
     image = createImage(getSize().width, getSize().height); 
     graphics2D = (Graphics2D)image.getGraphics(); 
     graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     clear(); 
    } 
    g.drawImage(image, 0, 0, null); 
} 

そして私は明確な方法があります:

public void clear(){ 
    graphics2D.setPaint(Color.white); 
    graphics2D.fillRect(0, 0, getSize().width, getSize().height); 
    graphics2D.setPaint(Color.black); 
    repaint(); 
} 

どうすればよいですか?あなたはgraphics2Dについては何も指定していない

おかげ

答えて

2

あなたはJavaで何かを描画する方法をよく読んでする必要があります。 Painting in AWT and Swing

カスタムペイントを行うためにスイングを使用している場合、あなたはあなたがカスタムをしたい対象のコンポーネントに方法paintComponent(Graphics g)をオーバーライドする必要がありますその絵の中に絵を描いてその絵を描きます。そのメソッドでは常に初期化されたGraphicsオブジェクトを取得します。

+0

paintComponent(Graphics g)メソッドもオーバーライドしました – CanCeylan

+0

@CanCeylan:あなたのラインをmouseDragged(...)メソッドで描画することはできません。それは動作しません。 MouseEventから取得したポイントを格納し、paintComponent(...)に線画を描画します。 –

+0

しかし私の出発点はこのリンクです:http://forum.codecall.net/java-tutorials/31180-java-mini-paint-program.html。そのリンクでは、私はmouseDraggedメソッドで線を引くことができます。私は自分のGUIにこのスキーマを適用したい – CanCeylan

1

。私の推測では、それはあなたが決して初期化していないフィールドなので、常にnull値を持つことになります。

「描画する線」のリストに実際に線を追加し、実際に描画ハンドリングで描画部分を実行する必要があります。これは、あなたが絵を描こうとしているときに処理するイベントです。

+0

graphics2Dをどの値で初期化する必要がありますか?私は\t Graphics2Dグラフィックス2Dを書きました。 – CanCeylan

+0

@CanCeylan:そうです、それは実際にはヌルのデフォルト値を持つインスタンス変数です。ペイントイベントを処理する場合は、そのメソッド*で描画するグラフィックスをパラメータとして指定する必要があります。 –

0

あなたの投稿コードは妥当と思われます。画像を作成するときにgraphics2D変数を初期化します。

Custom Painting Approachesは、これを行う2つの方法を示しています。そのアプローチの1つは、あなたがやっていることに似ているBufferedImageにペイントすることです。異なるものを見るためにコードを比較してください。

関連する問題