2012-06-02 55 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

相关问题