Lembro que eu tinha feito uma classe chamada JtextAreaOutputStream que estende OutputStream, a ideia dessa classe eh criar uma JtextArea que eu possa imprimir como eu faco para imprimir num
console por exemplo.
Sabendo que a classe TeeOutputStream permite que eu direcione o meu output para dois lugares diferentes, fiz o seguinte programa:
import java.io.*;
import javax.swing.*;
import java.awt.*;
import org.apache.commons.io.output.*;
@SuppressWarnings("serial")
public class Logger extends JFrame {
JTextArea textarea;
JTextAreaOutputStream textarea_out;
TeeOutputStream _tee;
public Logger() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textarea = new JTextArea();
textarea_out = new JTextAreaOutputStream(textarea);
//_tee = new TeeOutputStream( textarea_out, System.out);
try {
_tee = new TeeOutputStream( textarea_out, new FileOutputStream("log.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
PrintStream ws = new PrintStream(_tee);
add(textarea);
setSize(new Dimension(300,300));
setVisible(true);
for (int i = 0; i <= 10; i++ ) {
ws.println("[msg] - printing log");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
ws.close();
}
public static void main(String[] args) {
new Logger();
}
public class JTextAreaOutputStream extends OutputStream {
private StringBuilder sb = new StringBuilder();
private JTextArea txt = new JTextArea();
public JTextAreaOutputStream(JTextArea txtArea) {
this.txt = txtArea;
}
public void flush() { }
public void close() { }
public void write(int b) throws IOException {
if (b == '\r') {
return;
}
if (b == '\n') {
txt.append(sb.toString());
sb.setLength(0);
}
sb.append((char)b);
}
}
}
As partes mais importantes do codigo sao:
JTextArea textarea = new JTextArea();
JTextAreaOutputStream textarea_out = new JTextAreaOutputStream(textarea);
TeeOutputStream _tee = new TeeOutputStream( textarea_out, System.out);
Primeira linha somente criar um objeto JtextArea.
Segunda linha eu crio um objeto JtextAreaOutputStream e passo pro construtor o meu JtextArea.
Terceira linha, se vc lembra bem o meu ultimo post sobre a classe TeeOutputStream o contructor recebe dois parametros do tipo OutputStream eu eu usei o meu objeto textarea_out que eh um OutputStream e System.out que eh um OutputStream. Dai pra frente eh auto-explicativo.
Nesse exemplo o programa esta imprimindo para um JtextArea e para o terminal.
Caso vc queria imprimir por exemplo para um arquivo eh so alterar o parametro System.out no construtor do TeeOutputStream para FileOutputStream(“log.txt”) que eh uma classe derivada de OutputStream portanto eh valida como paramtero para o TeeOutputStream, por exemplo:
try {
_tee = new TeeOutputStream( textarea_out, new FileOutputStream("log.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Isso vai imprimir para o textarea_out e para o arquivo chamado log.txt
Bom, eh isso ae pessoal, mais uma semana comecando estou iniciando um novo projeto no meu trabalho que eu acho que vai ser muito legal neste ultimo mes antes de mudar de trabalho.
O frio por aqui continua mas esta melhorando!! =)

0 comments:
Post a Comment