Atualização de JTextArea [RESOLVIDO]

12 respostas
oitathi

Estou criando um JTextArea que recebe linhas de um arquivo txt a cada 7 segundos. Eu preciso que a medida que esses dados forem chegando eles sejam incluídos na TextArea. Porém, a unica maneira que eu consegui fazer isso, foi concatenando a linha antiga com a nova, como mostro no código. Mas eu estou quase certa de que exista uma forma mais inteligente e limpa de se fazer isso. Alguém pode me ajudar? Agora, caso essa seja a única meneira, eu gostara de que quando eu tivesse x número de linhas, a primeira linha que foi mostrada ( a mais antiga) fosse apagada, para que uma nova fosse inserida na TextArea e assim sucessivamente… Alguém poderia me ajudar?
Obrigada

private String line="";
public void completaArea(String dados){
    StringBuilder strBld = new StringBuilder();
    strBld.append(line);
    strBld.append("\n");
    strBld.append(dados);
    line=strBld.toString();
    area.setText(line);
 }

12 Respostas

samuel.grigolato

Você pode usar o .append("\n" + linha) direto no JTextArea, para o requisito da quantidade máxima de linhas teria que manter uma lista de Strings externa ao JTextArea e tratar esse limite por sua conta, sempre atualizando o texto do JTextArea à partir dessa lista.

Obs: essa é apenas uma forma, devem existir outras, como por exemplo extender a classe Document, este seria o método mais “OO” de se fazer.

ViniGodoy

Oi.
Dê uma olhada nesse componente aqui:
http://www.guj.com.br/posts/list/135749.java#730553

Vai permitir que você escreva no JTextArea como se escrevesse no System.out.
E com uma vantagem, você pode habilitar nele o auto-scroll.

Outra coisa, o JTextArea também tem o método append.

oitathi

sim, mas quanto a minha textArea ter uma quantidade de linhas definidas, eu fiz como o amigo acima citou. Criei uma lista de Strings e nela foi incluindo cada linha que chegava. Porem, não dá certo, quando tem q aparecer a segunda linha dah erro: Exception in thread “Thread-2” java.lang.RuntimeException: Uncompilable source code

LinkedList lista = new LinkedList();

contaLinha(linha);
completaArea(lista);

public LinkedList contaLinha (String linha){
   if(lista.size()<500){
       lista.addLast(linha);
    }//end if
    else{
        lista.removeFirst();
        lista.addLast(linha);
    }//end else
    return lista;
 }

 public void completaArea(LinkedList lista){
     for(Iterator<String> it = lista.iterator(); it.hasNext();){
         area.setText(it.next());
   }
}
ViniGodoy

Use a classe que indiquei com AutoScroll ligado. A menos que você vá inserir MUITAS linhas, não vale a pena fazer um código para fazer a limpeza do JTextArea.
Se você realmente precisar desse código, posso passa-lo para você. Mas não é tão trivial quanto parece, pois envolve manipulação do Document diretamente.

samuel.grigolato

Se mesmo com as dicas do Vini (o AutoScroll vai manter a última linha digitada aparecendo) você precisar corrigir este código, deve trocar a linha:

por:

e adicionar um:

antes do for que itera as linhas.

oitathi

Bom, eu qureo ter o parâmetro de 300 linhas… isso é bastante, não é?
Eu acho que vai precisar… mesmo pq a minha TextArea jah tah dentro de um ScroolPane…

oitathi

quase deu certo, dei uma modificada no texto, como disse o amigo acima, porém, quando vai adiciona a linha seguinte, ela é adicionada ao lado da ultima e não embaixo… será q alguém sabe o motivo?

public void completaArea(LinkedList lista){
     area.setText("");
      for(Iterator<String> it = lista.iterator(); it.hasNext();){
         area.append(it.next());
      }
}
samuel.grigolato

troque para:

oitathi

consegui… mudei para

public void completaArea(LinkedList lista){
    area.setText("");
       for(Iterator<String> it = lista.iterator(); it.hasNext();){
          area.append(it.next());
           area.append("\n");
      }
}
samuel.grigolato

Exato, se mudasse da forma que falei apareceria uma linha em branco acima de todas as outras, você que escolhe onde quer o excesso. :smiley:

oitathi

Poxa, obrigada mesmo!!!

oitathi

funcionou…

Criado 29 de julho de 2010
Ultima resposta 29 de jul. de 2010
Respostas 12
Participantes 3