Problemas com contador (em segundos) usando java.util.Timer

1 resposta
C

Prezados,

Estou trabalhando em um GUI que terá um JTextArea onde serão exibidas algumas linhas de log. São 3 linhas no máximo a cada vez que um determinado método for executado.
Acontece que, eu gostaria (para ficar melhor visualmente) de apagar essas linhas a cada 5 segundos depois que elas forem exibidas e gostaria que fosse utilizando um efeito de fade out.

Pesquisando no Google e colocandomeus próprios pensamentos lógicos, eu pensei em criar um vetor R, G e B cada um com os tons de cinza da tabela de cores RGB e fazer com que a cor do conteúdo dentro da JTextArea (objeto onde as linhas de log serão exibidas) fossem gradualmente apagando.

Então, o contador deveria inciar após 5 segundos que as linhas de log fossem inseridas e então a cada 1 segundo, os valores do .Foreground da JTextArea fossem se alterando conforme os valores dos vetores.
Cirei dois contadores (ti e ti2) o primeiro com execução após 5 segudos e o segundo a cada 1 segundo). Para isso, cirei um metodo “ContadorApagarLog” que irá iniciar o primeiro contador (ti) e este irá então chamar o segundo (ti2).

O segundo contador (ti2) ele sim irá a cada segundo chamar uma classe “FadeOutDisplayLog” que de fato irá apagar, em fade out, o conteúdo desta JTextArea.

Irei colocar aqui o código que estou usando para fazer isso, o processo em si, está funcionando, porém estou tendo problemas pois cada vez que o log é inserido o tmepo diminui, ao ponto do conteúdo do log ser apagado instantaneamente.

class FadeOutDisplayLog extends TimerTask{
        
        public void run(){
            if (apagador <= 8){
                int[] r = {51,76,102,127,153,178,204,229,255};
                int[] g = {51,76,102,127,153,178,204,229,255};
                int[] b = {51,76,102,127,153,178,204,229,255};
                JTextArea.setForeground(new Color(r[apagador],g[apagador],b[apagador]));
                apagador++;
            } if (apagador >= 9){
                JTextArea.setText("");
                ti2.cancel();
            }   
        }
    }
    
    class ApagarLog extends TimerTask {
        
        public void run(){
            apagador = 0;
            ti2 = new Timer();
            //ti.scheduleAtFixedRate(new ApagaLog(), 5000, 1*500);
            ti2.schedule(new Tela.FadeOutDisplayLog(), 0, 500);
            ti.cancel();
        }
    }
    
    private void ContadorApagarLog(){
        
        ti = new Timer();
        //ti.scheduleAtFixedRate(new ApagaLog(), 5000, 1*500);
        ti.schedule(new ApagarLog(), 5000);
    }

Os testes que estou realizando são da seguinte forma, coloquei um Keylistener e a cada vez que preciono uma tecla ele deve fazer um append no JTextArea escrevendo a palavra “Teste” e também chama o metodo “ContadorApagarLog()” e então todo o processo de apagar o conteúdo dessa JTextArea deve começar. Apagando depois de 5 segundos do texto ser inserido e graduando a cada 1 segundo depois disso ate chegar a cor branca.

Mais uma vez irei citar aqui o problema: Todo o processo está funcionando, os dados estão graduando sim, porem, se eu inserir um valor neste JTextArea e todo o processo começar, após repetições deste processo o tempo em que o log deve começar a apagar os dados (5 segundos) e o tempo de fade out (1 segundo para cada tom de cinza) dimunui e muito, chegando a pontos que se eu inserir o texte “Teste” sequencialmente após ter apagado o anterior, por mais ou menos 3 vezes, os valores estão se apagando instantaneamente, ou seja, o tempo está dominuindo.

Espero ter sido claro nas explicações e agradeço já a ajuda de todos.
Sem mais,

1 Resposta

C

Galera, consegui resolver … meio que na programação a moda “puxadinho”, mas o problema foi resolvido.

O que eu fiz, delcarei os meus objetos do tipo timer (ti e ti2) dentro da minha classe e as iniciei.
Nos metos que iniciavam o processo de pagar a JTextArea, eu coloquei um “ti.cancel” e “ti2.cancel” para cancelar qualquer schedule ou contagem que pudesse estar rodando e então iniciei uma nova contagem.
Dessa forma, se ocorrerem inumeras escritas no log, ele sempre irá zerar a contagem e passar a contar os segundos após a ultima escrita.

Abs a todos

Criado 1 de novembro de 2008
Ultima resposta 2 de nov. de 2008
Respostas 1
Participantes 1