Java paintComponent ConcurrentModificationException
我正在用swing编写一个应用程序,我有一个组件可以绘制正在拖动的对象。下面是代码的一小部分:Java paintComponent ConcurrentModificationException,java,swing,concurrentmodification,Java,Swing,Concurrentmodification,我正在用swing编写一个应用程序,我有一个组件可以绘制正在拖动的对象。下面是代码的一小部分: public class DragPanel extends JComponent{ private final int CARD_STACK_SPACING; private int x, y; private List<Card> cards; public DragPanel(int cardStackSpacing) { x =
public class DragPanel extends JComponent{
private final int CARD_STACK_SPACING;
private int x, y;
private List<Card> cards;
public DragPanel(int cardStackSpacing) {
x = -1;
y = -1;
cards = null;
CARD_STACK_SPACING = cardStackSpacing;
}
public void drag(int x, int y, Card card) {
this.x = x;
this.y = y;
cards = new ArrayList<Card>();
cards.add(card);
repaint();
}
public void dragCards(int x, int y, List<Card> cards) {
this.x = x;
this.y = y;
this.cards = cards;
repaint();
}
public void stopDragging() {
x = -1;
y = -1;
cards = null;
repaint();
}
@Override
public void paintComponent(Graphics g) {
if (x > 0 && y > 0) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int adjustedY = y;
for (int i = 0; i < cards.size(); ++i) {
CardImager.drawCard(cards.get(i), g2d, x, adjustedY);
adjustedY += CARD_STACK_SPACING;
}
}
}
}
您可能需要显示此方法的代码:CardImager.drawCardcards.geti、g2d、x、adjustedY;呼叫get。。。在ArrayList上,不应导致ConcurrentModificationException,因此我认为必须进行更多操作。此外,在任何时候,您是否在迭代ArrayList时更改了cards?您可以使用NIO的CopyOnWriteArrayList,但由于性能原因,这可能不是一个好主意。我建议您看看一些同步教程。CardMager.drawCard方法不会以任何方式修改卡。
@Override
public void mouseDragged(MouseEvent e) {
firstClick = 0;
if (!isDragging &&
!isDraggingStack &&
e.getSource() instanceof ResultDisplay &&
searchPanel.getCard(e.getX(), e.getY()) != null) {
isDragging = true;
draggingCard = searchPanel.getCard(e.getX(), e.getY());
offsets = searchPanel.getOffsets(e.getX(), e.getY());
dragPanel.drag(e.getX() + offsets[0], e.getY() + offsets[1], draggingCard);
} else if (!isDragging &&
!isDraggingStack &&
e.getSource() instanceof DeckBuilderPanel &&
deckBuilderPanel.getCard(e.getX(), e.getY()) != null) {
isDraggingStack = true;
offsets = deckBuilderPanel.getOffsets(e.getX(), e.getY());
draggingCardStack = deckBuilderPanel.removeCardStack(e.getX(), e.getY());
dragPanel.dragCards(e.getX() + offsets[0], e.getY() + offsets[1] + searchPanel.getHeight(), draggingCardStack);
System.out.println(offsets[0] + " " + offsets[1]);
}
if (isDragging && !isDraggingStack) {
dragPanel.drag(e.getX() + offsets[0], e.getY() + offsets[1], draggingCard);
} else if (!isDragging && isDraggingStack) {
dragPanel.dragCards(e.getX() + offsets[0], e.getY() + offsets[1] + searchPanel.getHeight(), draggingCardStack);
}
}