2011-01-21 3 views
8

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

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

Спасибо, Alex

ответ

8

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

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

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

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

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

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

+1

+1 для предложений альтернатив. – trashgod

+1

Хорошее начало, но вы полностью пропустили на качелях (https://github.com/daveray/seesaw), который выглядит так, что приложение будет значительно менее болезненным в Clojure. – deterb

2

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

+1

Doh! Как я мог забыть о таймере качания: -p –

0

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

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

4

Вы правы. Swing - это путь, но соединение всех частей может быть немного жестким, если вы изучаете Clojure и Swing. Существует несколько коротких примеров, в которых показано, как создавать простые графические интерфейсы Swing в 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 существуют предостережения и руководства по безопасности потоков. Вероятно, вы тоже захотите их проверить.

Надеюсь, это достаточно информативно, чтобы дать несколько подсказок относительно того, где искать дополнительную информацию.

EDIT: Я хотел указать еще одну интересную вещь здесь.Обратите внимание, что функция «timer-action» меняет значение одного из своих аргументов. Аргумент «counter» - это атом, определенный в «timer-fn», но прослушиватель действий может его изменить. Это то, что вы обычно не можете делать на Java. Может быть, кто-то умнее меня может прокомментировать, является ли это «закрытием». В моем предыдущем опыте с такими языками, как Pascal, я бы сказал, что передача аргумента является «вызовом по ссылке», в отличие от строгой передачи аргументов Java «по вызову». Это что-то другое?

EDIT 2: После проверки моих фактов другим вопросом, это, на самом деле, пример закрытия в Clojure.

0

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

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

1

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

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

Смежные вопросы