Page history Edit this page How do I edit this website?
Original MediaWiki page

Celsius to fahrenheit

The content of this page has not been vetted since shifting away from MediaWiki. If you’d like to help, check out the how to help guide!

Purpose

An example Clojure script illustrating how to use a GenericDialog and how to show information to the user.

The example is taken from the Clojure website.

Code

;; Example taken from Clojure website

(import '(javax.swing JFrame JLabel JTextField JButton)
        '(java.awt.event ActionListener)
    '(java.awt GridLayout)
    '(java.lang NumberFormatException))

; Define a function that does all, and which takes no arguments
(defn celsius []
 ; Define the gui elements as variables that point to new instances
 ; of buttons, labels, etc.
 (let [frame (new JFrame "Celsius Converter")
       temp-text (new JTextField)
       celsius-label (new JLabel "Celsius")
       convert-button (new JButton "Convert")
       fahrenheit-label (new JLabel "Fahrenheit")]
   ; On the convert button, add an anonymous listener (proxy)
   ; In java it would be:  button.addActionListener(new ActionListener() {
   ;                 public void actionPerformed(ActionEvent evt) { ... } } );
   (. convert-button
       (addActionListener
           (proxy [ActionListener] []
            (actionPerformed [evt]
            ; check that the entered string length is > 0
            (let [snum (.getText temp-text)]
              (if (> (.length snum) 0)
            ; check if the string is a number at all
            (try (let [num (Double/parseDouble snum)]
                   (. fahrenheit-label
                  (setText (str (+ 32 (* 1.8 num)) " Fahrenheit"))))
                          (catch java.lang.NumberFormatException e
                   (. fahrenheit-label
                  (setText "Not a number"))))
            ; else, hint what is needed
            (. fahrenheit-label
               (setText "Enter a number"))))))))
   ; The number format error prevention could have been written by adding
   ; an extended PlainDocument to the JTextField which only accepts valid numbers.
   ; BUT one cannot call super, so the call to super.insertString() cannot be made!

   ; On the frame, call all the following methods
   ; It could be done with many blocks like (. frame (add celsius-label)) etc.
   (doto frame
              (.setLayout (new GridLayout 2 2 3 3))
          (.add temp-text)
          (.add celsius-label)
          (.add convert-button)
          (.add fahrenheit-label)
          (.setSize 300 80)
          (.setVisible true))))
; Execute the function
(celsius)

See also