I was recommended to use a List list = new ArrayList to collect and later remove a number of unspecific JLabel images from my JPanel
private List cardImages = new ArrayList();
public void addCardImage(BufferedImage img, boolean playerCard) {
JLabel imgLabel = new JLabel();
ImageIcon icon;
icon = new ImageIcon(img);
imgLabel.setIcon(icon);
cardImages.add(imgLabel);
if (playerCard)
pCardPanel.add(imgLabel);
else
dCardPanel.add(imgLabel);
display.pack();
}
private void removeCards() {
for (JLabel imgLabel : cardImages) {
remove(imgLabel);
cardImages.remove(imgLabel);
}
display.pack();
}
This code gives me
Exception in thread "AWT-EventQueue-0"
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
In the line
for (JLabel imgLabel : cardImages) {
(I don't know if this matters but the Game is runnable and is running on a thread.)
I copied the code as given to me in the answer and I don't see the problem, any ideas? Thanks in advance.
解决方案
Here's the problem:
for (JLabel imgLabel : cardImages) {
remove(imgLabel);
cardImages.remove(imgLabel); // not allowed!
}
You cannot iterate over the elements from a collection and remove elements from it at the same time, that results in a ConcurrentModificationException. Do this instead:
for (JLabel imgLabel : cardImages) {
remove(imgLabel);
}
cardImages.clear();