Новичок в качелях - PullRequest
       38

Новичок в качелях

8 голосов
/ 21 января 2011

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

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

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

Ответы [ 6 ]

8 голосов
/ 21 января 2011

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

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

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

Чтобы отобразить изображения, ImageIcon должен добиться цели.

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

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

4 голосов
/ 26 января 2011

Ты прав.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.

2 голосов
/ 09 июля 2012

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

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

2 голосов
/ 21 января 2011

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

0 голосов
/ 07 февраля 2011

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

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

0 голосов
/ 21 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...