Java paintComponent ConcurrentModificationException

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 =

我正在用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 = -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);
    }
}