2012-06-02 60 views
0

這裏是我的Applet類:爲什麼我的applet的paint方法拋出ConcurrentModificationException

package DavidPackages.Prototypes.Samples.BubblesV2SSCCE; 

import java.applet.Applet; 
import java.awt.*; 
import java.awt.geom.Ellipse2D; 
import java.util.ArrayList; 
import java.util.Random; 

public class BubbleAppletV2SSCCE extends Applet implements Runnable{ 

    private Thread thread; 
    private ArrayList<Ellipse2D> circles; 

    public void init(){ 
     //Initialize bubbles with one entry so that we have a bubble to start out with 
     Random r = new Random(); 
     circles = new ArrayList<Ellipse2D>(); 
     circles.add(new Ellipse2D.Float(5, 5, 15, 15)); 

     thread = new Thread(this); 
     thread.start(); 
    } 

    public void run(){ 
     while(true){ 

      update(); 
      repaint(); 

      try{ 
       Thread.sleep(10); 
      }catch(InterruptedException ie){ 
       ie.printStackTrace(); 
      } 
     } 
    } 

    private void update(){ 
     circles.add(new Ellipse2D.Float(5, 5, 15, 15)); 
    } 

    public void paint(Graphics graphics){ 
     for(Ellipse2D circle : circles){ 
      ((Graphics2D) graphics).draw(circle); 
     } 
    } 

    public void stop(){} 
} 

這裏是堆棧跟蹤:

Exception in thread "AWT-EventQueue-1" java.util.ConcurrentModificationException 
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449) 
at java.util.AbstractList$Itr.next(AbstractList.java:420) 
at DavidPackages.Prototypes.Samples.BubblesV2SSCCE.BubbleAppletV2SSCCE.paint(BubbleAppletV2SSCCE.java:43) 
at sun.awt.RepaintArea.paintComponent(RepaintArea.java:276) 
at sun.awt.RepaintArea.paint(RepaintArea.java:241) 
at apple.awt.ComponentModel.handleEvent(ComponentModel.java:268) 
at java.awt.Component.dispatchEventImpl(Component.java:4159) 
at java.awt.Container.dispatchEventImpl(Container.java:2068) 
at java.awt.Component.dispatchEvent(Component.java:3918) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:501) 
at java.awt.EventQueue.access$000(EventQueue.java:80) 
at java.awt.EventQueue$1.run(EventQueue.java:462) 
at java.awt.EventQueue$1.run(EventQueue.java:461) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:84) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:95) 
at java.awt.EventQueue$2.run(EventQueue.java:476) 
at java.awt.EventQueue$2.run(EventQueue.java:475) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:84) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:473) 
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110) 

這裏唯一的呼叫是在我的代碼是:

at DavidPackages.Prototypes.Samples.BubblesV2SSCCE.BubbleAppletV2SSCCE.paint(BubbleAppletV2SSCCE.java:43) 

這是哪一行:

 for(Ellipse2D circle : circles){ 

更多詳細信息:

  • 我在的IntelliJ IDEA運行此10.5.4
  • 我在Mac上運行此運行OSX 10.5.8
  • 唯一的例外是更容易當有泡沫的多個實例在氣泡
  • 唯一的例外是更可能發生的小程序的多個實例正在運行拋出拋出

我很困惑,因爲我沒有看到如何在控制循環中修改氣泡的內容。

有沒有人有任何想法?

獎金問題:

  • 我的目的是最終創造了某人的機器上運行,而不是在網絡瀏覽器遊戲。除了小程序以外,我應該使用什麼?
  • 我應該用什麼來代替AWT?

關於那裏的第二個獎金問題。我發現this article其中說:

AWT提供了一個豐富的圖形環境,尤其是在Java V1.2及更高版本。通過Graphics2D對象以及Java2D和Java3D服務,可以創建許多功能強大的圖形應用程序,例如繪圖和製圖軟件包,並結合JavaSound提供競爭性交互式遊戲。

這使我相信AWT確實適合我。或者作者是錯誤的?這篇文章是從2006年開始的,所以它有點過時了,但並不多。

最新通報(的東西,是不是在原帖):

  • 的長塊註釋掉的代碼中刪除
  • 更新我的例子
  • 額外的獎勵問題
  • 從文章
  • 添加報價比較AWT和Swing和SWT
+1

1)爲了更好地幫助您,請發佈[SSCCE](http://sscce.org/)。而忽略了註釋代碼的巨大部分。 2)爲什麼在這個千年AWT組件? 3)爲什麼網頁中的小程序與自由浮動框架相反? 4)不要重寫'update()'(來自'Component')使用不同的方法名稱。 5)它看起來像'while(true)'循環是錯誤的 - 當我看到一個SSCCE時更多細節。 –

+0

啊。是的。我的意思是刪除那麼多的評論,但是當我試圖讓所有東西都呈現爲代碼時,它肯定已經找回了方向。我將參加一個SSCCE。同時:@ 2)因爲我不知道我在做什麼,你會建議什麼? @ 3)我實際上正在尋找自由浮動的框架,我該怎麼做? Jframes?感謝您的好評。 – David

+0

好的。我已經添加了一個SSCCE – David

回答

3

您不改變塗料方法中氣泡的含量,但您是changi在run方法中使用它們,並且該方法在單獨的線程中執行。這就解釋了爲什麼你不總是得到這個異常,它只發生在你正在改變另一個線程中的列表氣泡的同時執行。

+0

我不確定我明白疼痛()和運行()是不同的線程。我的印象是(1)因爲我的applet實現了runnable,並且我創建了一個線程,它所做的一切都是同一個線程,(2)run()調用了repaint(),它向下調用paint()和所有這一切都是相同的線程。這是不正確的?另外,如果問題出在你說的話,我該如何解決它? – David

+0

@David我不是Applet專家,但是閱讀[this](http://java.sun.com/developer/onlineTraining/Programming/BasicJava1/applet.html):_底層軟件通過調用applet來控制applet方法applet從applet類繼承。因此,我認爲paint方法不僅僅是從run方法調用的。您可以看到自己BubbleAppletV2的運行方法不在堆棧跟蹤中。爲了解決這個問題,你應該同步[someway](http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html) – Pablo

+0

感謝你的回答,我還增加了幾個問題我的問題。你可以看看他們嗎? – David

相關問題