I'm trying to learn Swing, so I'm writing the most robust Celsius
converter app that I can. I've separated the conversion work into a
separate SwingWorker thread, so this requires Java 6. Does anyone have
any suggestions?

  (ns org.sample.play-with-swing.multithreaded-celsius-converter
    (:import [javax.swing JFrame JLabel JTextField JButton SwingWorker
SwingUtilities]
             [java.awt.event ActionListener]
             [java.awt GridLayout]))

  (defn convert-c-to-f [celsius-text]
    (when-not (empty? celsius-text)
      (let [c (Double/parseDouble celsius-text)]
        (str (+ 32 (* 1.8 c))))))

  (defn c-to-f-worker [celsius-text-field fahrenheit-text-field]
    (proxy [SwingWorker] []
      (doInBackground []
        (convert-c-to-f (.getText celsius-text-field)))
      (done []
        (.setText fahrenheit-text-field (.get this)))))

  (defn celsius-gui []
    (let [frame (JFrame. "Celsius Converter")
          celsius-text-field (JTextField.)
          celsius-label (JLabel. "Celsius")
          convert-button (JButton. "℃ to ℉")
          fahrenheit-label (JLabel. "Fahrenheit")
          fahrenheit-text-field (JTextField.)]
      (.addActionListener convert-button
        (proxy [ActionListener] []
          (actionPerformed [event]
            (.execute (c-to-f-worker celsius-text-field fahrenheit-
text-field)))))
      (doto frame
        (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
        (.setLayout (GridLayout. 3 2 3 3))
        (.add celsius-text-field)
        (.add celsius-label)
        (.add fahrenheit-text-field)
        (.add fahrenheit-label)
        (.add convert-button)
        (.setSize 300 100)
        (.setVisible true))))

  ; For thread safety, does the text-sampler-gui thread have to be
invoked from the event
  ; dispatch thread?
  (SwingUtilities/invokeLater celsius-gui)


--~--~---------~--~----~------------~-------~--~----~
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