TimerTask retornando String?

5 respostas
Bruno_M_Gasparotto

Olá amigos,

Meu velho amigo timer precisa fazer algo por mim.

Meu timer (que calcula e escreve um valor segundo a segundo) preciso ao invez de escrever/setar esse valor em algum lugar, retornar esse valor, para eu poder jogar seu método dentro do meu TableModel e ele ja se atualizar.

Resumindo, preciso que o método abaixo retorne uma string:

public void calculaTempo(final JTable table, final int linha) {  
        String tempoCalculado = "";
        TimerTask tarefa = new TimerTask() {  
  
            @Override  
            public void run() {
                horarioAtual = Calendar.getInstance();
                
                if (horarioAtual.getTimeInMillis() < horarioLimite.getTimeInMillis()) {
                    long milisegundoRestante = horarioLimite.getTimeInMillis() - horarioAtual.getTimeInMillis();
                    long minutoRestante = (long)milisegundoRestante/60000;
                    table.setValueAt(getTempo(minutoRestante), linha, 5);
                    System.out.println("ok");
                } 
                if (horarioAtual.getTimeInMillis() > horarioLimite.getTimeInMillis()) {
                    long milisegundoExcedido = horarioAtual.getTimeInMillis() - horarioInicial.getTimeInMillis();
                    long minutoExcedido = (long)milisegundoExcedido/60000;
                    table.setValueAt("Excedido - " + getTempo(minutoExcedido), linha, 5);
                    
                        for (int c = 0; c < table.getColumnCount(); c++) {   
                            table.setDefaultRenderer(table.getColumnClass(c), renderer);   
                        }                
                                       
                }
            }  
        };  
        cronometro.scheduleAtFixedRate(tarefa, 0, 1000);  
        this.cronometro = null;
    }

num futuro próximo vou rescrever a classe utilizando joda-time, mas no momento preciso de verdade que isso funcione com o método acima.

Obrigado, abraços.

5 Respostas

InicianteJavaHenriqu

Retornar a String não é o problema maior. Basta mudar o retorno do método e formatar com DateFormat.

:thumbup:

Bruno_M_Gasparotto

então, tentei fazer isso e não deu muito certo.

vi que tenho o método run, onde a tarefa é executada, dentro do método calculaTempo, eu teria que setar os dois para String? daí o run retorna a String para o calculaTempo que, por sua vez, retorna para o sistema?

Obrigado!

E

Você quer usar um java.util.concurrent.Callable? Um Callable retorna algo que não é uma String. Entretanto, você tem de tomar um pouco de cuidado ao usar Callables.

InicianteJavaHenriqu

Bruno M Gasparotto:
então, tentei fazer isso e não deu muito certo.

vi que tenho o método run, onde a tarefa é executada, dentro do método calculaTempo, eu teria que setar os dois para String? daí o run retorna a String para o calculaTempo que, por sua vez, retorna para o sistema?

Obrigado!

O método run não aceita retorno do tipo String, mas você pode atribuir o valor a uma variável e depois retorna-la através do método calculaTempo.

:thumbup:

Bruno_M_Gasparotto
entanglement:
Você quer usar um java.util.concurrent.Callable? Um Callable retorna algo que não é uma String. Entretanto, você tem de tomar um pouco de cuidado ao usar Callables.
Não estou usando esse classe.
InicianteJavaHenrique:
Bruno M Gasparotto:
então, tentei fazer isso e não deu muito certo.

vi que tenho o método run, onde a tarefa é executada, dentro do método calculaTempo, eu teria que setar os dois para String? daí o run retorna a String para o calculaTempo que, por sua vez, retorna para o sistema?

Obrigado!

O método run não aceita retorno do tipo String, mas você pode atribuir o valor a uma variável e depois retorna-la através do método calculaTempo.

:thumbup:


Cara, agradeço de verdade a ajuda mas ainda não consegui.

Se eu coloco o return aqui:

public String calculaTempo(final JTable table, final int linha) {  
        String tempoCalculado = "";
        TimerTask tarefa = new TimerTask() {  
  
            @Override  
            public void run() {
                horarioAtual = Calendar.getInstance();
                
                if (horarioAtual.getTimeInMillis() < horarioLimite.getTimeInMillis()) {
                    long milisegundoRestante = horarioLimite.getTimeInMillis() - horarioAtual.getTimeInMillis();
                    long minutoRestante = (long)milisegundoRestante/60000;
                    tempoCalculado = getTempo(minutoRestante);
                } 
                if (horarioAtual.getTimeInMillis() > horarioLimite.getTimeInMillis()) {
                    long milisegundoExcedido = horarioAtual.getTimeInMillis() - horarioInicial.getTimeInMillis();
                    long minutoExcedido = (long)milisegundoExcedido/60000;
                    tempoCalculado = ("Excedido - " + getTempo(minutoExcedido));
                    
                        for (int c = 0; c < table.getColumnCount(); c++) {   
                            table.setDefaultRenderer(table.getColumnClass(c), renderer);   
                        }                
                                       
                }
            }  
        };  
        return tempoCalculado;
        cronometro.scheduleAtFixedRate(tarefa, 0, 1000);  
        this.cronometro = null;
    }

ele diz que a variável tempoCalculado pertence a uma classe interna e deve ser declarada final, mas se eu fizer isso, não consigo alterar seu valor.

Em uma outra tentativa criei um método set pra ela e tentei retornar, mas parece que a tarefa não é executada.

É uma pena que estou sem o código fonte inteiro agora para terminar de testar, mas, como você deixaria meu código para que ele funcione?

Abraços e obrigado mais uma vez.

Criado 7 de maio de 2012
Ultima resposta 7 de mai. de 2012
Respostas 5
Participantes 3