Try printing out the *ns* variable in the fn.  Chances are your code
is being created in a different *ns* than it is being run.  You can
also try using the fully qualified path to get to JOptionPane, that
may help too.

On Sep 9, 9:43 pm, "Paul D. Fernhout" <pdfernh...@kurtz-fernhout.com>
wrote:
> I'm just trying out Clojure a bit, so this may be an obvious simple thing
> I'm misunderstanding.
>
> This code in the test file below allows editing a Clojure function that is
> updated when an "Update Code" button is pressed, with the new value
> connected to a GUI button "Click Me!" as a proxy ActionListener.
>
> It starts with a default function that has not been dynamically loaded from
> a string that pops up a JOptionPane that displays the text in the text pane.
>
> Evaluating simple code like "(fn [] (println \"Hello World\"))"
> with no import dependencies works.
>
> What am I doing wrong to not have the evaluated code have access to 
> JOptionPane?
>
> I get:
>
> user=> Exception in thread "AWT-EventQueue-0" java.lang.Exception: No such
> namespace: JOptionPane (NO_SOURCE_FILE:6)
>
> when I try the "Update Code" button.
>
> The initial text includes an import statement.
>
> What do I misunderstand that the import does not seem to work?
>
> Anyway, I'm new to Clojure, so I don't really get the import or ns command
> that well yet. Any suggestions would be appreciated. Feel free to treat this
> code example as if it were in the public domain.
>
> =========== guitest2.clj
>
> (ns org.pointrel.guitest2
>    ;(:require )
>    ;(:use )
>    ;(:import )
>   )
>
>    (import
>      '(javax.swing JFrame JPanel JButton JOptionPane JTextPane)
>      '(java.awt.event ActionListener))
>
> (defn hookupActionPerformed [receiver function]
>    (println "updating hook" receiver function)
>    (let [act (proxy [ActionListener] [] (actionPerformed [event] (function)))]
>      (.addActionListener receiver act)
>      )
>    )
>
> (def initial-text "(fn []
>    (println \"Hello World\")
>    (println (+ 2 2))
>    ;(ns org.pointrel.guitest2)
>    (import '(javax.swing JOptionPane))
>    (JOptionPane/showMessageDialog
>        nil \"Hello from the text panel\" \"Greeting\"
>        JOptionPane/INFORMATION_MESSAGE)
>    )"
>    )
>
> (defn window []
>    (def frame (JFrame. "Hello Frame"))
>
>    (def panel (JPanel.))
>    (.setContentPane frame panel)
>
>    (def test-button (JButton. "Click Me!"))
>    (.add panel test-button)
>
>    (def update-button (JButton. "Update code"))
>    (.add panel update-button)
>
>    (def text (JTextPane.))
>    (.setText text initial-text)
>    (.add panel text)
>
>    (defn say-hello []
>      (let [text-contents (.getText text)]
>     (JOptionPane/showMessageDialog
>        nil text-contents "Greeting"
>        JOptionPane/INFORMATION_MESSAGE)))
>
>    (hookupActionPerformed test-button say-hello)
>
>    (defn update-code []
>      (let [text-contents (.getText text)
>            discard (printf text-contents)
>            user-function (load-string text-contents)]
>        (println "update-code")
>        (.removeActionListener test-button (aget (.getListeners test-button
> ActionListener) 0))
>        (hookupActionPerformed test-button user-function)
>     ))
>
>    (hookupActionPerformed update-button update-code)
>
>    (.setSize frame 200 200)
>    (.setVisible frame true)
> )
>
> (window)
>
> ; (eval (read-string "(println \"Hello World\")"))
> ; (load-string "(fn [] (println \"Hello World\"))")
> ; (eval ((fn [] (println "Hello World2"))))
>
> ===========
>
> There's probably stylistic issue, too. :-)
>
> By the way, the println calls don't seem to show up in NetBeans 6.9.1 with
> Enclojure after the window opens, and when I try to use code that generates
> an error I get "Repl is disconnected" that I don't know how to recover from
> without restarting NetBeans, so I am testing this with:
>
> $ java -cp jline-0.9.94.jar:clojure.jar jline.ConsoleRunner clojure.main
> Clojure 1.2.0
> user=> (load-file "guitest2.clj")
>
> --Paul Fernhouthttp://www.pdfernhout.net/
> ====
> The biggest challenge of the 21st century is the irony of technologies of
> abundance in the hands of those thinking in terms of scarcity.

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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