Problemas com Swing Worker

2 respostas
J

Estou com um problema ao tentar utilizar o swing worker, na verdade não sei se ele a melhor saida para o que preciso:

Tenho uma tela que faz conexão com uma NF-e, e nessa tela coloquei eu tenho uma espera de ate 3 minutos(Sim o tempo é grande mas tenho clientes com 256mb de ram ai ja viu né) para executar todo o processo de comunição com a sefaz, etc.
Estou tentando colocar um contador de 180 segundos correndo em paralelo, para mostrar ao usuario que o processo esta em execução.

Ate então tenho o seguinte:

if (e.getActionCommand().equals("Gerar NF-e")) {
            worker.start();
            EnviaNFE();
            ativo=false;
    }

    Object doWork() {
        for (int x = 0; x <= 180; x++) {
            m.Sleep(1000);
            updateContador(x);
            if (ativo==false) {
                dispose();
            }
        }
        return "";
    }

    void updateContador(final int i) {
        Runnable atualiza = new Runnable() {

            public void run() {
                jtfTempoCorrente.setText(i + " segundos.");
            }
        };
        SwingUtilities.invokeLater(atualiza);
    }

Gostaria que enquanto o metodo de envio da NF-e fosse executado o contador fosse incrementando para que o usuário não ache que a tela travou.

Obrigado.

2 Respostas

lucasportela

Já pensou em utilizar

// icone de mouse de espera

private Cursor espera = new Cursor(Cursor.WAIT_CURSOR);

// icone de mouse padrão

private Cursor padrao = new Cursor(Cursor.DEFAULT_CURSOR);
setCursor(espera);

seuMetodo():

setCursor(padrao);
javer

Por que você não usa um GlassPane sobre sua "tela" e nele coloca uma espécie de mensagem ou uma barra intermitente, algo assim, quando terminar todo o processo você libera a tela removendo o GlassPane.

Exemplo (você tem que procurar na web como usar GlassPane):
Thread worker = new Thread()            {

            @Override
            public void run() {
                glassPane.setVisible(true, "Processando envio de NF-e para a SEFAZ...");
                // Aqui vem todo processo demorado 

                SwingUtilities.invokeLater(new Runnable()                         {

                    @Override
                    public void run() {
                        glassPane.setVisible(false); // Terminou o processo demorado remover o glassPane
                    }
                });
            }
        };
        worker.start();
Criado 27 de janeiro de 2011
Ultima resposta 28 de jan. de 2011
Respostas 2
Participantes 3