这是我的小程序类:
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 循环中时如何修改气泡的内容。
有没有人有任何想法?
奖金问题:
- 我的目的是最终创建一个在某人的机器上运行的游戏,而不是在网络浏览器中运行。除了小程序,我应该使用什么?
- 我应该使用什么来代替 AWT?
关于那里的第二个奖金问题。我发现这篇文章说:
AWT 提供了丰富的图形环境,尤其是在 Java V1.2 及更高版本中。通过 Graphics2D 对象以及 Java2D 和 Java3D 服务,可以创建许多强大的图形应用程序,例如绘图和图表包,以及与 JavaSound 相结合的竞技互动游戏。
这让我相信 AWT 确实适合我。还是作者搞错了?这篇文章是 2006 年的,所以有点过时了,但不多。
更新(原始帖子中没有的东西):
- 删除了长块注释掉的代码
- 更新了我的例子
- 添加了奖金问题
- 从比较 AWT 和 Swing 和 SWT 的文章中添加了引用