2011-07-10 9 views
-4

質問は簡単です。私は "ハンドラ"という名前のクラスを作成し、そのコンストラクタ内に "c"(JComponent)のパラメータを含みます。このコンストラクタが特定のJComponent、好ましくはJPanelで呼び出されると、マウスの現在の座標に楕円が描画されます。これは、ソースコードされています。ただし、このエラーがスローされGraphics.drawOvalのNullPointerException

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

public class Handler implements MouseListener, MouseMotionListener { 

Graphics g; 

public Handler() {} 

public Handler(JComponent c) { 

    if (c instanceof JPanel) { 
     g = c.getGraphics(); 
     g.drawOval(mx, my, 5, 5); 
    } 

    if (c != null) { 
     c.addMouseListener(this); 
     c.addMouseMotionListener(this); 
    } 
} 

int mx, my; 


public void mouseClicked(MouseEvent e) { 
    mx = e.getX(); 
    my = e.getY(); 
} 

public void mousePressed(MouseEvent e) { 
    mx = e.getX(); 
    my = e.getY(); 
} 

public void mouseReleased(MouseEvent e) { 
    mx = e.getX(); 
    my = e.getY(); 
} 

public void mouseExited(MouseEvent e) {} 

public void mouseEntered(MouseEvent e) {} 

public void mouseMoved(MouseEvent e) { 
    mx = e.getX(); 
    my = e.getY(); 
} 

public void mouseDragged(MouseEvent e) {} 
} 

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 

はあなたたちがこのことについてどんな考えを持っていますか?その場合は、解決策を投稿してください。

編集1
私は何か新しいことをしました。これは私の新しいコードです:

import javax.swing.*; 
import java.awt.*; 

public class Handler extends JPanel { 

    int mx = MouseInfo.getPointerInfo().getLocation().x; 
    int my = MouseInfo.getPointerInfo().getLocation().y; 


public Handler(BorderLayout bl) { 
    this.setLayout(bl); 
} 

public void paintComponent(Graphics g23) { 
    Graphics2D g2 = (Graphics2D) g23; 
    g2.drawOval(mx, my, 30, 30); 
    } 
} 

私はコードを大きく改訂しました。今、JPanelを拡張し、JPanelの代わりになります。そこで、新しいJPanelをインスタンス化する代わりに、Handlerのコンストラクタを呼び出します。 paintComponentも実装されていますが、まだ楕円は描画されていません。しかし、エラーは発生しません。

+3

もっと多くのスタックトレースを含むマインド? – mre

+2

また、なぜ 'JComponent'の' Graphics'オブジェクトを取得してから、 'paintComponent(...)'の外に描画していますか?あなたは 'paintComponent(...)'をオーバーライドし、そこに描画を行うべきです。 – mre

+1

クラスを実行可能にして、javax.swing.SwingUtilities.invokeLater()から実行する必要があります。これにより、イベントキューの健全性が確保されます。ルーチンのコーディングでの 'instanceof'の使用は、文体的に最良の動きではありません。 – ncmathsadist

答えて

2

これは、ハンドラに渡すグラフィックスコンポーネントが未実現コンポーネントであるため、getGraphics()がnullを返すためです。コンポーネントが画面上に表示されていない場合、コンポーネントはグラフィックスオブジェクトを持たないため、最初に表示する必要があります。私はmain()メソッドにこのコードを追加して、サンプル・コードと呼ばれ、それが働いた:

私は徹底的にこの質問を研究しているし、何の解決策を見つけていない
public static void main(String[] args){ 
    JPanel jpanel = new JPanel(); 
    JFrame jframe = new JFrame(); 
    jframe.add(jpanel); 
    jframe.setVisible(true); 
    jpanel.setVisible(true); 
    Handler handler = new Handler(jpanel); 
} 
+0

GameはJFrameに追加されていますか? BotGUIはどんなタイプですか? – Jason

+1

camickrの解決策が正しいです。 –

2

からセクションを読みますCustom Painting.のSwingチュートリアル。

getGraphics()メソッドを使用しないでください。この種の絵画は永久的ではありません。スウィングがコンポーネントを再描画する必要があると判断するとすぐに、塗装が失われます。

さらにヘルプが必要な場合は、SSCCEをここに投稿してください。我々は、コードスニペットをウェブ上で追跡することによって、あなたのコードが何であるかを推測する時間がなくなります。

+4

@OmerEltoum:Camickrの答えは、あなたを侮辱したり、あなたを軽蔑していますか?あなたが態度を取り除き、代わりにCamickrのアドバイスを聞くならば、あなたはただ何かを学ぶかもしれません。 –

1

ハンドラの作成方法については言及していません。さらに、mx,myの値は、Mouse is Clicked, Pressed or releasedに一度初期化されます。これらのイベントのいずれかが発生する前にHandlerクラスが呼び出され、したがってmx,myがnullの場合はどうなりますか?あなたはそれをチェックしましたか?

+0

drawOvalが正しく表示されません。繰り返しますが、Handlerクラスの使用方法を示していないので、SSCCEはこれに答えます。 –

+0

@Omer:どのようなエラーがありますか? NullPointerExceptionが解決されましたか? – Logan

関連する問題