jueves, 24 de febrero de 2011

Java: Derivar la salida de mensajes a un JTextArea y no morir en el intento

El otro día estuve haciendo una pequeña clase que dibujaba en un JFrame un JTextArea y cuya misión era recoger todos los mensajes que se generasen en otros módulos del una aplicación mayor mediante la salida estándar System.out.println(...). Lo que en principìo iba a ser un camino de rosas se convirtió en una pequeña batalla de esas que suelen surgir por cualquier tontería que uno se empeña en hacer.

El problema radicaba en que si escribía directamente en el JTextArea caracteres acentuados (á,é,...) u otro tipo como "ñ" las escribía correctamente, es decir, el juego de caracteres (CharSet) utilizado era el correcto, sin embargo cualquier salida que viniese tanto por la lectura del contenido de un fichero como por la utilización directa del método println no lo reconocía y lo mostraba con un pequeño cuadro en blanco.

La redirección la hacía así:
...
CTextAreaOutputStream taos = new CTextAreaOutputStream(textArea);
System.setOut(taos);
...

Estando definidia la clase CTextAreaOutputStream como:

public class CTextAreaOutputStream extends OutputStream {
private JTextArea jta
public CTextAreaOutputStream(JTextArea jta) { this.jta = jta;}
public void write(int theByte){
char theChar = (char)theByte;
jta.append(""+theChar);
}
}

Finalmente, después de mucho probar y buscar, dí con la solución, y no es otra que sobreescribir el método sincronizado println y no write de forma que el resultado final quedó así:

...
CTextAreaOutputStream taos = new CTextAreaOutputStream();
//Redirijo los println
System.setOut(new PrintStream(taos, true){
public synchronized void println(String s){
if((s != null)&&(s.length() > 0)){
textArea.setText(textArea.getText() + " " + s);
}
}
});
...

Y la clase

public class CTextAreaOutputStream extends OutputStream {
public void write(int theByte){}
}

Una clase vacía, quizás una solución poco elegante, pero funcionó, que era lo que se buscaba.

Bye.

Share

Twitter Delicious Facebook Digg Stumbleupon Favorites