Clojure swings

Wiki で Swing のサンプルとして紹介されていたのを少し
なおして WindowAdapter をつける。

なんというか、見た目が綺麗。本を予約してしまった。


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

(let [frame (new JFrame "Temp Converter")
temp-text (new JTextField)
celsius-label (new JLabel "Celsius")
convert-button (new JButton "Convert")
fahrenheit-label (new JLabel "Fahrenheit")]
(. convert-button
(addActionListener
(proxy [ActionListener] []
(actionPerformed [evt]
(let [c (Double/parseDouble (. temp-text (getText)))]
(. fahrenheit-label
(setText (str (+ 32 (* 1.8 c)) " Fahrenheit"))))))))
(. frame
(addWindowListener
(proxy [WindowAdapter] []
(windowClosing [evt]
(System/exit 0)))))
(doto frame
;(setDefaultCloseOperation (JFrame/EXIT_ON_CLOSE))
;uncomment this line to quit app on frame close
(.setLayout (new GridLayout 2 2 3 3))
(.add temp-text)
(.add celsius-label)
(.add convert-button)
(.add fahrenheit-label)
(.setSize 300 80)
(.setVisible true)))

簡単な JMX のプログラムも書いてみた。java の array は doseq で歩く。
for, loop じゃない。


(import '(javax.management MBeanInfo)
'(java.lang.management ManagementFactory)
'(java.text DecimalFormat))

(let [dformat (new DecimalFormat "#,##0.000")
runtime-mxbean (ManagementFactory/getRuntimeMXBean)
thread-mxbean (ManagementFactory/getThreadMXBean) ]

(println "VM Vendor:" (.getVmVendor runtime-mxbean))
(println "Boot Class Path")
(doseq [prop (.getInputArguments runtime-mxbean)]
(println "arg: " prop))
(doseq [p (.split (.getBootClassPath runtime-mxbean) ":")]
(println " " p)
)
(println "Threads new code")
(doseq [thr (.getAllThreadIds thread-mxbean)]
[(print thr ": " )
(println (.trim (.toString
(.getThreadInfo thread-mxbean thr)))) ]))

(println)
(println "GC:")
(doseq [gci (ManagementFactory/getGarbageCollectorMXBeans)]
(print (.getName gci))
(print "(")
(doseq [mpname (.getMemoryPoolNames gci)]
(print mpname))
(print ")")
(print (.getCollectionCount gci) (.getCollectionTime gci) "\n"
))

(println)
(println "Memory Pool:")
(doseq [mp (ManagementFactory/getMemoryPoolMXBeans)]
(print (.getName mp) (.getType mp))
(print "(")
(doseq [mmname (.getMemoryManagerNames mp)]
(print mmname)
)
(print ")")
(println (.getCollectionUsage mp)))