SwingWorker Como funciona?

5 respostas
wilsontads

A classe abaixo espera carregar todas as entidades
na instância de List, entities, para só então atualizar a GUI.

private class LoadEntities extends SwingWorker<List><EntityClass>, Void> {

    @Override
    protected List<EntityClass> doInBackground() {
        return domainManager.findAll();
    }

    @Override
    public void done() {
// Código auxiliar e bloco try...catch omitidos para melhor clareza.
        entities.addAll(get());
        fireContentsChanged(this, 0, entities.size() - 1);
    }
}

até ai tudo bem.. só que eu gostaria de saber como faço pra seguinte situação..
na minha view, eu tenho um progressbar, que vai carregando conforme vai sendo executada
uma determinada instrução.
Eu tenho uma classe chamada Processo e um método chamado executaProcesso(), esse método
é do tipo void, e dentro dele, eu vou setando o values do meu progressbar, não somente.. eu também
desabilito os botões da tela. só que os exemplos que eu vi por ai
só tem como retorno.. como eu faria nesse caso?

5 Respostas

fabiocsilva

Eu tive um problema parecido com o seu, tinha uma progressbar que aparecia enquanto uma imagem era processada em background. Utilizei o SwingWorker para dispará-lo e escondê-lo. Porém tem a questão de como medir o progresso. Como eu não tinha algo concreto como uma “taxa de download”, por exemplo, deixei o progressbar sem valor e pra mim foi adequado. A barra ficava cheia que nem o navegador faz quando você efetua um download e ele não consegue identificar o tamanho do arquivo…

luiz_renato

wilsontads,

Acho meio difícil acompanhar o andamento exato da carga das entidades porque depende do findAll mas vão umas idéias:

Vc pdoeria tentar usar o método publish do SwingWorker http://download.oracle.com/javase/tutorial/uiswing/concurrency/interim.html dentro do doInBackground (antes e depois do findAll ) mas ficaria naquela situação da barra iniciar ,ficar parada e preencher tudo depois da pesquisa.

Ou usar uma thread separada pra ficar “preenchendo” e “esvaziando” rapidamente a barra até finalizar o processamento.

wilsontads

Eu fiz da seguinte forma..

public class Execucao extends SwingWorker<Object, String> { 
    
    @Override
    protected Object doInBackground(){
        try {
            executaTransferencia();
        } catch (Exception ex) {
            Logger.getLogger(Execucao.class.getName()).log(Level.SEVERE, null, ex);
        }
       return null; 
    }
    
    @Override
    public void done(){
        
    }
}
Não sei o que pode acontecer se eu fizer isso rs, dentro do método executaTransferencia, eu tenho acesso ao progressbar, e vou enchendo o progress de acordo com a quantia transferida dentro do método..
wilsontads

Não sei se funciona… na minha máquina encheu em tempo de exec. vou testar no cliente que o
processo é bem mais demorado devido ao tamanho da carga pra ver o que acontece…

wilsontads

kkk, não deu…
o que aconteceu foi o seguinte…
minha view, marcou como concluido, e por trás, o meu sistema ficou executando… e após concluido, mandou uma
mensagem pra view, avisando de que tinha concluido…
pelo menos nao congelou a tela como antes… rs

Criado 15 de junho de 2011
Ultima resposta 15 de jun. de 2011
Respostas 5
Participantes 3