Atualizar Interface da Tela

Pessoal,

Estou com um problema em uma tela que criei (JFrame) onde preciso ficar constantemente atualizar a interface.

Acontece que enquanto os codigos do meu software vão sendo executados, ele vai preenchendo um JTextArea com uma espécie de Log, só que eu preciso que esses logs apareçam em tempo real, enquanto o codigo é executado, mas isso não acontece, o JTextArea só aparece preenchido depois que o codigo é executado, e as vezes ele é meio longo.

para resolver essa constante atualização da tela, tentei usar o metodo repaint do Frame, mas não funcionou, então descobri outro metodo que é o update(Graphics g), onde ele faz exatamento isso que eu quero:

seria assim:


//JTextArea = txtLog;

txtLog.append("Comando: "+Comando+"\n");//Informações que adiciono no log
txtLog.append("Resposta: "+Resposta+"\n");

txtLog.append("\n");
this.update(getGraphics());

eu preciso usar o “this” para fazer o Frame inteiro atualizar, caso não faça isso ele atualiza somente o JTextArea, e os outros componentes da minha tela desaparecem e a tela fica cinza rsrs

Só que o problema é que ao modo que a tela vai atualizando acontecem coisas “bizarras” na tela, as vezes os componentes meio que mudam de lugar, o menu da tela some, ou seja ele desorganiza completamente a tela, sendo que as vezes isso ocorre e as vezes não.
Sem contar que as vezes quando rodo o programa em outros computadores a tela fica piscando a cada update() executado.

Alguem saberia o que está acontecendo?

Valeu

Obs: Interface feita inteiramente no netbeans

Não chame o update dessa forma. Sair testando qualquer método não é uma boa forma de programar.
O que você precisa fazer é deslocar seu processamento do seu software para outra thread. Só isso.

Não é à toa que o método append do JTextArea é ThreadSafe. Para mais informações:
http://download.oracle.com/javase/tutorial/uiswing/components/progress.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html

oloco chamou eu de noob na programação hein
kkkkk to brincando :smiley:

vlw pela resposta

eu pensei mesmo em usar threads para resolver esse problema, mas acontece que eu já estou usando uma thread e tenho medo de colocar tudo em Threads e acabar embaralhando os processos, pois eles usam uma mesma variavel e se ela obter o valor errado vai estragar o processo.

se eu passar todos os processos pra threads poderia acontecer esse tipo de problema?

uso a thread assim:

private void Functions(){     
     new Thread(){//instancia nova thread já implementando o método run()
      @Override
      public void run() {//sobrescreve o método run()
        //FUnções e comandos de append do JTextArea

      }//- Fim do Run
     }.start();//Fim Thread

    }

pode ver que não declaro a Thread, só crio ela dentro do processo, e assim funciona pro que eu quero, que nesse caso é não congelar a tela

Outra coisa que gostaria de saber sobre Threads, considerando que eu tenho um Timer (q acho que usa Thread também), um método funcionando como Thread (igual o acima) e mais as rotinas do software, acontece de eles rodarem literalmente paralelamente ou isso funciona como uma lista, em que um vai rodando após o outro, e não intercalados?

Isso aí cria uma nova thread a cada vez que você executar o método…

E com threads, tudo roda ao mesmo tempo. Não funciona como lista não.
Só cuidado se as threads acessarem as mesmas variáveis ao mesmo tempo. Isso sim, pode dar zica.

aew :smiley:

funcionou certinho, fico bem melhor do que com os updates rsrs, só a tela que as vezes ainda dá uma desconfigurada, mas acho que isso é do java mesmo, inclusive acho que deve ser problema do swing que vira e mexe dá problema.

procurando por ai eu achei um cara que resolveu esse tipo de problema, e resolveu o meu também, ele usou o método repaint() assim:

SwingUtilities.invokeLater(new Runnable() {//está funcionando
         public void run() {
          repaint(); //repaint pro Frame
         }
});

com esse metodo a tela não estraga mais, as vezes por um milésimo de segundo ele embaralha, mas acho que por conta desse metodo ela volta ao normal, da fonte que peguei disseram que quando se usa muitos repaints seguidos, esse metodo consertas os bugs.
Não sei se é melhor escolha, mas foi a que melhor me atendeu rsrs

vlw ai, muito Obrigado =D

1 curtida