2010-06-02 7 views
5

Necesito: Imprima un registro de la aplicación Java en un componente de la GUI, como un JTextArea.Java Log ==> JTextArea

Preocupación: Necesita registrar cosas de cualquier clase, de manera estática. Sin embargo, el componente del registrador GUI no debe ser estático (obviamente) ya que es el miembro de un componente principal.

¿Qué debo hacer?

Respuesta

2

Crea un proveedor de registro de singelton y agrega el "campo de texto" para escucharlo.

Ejemplo de la singelton registrador:

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); 
     } 
    } 
} 

Agregar su oyente (que tendrá que aplicar a sí mismo) como esto:

Logger.instance.addListener(myTextField); 

y usarlo (de cualquier clase) así:

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

O puede utilizar un paquete como log4j.

+3

No escriba otro framework de registro, simplemente no lo haga. Use log4j (o slf4j, parece estar de moda) – Justin

+2

No estoy de acuerdo, no agregue otra dependencia si quiere hacer algo así de simple ... – dacwe

1

Me vienen a la mente los enlaces de datos. Necesita un modelo que represente su registro y este modelo esté vinculado a un componente GUI. Un marco de enlace de datos común para SWT es JFace Databinding, estoy seguro de que existe algo similar para SWING.

Cómo funcionaría - el registrador agrega mensajes al modelo, quizás solo un Arraylist de Strings (logentries). Las clases de enlace de datos escuchan el modelo y actualizan la GUI cada vez que el modelo ha cambiado. También funcionaría al revés (las ediciones en la GUI podrían enviarse al modelo) pero solo necesitarás una dirección.

2

Inicie sesión en un archivo, haga que el componente siga la cola del archivo. Probablemente desee utilizar el registro XML de log4j si desea colocar el resultado en una grilla.

Actualización: De forma alternativa, puede implementar un registrador circular en memoria.

+0

buena llamada - esto desacopla los requisitos de tiempo/prioridad. El registro debe ser de alta prioridad, mostrar el registro no debe. –

1

Tenga cuidado con las dependencias circulares entre sus clases y paquetes, no desea el código de espagueti.

Mi aplicación Swing existe de 9 módulos (controlador, aplicación, plataforma, utils, modelo, persistencia, servicio, registrador, y ver)

Aquí dependencias:

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 dependencia deseada es desde la vista hasta el controlador, pero no desde el controlador para ver.

Así que lo mejor es agregar un registrador de módulo y crear un controlador (que es un observable) que notifica a los observadores (ver como JFrame, JFace = observadores).

La vista y el módulo de servicio (lugar donde desea desencadenar el observador) no dependen uno del otro sino a través del módulo de registrador.

Pero creo que el enlazador de datos funciona también de esa manera. Supongo que a excepción de que eres dependiente del marco.Mi solución no lo es, así que si quiero cambiar de Swing a swt, no me preocupo, solo lo implemento para swt, y mi lógica de negocios permanece intacta.

Todos deberían pensar más en el diseño. (Y use maven.)