2011-01-21 6 views
8

Mi piacerebbe creare una semplice app Swing. Tuttavia, ho un'esperienza molto, molto, molto piccola con Swing. Voglio creare un'app di una finestra che si aggiorni ogni 5 minuti con i contenuti di uno screen-scraping che faccio. Sto usando Clojure per scrivere il codice. Presumo che Swing sia la via da seguire, ma se ci sono altre opzioni migliori mi farebbe piacere saperne di più su quelle.Principiante a Swing

Quale codice avrei bisogno di fare questo con Swing? (Quali classi dovrei usare, ecc)

Grazie, Alex

risposta

8

Beh, per il bit ogni cinque minuti, java.util.TimerTask dovrebbe essere di aiuto. Per informazioni Swing generali, this link to the Java Tutorials dovrebbe aiutare.

Per avere una finestra, in particolare, JFrame è probabilmente la soluzione migliore.

Per visualizzare testo singolo o multilinea, è necessario esaminare JLabel o JTextArea, rispettivamente.

Per visualizzare le immagini, ImageIcon dovrebbe fare il trucco.

Per altre esigenze, il Tutorial Java dovrebbe essere di grande aiuto.

Come suggerito da trashgod, javax.swing.Timer presenta alcuni vantaggi quando si tratta di GUI su java.util.TimerTask. Questo articolo su using timers in Swing applications dovrebbe aiutarti a decidere quale usare.

+1

+1 per suggerire alternative. – trashgod

+1

Buon inizio, ma hai completamente perso l'altalena (https://github.com/daveray/seesaw), che sembra rendere lo sviluppo dell'app meno doloroso in Clojure. – deterb

2

In un contesto Swing, javax.swing.Timer presenta alcuni vantaggi; c'è un esempio here. A seconda di ciò che si desidera visualizzare, JEditorPane potrebbe essere appropriato.

+1

Doh! Come potrei dimenticare il timer swing :-p –

0

Prova questo link per Swing. Come ha detto Zach, dovrai usare JFrame e TimerTask dovrebbe essere usato per le tue esigenze.

Puoi anche provare altri framework alternativi per Swing.

4

Hai ragione. Swing è la strada da percorrere, ma collegare tutti i pezzi può essere un po 'difficile se stai imparando Clojure e Swing. Ci sono alcuni brevi esempi che mostrano come creare semplici GUI Swing in Clojure. Ecco un altro breve esempio che combina una semplice interfaccia grafica con un oggetto 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)) 

Quando eseguito, questo creerà una piccola finestra con un'etichetta che viene aggiornata ogni secondo. Dalla tua descrizione, cambieresti la frequenza del timer da 1.000 a 300.000 ms per attivare un'azione ogni 5 minuti. Per fare qualcosa di diverso dall'aggiornamento di un'etichetta, si cambierebbe il contenuto della funzione timer-action.

I think questo thread è sicuro, ma non è stato verificato. Ci sono precauzioni e tutorial sulla sicurezza dei thread durante l'aggiornamento anche dei componenti Swing. Probabilmente vorrai controllare anche quelli.

Spero che questo sia abbastanza informativo per darti alcuni indizi su dove cercare ulteriori informazioni.

EDIT: volevo indicare una cosa più interessante qui.Si noti che la funzione 'timer-action' sta cambiando il valore di uno dei suoi argomenti. L'argomento 'contatore' è un atomo definito in 'timer-fn', ma il listener di azioni è in grado di cambiarlo. Questo è qualcosa che di solito non puoi fare in Java. Forse qualcuno più intelligente di me può commentare se questo costituisce una "chiusura". Nella mia precedente esperienza con linguaggi come Pascal, direi che l'argomento che passa è "call-by-reference" in opposizione al rigoroso argomento "call-by-value" di Java che passa. È qualcosa di diverso?

EDIT 2: Dopo aver verificato i miei fatti con un'altra domanda, questo è, in effetti, un esempio di chiusura in Clojure.

0

La memoria transazionale del software di Clojure consente di impostare gli orologi su variabili; il tuo callback viene eseguito ogni volta che la variabile viene modificata (da qualsiasi cosa). Questo si presta molto bene alla programmazione GUI. La GUI può aggiornarsi automaticamente ogni volta che qualcosa tocca la variabile.

Ecco una breve ma non banale esempio di come fare questo, con la spiegazione di ciò che sta accadendo: http://www.paullegato.com/blog/swing-clojure-gui-black-scholes/

1

In cima alle risorse di cui parla @Zach L (in particolare per quanto riguarda i timer), I darebbe un'occhiata a Seesaw, specialmente da quando lo scrivi in ​​Clojure.

In particolare, noto lo seesaw.timer per l'attivazione degli eventi di aggiornamento. L'utilizzo di un JTextPane (sola lettura) o di un JEditorPane (modificabile) potrebbe funzionare bene per la visualizzazione di risultati ricchi di formattazione (come HTML).