From 1f9e4b07e3e1eb0a2b8e477a6bde41a38195c871 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 2 Apr 2013 20:21:11 +0000 Subject: [PATCH] GuiChoose.order is also always invoked by EDT. Found a right wrapper class to pass Callables to EDT, --- src/main/java/forge/FThreads.java | 7 -- src/main/java/forge/gui/GuiChoose.java | 95 ++++++++++++++++---------- 2 files changed, 59 insertions(+), 43 deletions(-) diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java index f2924d62f9c..a5e4be097b0 100644 --- a/src/main/java/forge/FThreads.java +++ b/src/main/java/forge/FThreads.java @@ -16,13 +16,6 @@ import forge.control.input.InputSynchronized; */ public class FThreads { - // This could be some bad copy of SwingWorker - public abstract static class RunnableWithResult implements Runnable { - protected T result = null; - public T getResult() { return result; } - - } - static { System.out.printf("(FThreads static ctor): Running on a machine with %d cpu core(s)%n", Runtime.getRuntime().availableProcessors() ); } diff --git a/src/main/java/forge/gui/GuiChoose.java b/src/main/java/forge/gui/GuiChoose.java index 28915386545..da5b50cac0f 100644 --- a/src/main/java/forge/gui/GuiChoose.java +++ b/src/main/java/forge/gui/GuiChoose.java @@ -8,6 +8,9 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.FutureTask; import javax.swing.JDialog; import javax.swing.JFrame; @@ -104,10 +107,9 @@ public class GuiChoose { } } - FThreads.RunnableWithResult> showChoice = new FThreads.RunnableWithResult>() { - + Callable> showChoice = new Callable>() { @Override - public void run() { + public List call() { ListChooser c = new ListChooser(message, min, max, choices); final JList list = c.getJList(); list.addListSelectionListener(new ListSelectionListener() { @@ -126,12 +128,18 @@ public class GuiChoose { }); c.show(); GuiUtils.clearPanelSelections(); - result = c.getSelectedValues(); + return c.getSelectedValues(); } }; - FThreads.invokeInEDTAndWait(showChoice); - return showChoice.getResult(); + FutureTask> future = new FutureTask>(showChoice); + FThreads.invokeInEDTAndWait(future); + try { + return future.get(); + } catch (Exception e) { // should be no exception here + e.printStackTrace(); + } + return null; } // Nothing to choose here. Code uses this to just show a card. @@ -153,39 +161,54 @@ public class GuiChoose { } - public static List order(final String title, final String top, int remainingObjects, - final List sourceChoices, List destChoices, Card referenceCard, boolean sideboardingMode) { + public static List order(final String title, final String top, final int remainingObjects, + final List sourceChoices, final List destChoices, final Card referenceCard, final boolean sideboardingMode) { // An input box for handling the order of choices. - final JFrame frame = new JFrame(); - DualListBox dual = new DualListBox(remainingObjects, sourceChoices, destChoices); - dual.setSecondColumnLabelText(top); + + Callable> callable = new Callable>() { + @Override + public List call() throws Exception { + final JFrame frame = new JFrame(); + DualListBox dual = new DualListBox(remainingObjects, sourceChoices, destChoices); + dual.setSecondColumnLabelText(top); + + frame.setLayout(new BorderLayout()); + frame.setSize(dual.getPreferredSize()); + frame.add(dual); + frame.setTitle(title); + frame.setVisible(false); + + dual.setSideboardMode(sideboardingMode); + + final JDialog dialog = new JDialog(frame, true); + dialog.setTitle(title); + dialog.setContentPane(dual); + dialog.setSize(dual.getPreferredSize()); + dialog.setLocationRelativeTo(null); + dialog.pack(); + dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + if (referenceCard != null) { + CMatchUI.SINGLETON_INSTANCE.setCard(referenceCard); + // MARKED FOR UPDATE + } + dialog.setVisible(true); + + List objects = dual.getOrderedList(); + + dialog.dispose(); + GuiUtils.clearPanelSelections(); + return objects; + } + }; - frame.setLayout(new BorderLayout()); - frame.setSize(dual.getPreferredSize()); - frame.add(dual); - frame.setTitle(title); - frame.setVisible(false); - - dual.setSideboardMode(sideboardingMode); - - final JDialog dialog = new JDialog(frame, true); - dialog.setTitle(title); - dialog.setContentPane(dual); - dialog.setSize(dual.getPreferredSize()); - dialog.setLocationRelativeTo(null); - dialog.pack(); - dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - if (referenceCard != null) { - CMatchUI.SINGLETON_INSTANCE.setCard(referenceCard); - // MARKED FOR UPDATE + FutureTask> ft = new FutureTask>(callable); + FThreads.invokeInEDTAndWait(ft); + try { + return ft.get(); + } catch (Exception e) { // we have waited enough + e.printStackTrace(); } - dialog.setVisible(true); - - List objects = dual.getOrderedList(); - - dialog.dispose(); - GuiUtils.clearPanelSelections(); - return objects; + return null; } // If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine