2016-11-18 168 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);'來爲每一幀添加一個新的事件偵聽器。 –

+0

並刪除'super.mouseMoved(e);' –

回答

2

不要調用repaint也不要在paint方法中添加偵聽器。

paint方法在每次需要更新/繪製組件時都由Swing調用repaint方法調度組件以進行重新繪製,這會導致調用paint。所以在paint裏面調用repaint就是一個無限循環。

應該只向組件添加一次監聽器,例如,組件創建時。

repaint應該在組件的表示被改變時被調用,例如,裏面的聽衆更換後cursor

+0

謝謝!它現在完美。 –