私はスイングでアプリケーションを書いています。ドラッグされているオブジェクトを描画するコンポーネントがあります。コードの一部を次に示します。
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;
}
}
}
}
これは、カードのリストを反復処理ConcurrentModificationException
する for ループがありpaintComponent
、カードのリストを別のものに設定するメソッドもあるからだと思います。
私の質問は、これが起こらないようにするにはどうすればよいですか?
編集:ここにいくつかの詳細情報があります。マウスがドラッグされると、このメソッドが呼び出され、上記のdragPanelからdragCardsメソッドが呼び出されます。
@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);
}
}