I would create a ref in the let statement that is launching the
dialog.  Then create a countdown latch and launch the dialog using
SwingUtilities/invokeLater.  Ensure the ref is set (dosync ...) and
the latch is counted when the dialog is closed.  Now you have a
synchronous result from your asynchronous dialog.

Chris

On Feb 8, 6:12 pm, Jeffrey Straszheim <straszheimjeff...@gmail.com>
wrote:
> A JDialog is going to run on the GUI thread and you can't change that.
>
> There are various concurrency tools in Java that will give you what you
> want.  The easiest is to wait create a SynchronousQueue.  Check the Java API
> docs.
>
> On Sat, Feb 7, 2009 at 6:15 PM, Tim Martin <t...@asymptotic.co.uk> wrote:
>
> > Hi all,
>
> > I was wanting to create a dialog box in a (predominantly command-line)
> > application where the action of the user on the dialog box is returned
> > to the code that requested the dialog so we can branch based on the
> > selection. It seems the most natural way of doing this in a functional
> > language is to block until the dialog box is closed and then return a
> > value, rather than messing with mutable state. This fits in well with
> > what I want to happen in my program.
>
> > I can do this quite easily with a JOptionPane, which has the right
> > semantics for me, and can return a single value to indicate what
> > option was chosen. So far so good.
>
> > However, if I want more control over the layout and content of the
> > dialog, I seem to be best served by building it myself out of a
> > JDIalog [1]. I've got code that creates the JDialog and then blocks
> > until it is closed, which I can control with a button and an
> > ActionListener in the obvious way. However, the snag is that it
> > doesn't return the outcome. The interface of JDialog seems to be built
> > around the idea of having mutable objects and state, and having an
> > action listener that can mutate the object and a getter method to find
> > the value assigned in the listener.
>
> > I imagine I can get round this by writing a thin wrapper for the
> > JDialog that will handle the state in Java, but is there a pure
> > Clojure way to do this kind of thing? [2] If not, is this (unlikely) a
> > general problem with GUI programming in functional languages or (most
> > likely, I assume) a paradigm mismatch between Swing and functional
> > languages. If the latter, would the Clojure community be well-served
> > by a standard library of shims for making Swing fit better into the
> > functional mould?
>
> > Tim
>
> > [1] My experience of Swing is minimal, so I'm ready to be corrected if
> > this turns out to be terribly naive.
>
> > [2] Aside from unscalable hacks like having a package-level mutable
> > ref that can be updated from within a listener
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to