这是我的小程序类:

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中运行它
我在运行OSX 10.5.8的Mac上运行此程序
当气泡中存在更多Bubble实例时,更可能引发异常
当小程序的多个实例正在运行时,更可能引发异常


我很困惑,因为当控件位于for循环中时,我看不到如何修改气泡的内容。

有人有什么想法吗?

奖励问题:


我的意图是最终创建一款可以在某人的计算机上而不是在Web浏览器上运行的游戏。除了小应用程序外,我还应该使用什么?
我应该使用什么代替AWT?


关于第二个奖金问题。我发现this article表示:


  AWT提供了丰富的图形环境,尤其是在Java V1.2和更高版本中。通过Graphics2D对象以及Java2D和Java3D服务,可以创建许多功能强大的图形应用程序,例如绘图和制图程序包,以及与JavaSound结合的竞争性交互式游戏。


这使我相信AWT确实适合我。还是作者误会了?这篇文章是2006年写的,虽然有点过时,但不多。

更新(原始帖子中没有的内容):


删除了很多注释掉的代码
更新了我的示例
添加了奖励问题
添加了比较AWT和Swing和SWT的文章的引用

最佳答案

您不是在paint方法中更改气泡的含量,而是在run方法中更改气泡的内容,并且该方法在单独的线程中执行。这就解释了为什么您不总是得到该异常的原因,它仅在您恰好在更改另一个线程中的列表气泡的同时恰好执行了绘制时才发生。

10-01 03:51
查看更多