Como ficar atualizando um JtextArea dinamicamente?

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?

Utilize uma Thread para realizar o append()

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

[quote=“SeuDimas”]Utilize uma Thread para realizar o append()

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

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

[code]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[])
{}

}[/code]

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

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.

[code]
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[])
{}

}[/code]

[quote=“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.

[code]
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[])
{}

}[/code][/quote]

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

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.

[quote=“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.[/quote] :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

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, …?

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

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

Desculpa,Jtable é meio diferente…

[quote=“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, …?[/quote]

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:

[code] 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);
}

[/code]

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!