From b74196b769d5657aae749b17d24c7ca7118edfe6 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 26 Mar 2013 23:14:15 +0000 Subject: [PATCH] Added a filter to minimize number of repaints of PlayArea when a number of similiar actions is performed, ex: Gavony Township, Storm Herd --- src/main/java/forge/view/arcane/PlayArea.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/forge/view/arcane/PlayArea.java b/src/main/java/forge/view/arcane/PlayArea.java index 24fb2530a25..3c2648e55eb 100644 --- a/src/main/java/forge/view/arcane/PlayArea.java +++ b/src/main/java/forge/view/arcane/PlayArea.java @@ -24,10 +24,12 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JScrollPane; import forge.Card; +import forge.FThreads; import forge.view.arcane.util.Animation; import forge.view.arcane.util.CardPanelMouseListener; @@ -497,7 +499,27 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen * @param newList * an array of {@link forge.Card} objects. */ + private final AtomicBoolean wantRedraw = new AtomicBoolean(false); public void setupPlayZone() { + boolean wasSet = wantRedraw.getAndSet(true); + if(wasSet) return; + FThreads.invokeInEDT(new Runnable() { + @Override + public void run() { + try { // user won't notice, but the requests coming in that interval won't trigger re-draw + Thread.sleep(20); + } catch (InterruptedException e) { + e.printStackTrace(); + } + wantRedraw.set(false); + final List modelshot = new ArrayList(model); // I am afraid of ConcurrentModificationExceptions + setupPlayZone(modelshot); + } + }); + } + + + public void setupPlayZone(final List model) { List oldCards, toDelete; oldCards = new ArrayList(); for (final CardPanel cpa : getCardPanels()) {