estou tentando passar minhas saídas padrão para o meu JTextArea...
mas por sinal eu to travadão em como o meu JtextArea pode disponibilizar meus prints...
como faço para que meu setOut e meu setErr envie suas mensagens através do JTextArea ?
vou precisar do pacote java.io ?
Essa é uma clase útil para redirecionar um Writer para um TextComponent qualquer.
Mas como vc quer um Stream, veja o post ali debaixo.
publicclassTextComponentWriterextendsWriter{privateStringBuilderbuffer=newStringBuilder();privateThreadbufferThread;privateJTextComponenttextComponent;privatebooleanautoScroll=true;publicTextComponentWriter(JTextComponenttextComponent){this.textComponent=textComponent;Runnabler=newRunnable(){publicvoidrun(){try{while(!Thread.interrupted()){writeBuffer();Thread.sleep(100);}}catch(InterruptedExceptione){}writeBuffer();}};bufferThread=newThread(r,"TextComponentWriter Thread");bufferThread.setDaemon(true);bufferThread.start();}@Overridepublicvoidwrite(finalintb)throwsIOException{write(newchar[]{(char)b},0,1);}@Overridepublicsynchronizedvoidwrite(char[]cbuf,intoff,intlen)throwsIOException{buffer.append(cbuf,off,len);}privatesynchronizedvoidwriteBuffer(){if(buffer.length()==0)return;finalStringstr=buffer.toString();buffer=newStringBuilder();EventQueue.invokeLater(newRunnable(){publicvoidrun(){if(isAutoScroll())textComponent.setCaretPosition(textComponent.getDocument().getLength());elseif(textComponent.getCaretPosition()==textComponent.getDocument().getLength()&&textComponent.getDocument().getLength()>0)textComponent.setCaretPosition(textComponent.getDocument().getLength()-1);try{textComponent.getDocument().insertString(textComponent.getDocument().getLength(),str,null);}catch(BadLocationExceptione){//Faça o log da exceção aqui}}});}@Overridepublicvoidflush(){}@Overridepublicvoidclose(){bufferThread.interrupt();}publicbooleanisAutoScroll(){returnautoScroll;}publicvoidsetAutoScroll(booleanautoScroll){this.autoScroll=autoScroll;}@Overrideprotectedvoidfinalize()throwsThrowable{close();}}
Esse worker thread torna o stream mais eficiente, caso o seu documento seja colorido. Descobrimos que o JTextArea não funciona lá tão bem assim nesses casos.
ViniGodoy
Sorry, a classe de cima não serve. Ela serve para outros tipos de output.
Use essa aqui no lugar:
publicclassTextComponentStreamextendsOutputStream{privateJTextComponenttextComponent;privateStyleerror;publicTextComponentStream(JTextComponenttextComponent,Styleerror){this.textComponent=textComponent;this.error=error;}publicvoidprintln(Stringtext){print(text+"\n");}publicvoidprint(Stringtext){try{write(text.getBytes());}catch(IOExceptione){//Faça o log da exceção aqui}}@Overridepublicvoidwrite(finalintb)throwsIOException{write(newbyte[]{(byte)b},0,1);}@Overridepublicvoidwrite(finalbyte[]b,finalintoff,finalintlen)throwsIOException{finalStringstr=newString(b,off,len);EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{textComponent.getDocument().insertString(textComponent.getDocument().getLength(),str,error);}catch(BadLocationExceptione){//Faça o log da exceção aqui}}});}@Overridepublicvoidflush(){}@Overridepublicvoidclose(){}}
Essas duas classes são excelentes para se ter na manga.
Tente usar elas “de fora”… e mais tarde, se quiser, tente entende-las.
Se vc nunca lidou com Documents no Java, dá uma olhada no tutorial do GUJ chamado “Controlando um TextField”.
javakid
OK, obrigado colega!
C
cunha_jacson
Caro viniGodoy
Me desculpe se estou sendo ignorante, mas os métodos: System.setOut() e System.setErr() pedem como parâmetro um objeto tipo PrintStream, e a classe TextComponentStream é do tipo OutputStream.