2010-06-02 19 views
5

Richiesta: Emettere un log di un'applicazione Java in un componente della GUI, come ad esempio JTextArea.Log Java ==> JTextArea

Preoccupazione: È necessario registrare le informazioni da qualsiasi classe, in modo statico. Tuttavia, il componente del logger della GUI non deve essere statico (ovviamente) poiché è il membro di un componente padre.

Cosa devo fare?

risposta

2

Creare un provider di log di singelton e aggiungere il "campo di testo" come listener ad esso.

Esempio di singelton logger:

interface Listener { 
    void log(String log); 
} 

enum Logger { 

    instance; 

    private List<Listener> listeners = new LinkedList<Listener>(); 

    public void addListener(Listener l) { 
    synchronized(listeners) { 
     listeners.add(l); 
    } 
    } 

    public void log(String log) { 
     synchronized(listeners) { 
      for(Listener l : listeners) 
       l.log(log); 
     } 
    } 
} 

Aggiungi la tua ascoltatore (che sarà necessario implementare voi stessi) in questo modo:

Logger.instance.addListener(myTextField); 

e usarlo (da qualsiasi classe) in questo modo:

Logger.instance.log("Hello World!"); 

Oppure è possibile utilizzare un pacchetto come log4j.

+3

Non scrivere ancora un altro framework di registrazione, ma non farlo. Usa log4j (o slf4j, sembra essere di gran moda) – Justin

+2

Non sono d'accordo, non aggiungere un'altra dipendenza se vuoi fare qualcosa di così semplice .. – dacwe

1

I dati mi vengono in mente. È necessario un modello che rappresenti il ​​registro e che questo modello sia associato a un componente della GUI. Un framework per i database comune per SWT è JFace Databinding, sono sicuro che esiste qualcosa di simile per SWING.

Come funziona: il logger aggiunge messaggi al modello, forse solo un arraylist di stringhe (log in). Le classi di associazione dati ascoltano il modello e aggiornano la GUI ogni volta che il modello è cambiato. Funzionerebbe anche il contrario (le modifiche sulla GUI potrebbero essere inviate al modello) ma ti servirà solo una direzione.

2

Accedere a un file, fare in modo che il componente segua la coda del file. Probabilmente vorrete usare la registrazione XML di log4j se volete mettere l'output in una griglia.

Aggiornamento: In alternativa è possibile implementare un registratore circolare in memoria.

+0

buona chiamata - questo disaccoppia i tempi/requisiti di priorità. La registrazione dovrebbe essere ad alta priorità, la visualizzazione del registro non dovrebbe. –

1

Fai attenzione alle dipendenze circolari tra classi e pacchetti, non vuoi il codice spaghetti.

mia domanda battente esiste su 9 moduli (controllore, applicazione, piattaforma, utils, modello, persistenza, servizio, logger, e mostra)

Qui sono dipendenze:

view -> logger, controller, utils, model 
controller -> logger, application, model, utils 
application -> service, model, utils, platform 
service -> persistence, model, utils 
platform -> model 
utils -> no dependencies 
model -> no dependencies 
logger -> model, utils 

una dipendenza desiderato è dalla vista al controller ma non dal controller alla vista.

Quindi il migliore è aggiungere un registratore di moduli e creare un gestore (che è un osservabile) che notifica gli osservatori (vista come JFrame, JFace = osservatori).

I moduli Vista e assistenza (luogo in cui si desidera attivare l'osservatore) non dipendono l'uno dall'altro ma tramite il modulo logger.

Ma penso che il databinder funzioni anche in questo modo. Suppongo che tu non sia dipendente dalla struttura.La mia soluzione no, quindi se voglio passare da Swing a swt, non preoccuparti, la implemento solo per swt e la mia logica di business rimane intatta.

Dovreste tutti pensare più al design. (E usa Maven.)