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 Fernhout
http://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