Mensagem de processamento em um JTextArea

21 respostas
brunosardao

Galera,

Eu preciso de uma ajuda, eu possuo um programa e nele tem algumas mensagens de processamento, tipo: “Lendo arquivo”, “Atualizando arquivo”, “Arquivo Salvo”, porém elas estão saindo só na console com o System.out.println.

Eu criei um JFrame através do Netbeans e adicionei um JTextArea, como posso fazer para que minhas mensagens possam ser impressas no JTextArea ?

Eu tentei assim:

Mas não deu certo.

Vocês poderiam me ajudar ??

Obrigado,

21 Respostas

drsmachado

Mas não deu certo.

Isso por quê?
Erro?
Exception?
Não aparece?

Rodrigo_Sasaki

não sei se resolve… mas você poderia tentar usar o método append(), ao invés do setText().

se não resolver siga as instruções do drsmachado hehe :wink:

JhowTroMundo

Tenta txtArea.append(string)

brunosardao

Foi mal drsmachado , realmente, não aparece nada, mas o processamento ocorre normalmente…

JhowTroMundo e digaoneves

Fiz o append também, mas mesmo assim, ficou em branco, o processamento ocorre, porém não aparece nada o JTextArea.

JhowTroMundo

Posta o código.

brunosardao
JonaTHANNM

não vejo nada de errado nesta linha do código…
teria que ter funcionado

brunosardao

então, estranho, pois logo que processo, ele não mostra nada.

JonaTHANNM

vc verificou se ele está conseguindo ir buscar o arquivo?

brunosardao

Então, o processamento em si funciona normal, ocorre todos os processos, meus arquivos são salvos com os dados que preciso, porém, só as mensagens das etapas do processamento que não são impressas no JTextArea.

JonaTHANNM

ami é o seguinte, na linha em que vc fez:

Principal novo = new Principal();
novo.processar(odate, ambiente);

vc está dando uma nova instancia de Principal e jogando todos os valores nesta nova instancia, então faça o seguinte:

processar(odate, ambiente);

e em todas as linhas em que vc seta no textArea, mude para:

txtArea.append("");

para poder concatenar com todas as outras…

brunosardao

JonaTHANNM

Legal, funcionou, mas de um jeito estranho…

Ao invés de aparecer linha por linha, igual quando é impresso na console, ele ficou em branco e depois jogou tudo de uma vez na minha TextArea.

Como posso fazer para ir imprimindo, linha por linha ?

ViniGodoy

Acho que essa classe vai te interessar:
http://www.guj.com.br/java/83462-ajuda-com-um-jtextarea-especial#445260

Ela redireciona o System.out para um JTextArea. E já trata automaticamente a questão de fluxos muito grandes e rápidos de texto.

Para que você veja a impressão linha por linha, você precisa disparar todo seu processamento numa Thread separada.

brunosardao

Vini,

Então no caso, com essa classe que você indicou, eu consigo redirecionar os meus System.out.println para o JTextArea ?

Pois eu vi que parece que na sua explicação, a pessoa esta usando a classe para passagem de mensagens de erro, bom acredito que de na mesma, mas posso usá-la mesmo assim ?

As mensagens que eu tenho no programa no código que esta acima são bem simples, tipo: Lendo arquivo, gravando dados, processo finalizado, nada demais…

ViniGodoy

Sim, consegue sim.

Você pode usar para o que quiser. Geralmente usamos o System.err pra mensagens de erro.

Sem problemas, com aquelas classes, ao fazer um System.out ou System.err, ele vai cair no seu JTextArea.

brunosardao

Vini,

E com esta classe que você fala né ?:

public class TextComponentStream extends OutputStream {   
    private JTextComponent textComponent;   
    private Style error;   
  
    public TextComponentStream(JTextComponent textComponent, Style error) {   
        this.textComponent = textComponent;   
        this.error = error;   
    }   
       
    public void println(String text) {   
        print(text + "\n");   
    }   
       
    public void print(String text) {   
        try {   
            write(text.getBytes());   
        }   
        catch (IOException e) {   
            //Faça o log da exceção aqui   
        }   
    }   
       
    @Override   
    public void write(final int b) throws IOException {   
        write(new byte[] {(byte) b}, 0, 1);   
    }   
  
    @Override   
    public void write(final byte[] b, final int off, final int len)   
    throws IOException {   
        final String str = new String(b, off, len);   
  
        EventQueue.invokeLater(new Runnable() {   
            public void run() {   
                try {   
                    textComponent.getDocument().insertString(   
                            textComponent.getDocument().getLength(), str, error);   
                }   
                catch (BadLocationException e) {   
                    //Faça o log da exceção aqui   
                }   
            }   
        });   
    }   
  
    @Override   
    public void flush() {}   
  
    @Override   
    public void close() {}       
}

E para usá-la, usa-se isso:

public Style getErrorStyle()   
    {   
        Style style = getTxtPane().getStyledDocument().addStyle("error",   
                null);   
        StyleConstants.setForeground(style, Color.red);   
  
        return style;   
    }   
  
  
//Mais tarde...   
System.setOut(new TextComponentStream(getTxtPane(), null));   
System.setErr(new TextComponentStream(getTxtPane(), getErrorStyle());

Agora, só desculpa a minha ignorância, como posso passar os meus “System.out” para serem impressos no JTextArea com esta classe?

Não consegui entender o código a fim de descobrir a maneira de fazer com que seja possível ler minhas mensagens conforme abaixo:

txtArea.setText("Lendo o arquivo : " + "  " + arquivos[i].getName() + "\n");

Obrigado

ViniGodoy

É isso mesmo.

Primeiro de tudo, redirecione o seu Out para o seu JTextArea:

Depois é só dar System.out normalmente.

levimendes

http://guj.com.br/java/242228-componentes-jtextarea-nao-e-atualizado

brunosardao

Vini e Levi,

Obrigado pelos toques,

vou praticar aqui e surgindo novas duvidas, volto novamente.

vlw…

brunosardao

brunosardao

Galera, resolvi, era um metodo incluido a mais…hehehe,

vlw

Criado 30 de maio de 2011
Ultima resposta 30 de mai. de 2011
Respostas 21
Participantes 7