2016-11-18 18 views
-1

私はカーソルがある場所に画像が描かれるこのシンプルなゲームを作った。しばらくの間それは動作しますが、すぐにStackOverFlowError例外がスローされます。単純なゲームスローStackOverFlowError

public class Graphic extends JComponent { 
private ImageIcon imgIcon = new ImageIcon("/Users/Koolkids/Documents/codeStuff/Java/BattleOfTheEmojis/src/img/happy.png"); 
private Image img = imgIcon.getImage(); 
private Point cursor = new Point(0, 0); 

public MouseMotionAdapter m = new MouseMotionAdapter() { 
    @Override 
    public void mouseMoved(MouseEvent e) { 
     super.mouseMoved(e); 
     cursor = e.getPoint(); 
    } 
}; 



public void paint(Graphics g) { 

    Graphics2D g2 = (Graphics2D) g; 
    g2.setBackground(Color.WHITE); 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    this.addMouseMotionListener(m); 
    g2.drawImage(img, cursor.x - 11, cursor.y - 11, 22, 23, this); 
    repaint(); 

} 

} 

出力

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at java.awt.AWTEventMulticaster.mouseMoved(AWTEventMulticaster.java:329) 
at java.awt.AWTEventMulticaster.mouseMoved(AWTEventMulticaster.java:329) 
at java.awt.AWTEventMulticaster.mouseMoved(AWTEventMulticaster.java:329) 

、永遠にそのように続けます。

+2

Java UIコードでは経験はありませんが、ペイント機能で 'this.addMouseMotionListener(m);'を呼び出すことで新しいイベントリスナーを1フレームごとに追加するようです。 –

+0

またそれを削除する 'super.mouseMoved(e);' –

答えて

2

repaintを呼び出さず、paintメソッド内にリスナーを追加しないでください。

paint方法は、スイングによって成分がpaintが呼び出される原因と、再描画のためrepaint方法スケジュール成分を描か/更新する必要があるたびに呼び出されます。だからrepaintpaintの中に呼び出すのは無限ループです。

リスナーはコンポーネントに一度だけ追加する必要があります。コンポーネントが作成されたとき。

repaintは、コンポーネントの表現が変更された場合に呼び出される必要があります。 cursorを変更した後にリスナーの内部に

+0

ありがとう!それは今、完璧に動作します。 –