0

これが私のアプレットクラスです:

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){

詳細:

  • 私はこれをIntelliJIDEA10.5.4で実行しています
  • OSX10.5.8を実行しているMacでこれを実行しています
  • バブル内のバブルのインスタンスが多い場合、例外がスローされる可能性が高くなります
  • アプレットの複数のインスタンスが実行されている場合、例外がスローされる可能性が高くなります

制御がforループにある間、バブルの内容をどのように変更しているかがわからないため、混乱しています。

誰かアイデアはありますか?

ボーナスの質問:

  • 私の意図は、最終的にはWebブラウザーではなく、誰かのマシンで実行されるゲームを作成することです。アプレット以外にこれに何を使用する必要がありますか?
  • AWTの代わりに何を使用する必要がありますか?

そこにある2番目のボーナス質問に関して。私はそれを言うこの記事を見つけました:

AWTは、特にJavaV1.2以降でリッチなグラフィック環境を提供します。Graphics2Dオブジェクト、Java2DおよびJava3Dサービスを介して、描画パッケージやグラフ作成パッケージなどの多くの強力なグラフィカルアプリケーションを作成でき、JavaSoundと組み合わせて競争力のあるインタラクティブゲームを作成できます。

これは、AWTが本当に私にとって正しいと私に信じさせます。それとも作者は間違っていますか?記事は2006年のものなので、少し古くなっていますが、それほど多くはありません。

更新(元の投稿になかったもの):

  • コメントアウトされたコードの長いブロックが削除されました
  • 私の例を更新しました
  • ボーナスの質問を追加しました
  • AWTとSwingおよびSWTを比較した記事からの引用を追加
4

1 に答える 1

3

paintメソッドでバブルの内容を変更するのではなく、runメソッドでバブルの内容を変更し、そのメソッドは別のスレッドで実行されます。これは、常にその例外が発生するわけではない理由を説明しています。これは、別のスレッドでリストバブルを変更すると同時にペイントが実行された場合にのみ発生します。

于 2012-06-02T22:18:57.953 に答える