Como ficar atualizando um JtextArea dinamicamente?

10 respostas
H

Pessoal,

Eu estou com o seguinte problema:eu tenho um programa cuja interface grafica existe um botão que dispara um metodo e um componente JTextArea…esse metodo tem execução muito demorada e tem muitos System.out.println mostrando seu processamento(resultados)…queria saber como ficar exibindo dinamicamente esses resultados invez do console ,eu queria ficar exibindo no JtextArea enquanto o metodo está executando os resultados são mostrados…

Eu sei fazer isso apenas guardando o resultado do meu metodo numa String e depois dando um append no JtextArea mas isso não seria dinamico pois só ocorreria ao final do metodo terminar o processamento…

Será que fui claro na minha duvida?Alguem pode me ajudar?

10 Respostas

S

Utilize uma Thread para realizar o append()

Se você postar parte do código aqui fica mais fácil! =)

H
"SeuDimas":
Utilize uma Thread para realizar o append()

Se você postar parte do código aqui fica mais fácil! =)

Cara o meu codigo não tem nada demais,algo do tipo:

public class Seila{

public Seila(){

//aqui vão os componentes graficos sendo postos e um deles é um botão 
//e Jtextarea
}

public metodo(){
int i,resultado;
while(/*condição que demora um bocado de tempo*/ ){
//Varios comandos
System.out.println("Esse foi o resultado da interação" +i+" "+resultado);
}

}


public static void main(String args[])
{}

}

Basicamente o que eu queria é que "esse foi o resultado da interação " fosse exibido no JtextArea ENQUANTO o metodo esta sendo executado!

Se voCe puder me guiar como usar e onde essa Thread,te agradeço

H

Olá, HumbertoJr

Tente as modificações abaixo. O botão lança uma tread para liberar a GUI
e esta thread, por sua vez, lança uma thread na 'event-dispatching thread' a cada atualização da textarea para evitar deadlock. O texto é rolado para o final a cada atualização.

public class Seila{ 

public Seila(){ 

//aqui vão os componentes graficos sendo postos e um deles é um botão 

    botao.addAbreCupomListener
    (
      new ActionListener()
      {
        public void actionPerformed(ActionEvent ev)
        {
          Thread thread = new Thread()
          {
          	public void run()
          	{
                   metodo();
                }
           }
           thread.start();
        }
      }
   );



//e Jtextarea 
} 

public metodo()
{ 
  int i,resultado;  
  while(/*condição que demora um bocado de tempo*/ )
  { 
    //Varios comandos 

    SwingUtilities.invokeLater(
      new Runnable()
      {
        public void run()
        {
          txtarea.append("Esse foi o resultado ..." );
          txtarea.setCaretPosition(txtarea.getText().length());
        }
      }
    );
  }
}

public static void main(String args[]) 
{} 

}
H
"hipersoft":
Olá, HumbertoJr

Tente as modificações abaixo. O botão lança uma tread para liberar a GUI
e esta thread, por sua vez, lança uma thread na 'event-dispatching thread' a cada atualização da textarea para evitar deadlock. O texto é rolado para o final a cada atualização.

public class Seila{ 

public Seila(){ 

//aqui vão os componentes graficos sendo postos e um deles é um botão 

    botao.addAbreCupomListener
    (
      new ActionListener()
      {
        public void actionPerformed(ActionEvent ev)
        {
          Thread thread = new Thread()
          {
          	public void run()
          	{
                   metodo();
                }
           }
           thread.start();
        }
      }
   );



//e Jtextarea 
} 

public metodo()
{ 
  int i,resultado;  
  while(/*condição que demora um bocado de tempo*/ )
  { 
    //Varios comandos 

    SwingUtilities.invokeLater(
      new Runnable()
      {
        public void run()
        {
          txtarea.append("Esse foi o resultado ..." );
          txtarea.setCaretPosition(txtarea.getText().length());
        }
      }
    );
  }
}

public static void main(String args[]) 
{} 

}

