34 lines
825 B
Clojure
34 lines
825 B
Clojure
(import '[javax.swing JFrame JLabel])
|
|
(import '[java.awt.event MouseAdapter])
|
|
|
|
(def text "Hello World! ")
|
|
(def text-ct (count text))
|
|
(def rotations
|
|
(vec
|
|
(take text-ct
|
|
(map #(apply str %)
|
|
(partition text-ct 1 (cycle text))))))
|
|
|
|
(def pos (atom 0)) ;position in rotations vector being displayed
|
|
(def dir (atom 1)) ;direction of next position (-1 or 1)
|
|
|
|
(def label (JLabel. text))
|
|
|
|
(.addMouseListener label
|
|
(proxy [MouseAdapter] []
|
|
(mouseClicked [evt] (swap! dir -))))
|
|
|
|
(defn animator []
|
|
(while true
|
|
(Thread/sleep 100)
|
|
(swap! pos #(-> % (+ @dir) (mod text-ct)))
|
|
(.setText label (rotations @pos))))
|
|
|
|
(doto (JFrame.)
|
|
(.add label)
|
|
(.pack)
|
|
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
|
|
(.setVisible true))
|
|
|
|
(future-call animator) ;simple way to run animator on a separate thread
|