绘制存储在ArrayList中的一些粒子。这段代码工作正常:
super.paintComponent(g);
for (Particle b: particleArr){
g.setColor(b.getColor());
g.fillOval(b.getXCoor() + 5,b.getYCoor(),
b.getParticleSize(),b.getParticleSize());
}
但是,此代码会引发并发修改异常:
public void paintComponent(Graphics g){
//paint particles
super.paintComponent(g);
for (Particle b: particleArr){
g.setColor(b.getColor());
if (b.isDead())
particleArr.remove(b);
else if (!b.isVanishing())
g.fillOval(b.getXCoor(),b.getYCoor(),
b.getParticleSize(),b.getParticleSize());
else {
g.fillOval(b.getXCoor() + 5,b.getYCoor(),
b.getParticleSize(),b.getParticleSize());
g.fillOval(b.getXCoor() - 5,b.getYCoor(),
b.getParticleSize(),b.getParticleSize());
g.fillOval(b.getXCoor(),b.getYCoor() + 5,
b.getParticleSize(),b.getParticleSize());
g.fillOval(b.getXCoor(),b.getYCoor() - 5,
b.getParticleSize(),b.getParticleSize());
}
}
我很困惑。
这是迭代器的乱码,运行缓慢。
itr = particleArr.iterator();
super.paintComponent(g);
while (itr.hasNext()){
particle=itr.next();
g.setColor(particle.getColor());
if (particle.isDead())
itr.remove();
else if (particle.isVanishing())
g.fillOval(particle.getXCoor(),particle.getYCoor(),
particle.getParticleSize(),particle.getParticleSize());
else {
g.fillOval(particle.getXCoor() + 5,particle.getYCoor(),
particle.getParticleSize(),particle.getParticleSize());
g.fillOval(particle.getXCoor() - 5,particle.getYCoor(),
particle.getParticleSize(),particle.getParticleSize());
g.fillOval(particle.getXCoor(),particle.getYCoor() + 5,
particle.getParticleSize(),particle.getParticleSize());
g.fillOval(particle.getXCoor(),particle.getYCoor() - 5,
particle.getParticleSize(),particle.getParticleSize());
}
答案 0 :(得分:14)
尝试从数组列表中获取Iterator,然后在迭代器上调用remove()方法以删除该项。
实施例
Iterator itr = particleArr.iterator();
while(itr.hasNext()) {
Particle b = (Particle)itr.next();
if (b.isDead())
itr.remove();
}
编辑:只是让示例与您的代码更相关。
答案 1 :(得分:4)
您不能在集合上使用for-each迭代并删除元素:
if (b.isDead())
particleArr.remove(b);
您可以将您的收藏集复制到另一个收藏夹中,首先:
ArrayList copy = new ArrayList(particleArr);
for (Particle b: copy){
或者您可以尝试使用CopyOnWriteArrayList包装您的Collection http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
或者你可以使用迭代器(这可能是最好的方法):
Iterator itr = particleArr.iterator();
while(itr.hasNext()) {
Particle b = (Particle)itr.next();
if (b.isDead())
itr.remove();
}
编辑: 将迭代器带到选项
答案 2 :(得分:2)
您收到错误,因为要从同一列表的for-each循环内的列表中删除粒子。索引和长度正在循环中更改,Java不知道如何处理它。要么以不同的方式遍历粒子,要么不要像那样删除它们