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

Reply via email to