Ты прав.Swing - это путь, но соединить все части может быть довольно сложно, если вы изучаете Clojure и Swing.Есть несколько коротких примеров, показывающих, как создавать простые Swing GUI в Clojure.Вот еще один короткий пример, который объединяет простой графический интерфейс с Timer
объектом.
(ns net.dneclark.JFrameAndTimerDemo
(:import (javax.swing JLabel JButton JPanel JFrame Timer))
(:gen-class))
(defn timer-action [label counter]
(proxy [java.awt.event.ActionListener] []
(actionPerformed
[e]
(.setText label (str "Counter: " (swap! counter inc))))))
(defn timer-fn []
(let [counter (atom 0)
label (JLabel. "Counter: 0")
timer (Timer. 1000 (timer-action label counter))
panel (doto (JPanel.)
(.add label))]
(.start timer)
(doto (JFrame. "Timer App")
(.setContentPane panel)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setLocation 300 300)
(.setSize 200 200)
(.setVisible true))))
(defn -main []
(timer-fn))
При запуске это создаст небольшое окно с меткой, которая обновляется каждую секунду.Из вашего описания вы бы изменили частоту таймера с 1000 мс до 300 000 мс, чтобы запускать действие каждые 5 минут.Чтобы сделать что-то кроме обновления метки, вы должны изменить содержимое функции timer-action
.
I думаю это потокобезопасно, но не проверено наверняка.При обновлении компонентов Swing также есть предостережения и руководства по безопасности потоков.Возможно, вы тоже захотите это проверить.
Я надеюсь, что это достаточно информативно, чтобы дать вам несколько подсказок о том, где искать дополнительную информацию.
РЕДАКТИРОВАТЬ Я хотел бы отметить еще одну интересную вещь здесь.Обратите внимание, что функция «timer-action» меняет значение одного из своих аргументов.Аргумент 'counter' - это атом, определенный в 'timer-fn', но слушатель действия может его изменить.Это то, что вы обычно не можете делать в Java.Может быть, кто-то умнее меня может прокомментировать, является ли это «закрытием».В моем предыдущем опыте работы с такими языками, как Pascal, я бы сказал, что передача аргументов - это «вызов по ссылке», а не строгая передача аргументов «вызов по значению» в Java.Это что-то другое?
РЕДАКТИРОВАТЬ 2 : После проверки моих фактов с помощью другого вопроса, это, на самом деле, пример закрытия в Clojure.