http://www.paullegato.com/blog/swing-clojure-gui-black-scholes/

ел бы создать простое приложение Swing. Однако у меня очень, очень, очень небольшой опыт работы с Swing. Я хочу создать приложение с одним окном, которое обновляется каждые 5 минут с использованием содержимого скриншота, которое я делаю. Я использую Clojure для написания кода. Я предполагаю, что Swing - способ пойти с этим, но если есть другие, лучшие варианты, я хотел бы услышать больше о них.

Какой код мне нужно сделать это с Swing? (какие классы мне следует использовать и т. д.)

Спасибо Алекс

Ответы на вопрос(6)

упомянутых @Zach L (особенно в отношении таймеров), я бы внимательно посмотрел нанеустойчивоТем более, что ты пишешь это на Clojure.

В частности, я отмечаюseesaw.timer для запуска обновления событий. Использование JTextPane (только для чтения) или JEditorPane (редактируемый) будет хорошо работать для отображения богато отформатированных результатов (например, HTML).

часы для переменных; Ваш обратный вызов выполняется всякий раз, когда переменная изменяется (чем-либо). Это очень хорошо подходит для программирования GUI. Ваш графический интерфейс может автоматически обновляться всякий раз, когда что-либо касается переменной.

Вот короткий, но нетривиальный пример того, как это сделать, с объяснением того, что происходит:http://www.paullegato.com/blog/swing-clojure-gui-black-scholes/

но соединить все части может быть довольно сложно, если вы изучаете 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.

javax.swing.Timer имеет некоторые преимущества; есть примерВот, В зависимости от того, что вы хотите отобразить,JEditorPane может быть уместным.

 Zach L21 янв. 2011 г., 06:33
Doh! Как я мог забыть про таймер свинга :-p
Решение Вопроса

java.util.TimerTask должен быть полезен Для общей информации о Swing,эта ссылка на учебники Java должен помочь.

Иметь окно, в частности,JFrame это, вероятно, ваш лучший выбор.

Чтобы отобразить однострочный или многострочный текст, вы должны посмотреть наJLabel или жеJTextAreaсоответственно.

Для отображения изображенийImageIcon должен сделать трюк.

Для других нужд Учебное пособие по Java должно быть большой помощью.

Какtrashgod Предполагается, что javax.swing.Timer имеет некоторые преимущества, когда дело доходит до графического интерфейса пользователя по сравнению с java.util.TimerTask. Эта статья оиспользование таймеров в приложениях Swing должен помочь вам решить, какой использовать.

 deterb09 июл. 2012 г., 03:54
Хорошее начало, но вы полностью пропустили на качелях (github.com/daveray/seesaw), похоже, это сделает разработку приложений значительно менее болезненной в Clojure.
 trashgod21 янв. 2011 г., 07:01
+1 за предложение альтернатив.

ссылка для качелей. Как сказал Зак, вам нужно использовать JFrame, а TimerTask следует использовать для ваших требований.

Вы также можете попробовать другие альтернативные фреймворки для Swing.

Ваш ответ на вопрос