Esta Thread não tem stop() não?Ela fica mesmo assim rodando indefinidamente?

H

O método stop() foi deprecated pela Sun, pois é sujeito a deadlock. No seu lugar, deve ser usado o método interrupt().

A lógica de interrupção de uma thread é a seguinte:

  • a thread a ser interrompida monitora constantetmente se é interrompida usando o método interrupted();
  • a thread principal chama o método interupt() da thread que será interrompida;
  • se o método retornar true, executa return OU lança uma InterruptedException.

Em consequência, no sua cláusula while você deve incluir o teste !interrupted().

Em tempo: onde se lê addCupomListener no código mostrado, substitua por addActionListener.

H

“hipersoft”:
O método stop() foi deprecated pela Sun, pois é sujeito a deadlock. No seu lugar, deve ser usado o método interrupt().

A lógica de interrupção de uma thread é a seguinte:

  • a thread a ser interrompida monitora constantetmente se é interrompida usando o método interrupted();
  • a thread principal chama o método interupt() da thread que será interrompida;
  • se o método retornar true, executa return OU lança uma InterruptedException.

Em consequência, no sua cláusula while você deve incluir o teste !interrupted().

Em tempo: onde se lê addCupomListener no código mostrado, substitua por addActionListener.

:roll: testei aqui sua solução e não funcionou…será que vc poderia me dar um exemplo pratico funcionando disso,por favor…devo ter errado algo

J

Humberto, diga o que foi que deu de erro. “Não funcionou” é muito genérico :roll:

Você tentou aquele exemplo que ele colocou lá exatamente? Ou lembrou de colocar os import, definição de botões, …?

C

Fala irmão.
Aqui no PJ tem um exemplo que implementa JTable dinâmico.
Te ajuda?
Charles

H

“Chale”:
Fala irmão.
Aqui no PJ tem um exemplo que implementa JTable dinâmico.
Te ajuda?
Charles

Desculpa,Jtable é meio diferente…

H
"JavaDrops":
Humberto, diga o que foi que deu de erro. "Não funcionou" é muito genérico :roll:

Você tentou aquele exemplo que ele colocou lá exatamente? Ou lembrou de colocar os import, definição de botões, ...?

Não vou postar o codigo inteiro aqui mas só memso os principais pontos:

Imaginem que eu tenho o seguinte programa:
public class MeuPro extends Jframe()
Nesse MeuPro existirá um JTextArea,e alguns botões........bom quando eu clico
public void actionPerformed(ActionEvent e)
           {
              SolAlg sa=new SolAlg();
               sa.gereSoluçoes();
            }

Bom ,depois que esse objeto é instanciado ,um metodo chamado gereSolucoes() é executado,o escopo do metodo é este:

public void gereSolucoes()
            {
                 //variaveis do metodo

                 while(<condiçao>)
                  {
                        //comandos
                        if(<condicao1>) metodo1();
                          if(<condicao2>)metodo2();
                          if(<condicao3>)metodo3();
                   }
               System.out.println()
          }
}

//Cada um desses metodos tem um subprocessamento e um System.out.println() associado exibindo no console o resultado parcial até aquele instante,tipo:

public metodo1()
{
  //comandos
  System.out.println(resultadoParcial1);
}

Bom basicamente ,o que eu queria é que o que ele esta fazendo pro console fosse direcionado pra JtextArea,[b]mas enquanto o processamento de gereSoluções() está sendo feito[b],ou seja, notem que existem sub-resultados parciais sendo exibidos durante o While,eu não quero é que depois do metodo terminado ele exiba só o resultado final não...........
Nota-se ai porque a dica dele não funcionou,este metodo vai ficar executando e depois ao final exibir o resultado,não é isso.....

:roll: Pessoal será que fui muito confuso?JA to aqui tentando varias coisas e nada mesmo,por favor,HELP!

Criado 22 de julho de 2005
Ultima resposta 30 de jul. de 2005
Respostas 10
Participantes 5