Não mostra JPROGRESSBAR e JLABEL durante o processamento

6 respostas
A

Pessoal,

Tenho uma lógica para importar as palavras existentes em um texto que for digitado ou colado em um JSCROLLPANE.

A medida que as palavras forem lidas, quero atualizar uma JPROGRESSBAR e também mostrar em um JLABEL o andamento do processo (palavras lidas e importadas).

Quando eu abro a tela (método PreparaImportacao), deixo a JPROGRESSBAR e JLABEL como não-visíveis. Quando é clicado em um botão que está na Toolbar eu estou fazendo estes componentes ficarem visíveis, mas os mesmos não são exibidos, só aparecem depois que o processamento é concluído.

Alguém sabe o que pode ser?

6 Respostas

M

O problema é que a Thread encarregada de redesenhar a tela está ocupada demais tratando o texto para mostrar uma barra de progresso. A solução é fazer o processamento do texto em uma Thread separada (implementar Runnable ou usar ou SwingWorker). Se pesquisar sobre isso, vai ajudar (inclusive, na seção de artigos deve ter algo).

A

Nunca implementei o Runnable, pesquisei na Net mas não tive sucesso na implementação.

Tens como dar umas dicas de como eu poderia implementar isso, fazendo com que o texto seja atualizado a medida que o processamento das palavras vai ocorrendo?

M

Antes de mais nada, separe melhor as coisas no seu código. Ele está confuso. Delegue toda a tarefa do processamento do texto para um único método e depois poste esse método aqui.

A

Vamos lá então…

Como eu disse anteriormente, nunca trabalhei com Thread e Runnable, então fique a vontade para efetuar eventuais críticas ao código que montei.

No evento actionListener do meu botão "Processar" eu deixei da seguinte forma:

/**
           * Efetua a importação das palavras
           **/

          updateProgress andamento = new updateProgress(pbBar, iIndice, lbProcesso, iPalavrasLidas, iPalavrasImportadas, epTexto.getText().length());
          Thread myThread = new Thread(andamento);
          myThread.start();

          try {

             Integer iUltima = 0;

             for (int i = 0; i < epTexto.getText().length(); i++) {

                 iIndice = i;

                 if ( ( epTexto.getText().substring(i, (i + 1)).equals(" ") |
                       epTexto.getText().substring(i, (i + 1)).equals(".") |
                       epTexto.getText().substring(i, (i + 1)).equals(",") |
                       epTexto.getText().substring(i, (i + 1)).equals(";") |
                       epTexto.getText().substring(i, (i + 1)).equals(":") |
                       epTexto.getText().substring(i, (i + 1)).equals("\r") |
                       epTexto.getText().substring(i, (i + 1)).equals("\n") ) & i > 0 ) {

                   String stPalavra = epTexto.getText().substring(iUltima, i);

                   if (! stPalavra.equals(" ") ) {
                      iPalavrasLidas++;
                      this.processaPalavra(stPalavra);
                   }

                   iUltima = i + 1;

                }

                pbBar.setValue(i);

             }

             String stPalavra = null;

             if ( ! epTexto.getText().substring( (epTexto.getText().length() - 1), epTexto.getText().length() ).equals(".") |
                  ! epTexto.getText().substring( (epTexto.getText().length() - 1), epTexto.getText().length() ).equals(",") |
                  ! epTexto.getText().substring( (epTexto.getText().length() - 1), epTexto.getText().length() ).equals(";") |
                  ! epTexto.getText().substring( (epTexto.getText().length() - 1), epTexto.getText().length() ).equals(":") |
                  ! epTexto.getText().substring( (epTexto.getText().length() - 1), epTexto.getText().length() ).equals("\r") |
                  ! epTexto.getText().substring( (epTexto.getText().length() - 1), epTexto.getText().length() ).equals("\n") ) {
                if ( iUltima < epTexto.getText().length() ) {
                   stPalavra = epTexto.getText().substring(iUltima, epTexto.getText().length());
                   if (! stPalavra.equals(" ") ) {
                      iPalavrasLidas++;
                      this.processaPalavra(stPalavra);
                   }
                }
             }

             pbBar.setValue(epTexto.getText().length());

             pbBar.setString("Importação finalizada.");

             utilInstance.exibeMensagem("Atenção!","Importação efetuada com sucesso.",utilInstance.MSGINFO);

             retProcesso = true;

          } catch (Exception e) {
            String stackMensagem = utilInstance.montaMensagemErro(e.toString(),e.getStackTrace());
            utilInstance.exibeMensagem("Erro","Erro ao efetuar a importação.",stackMensagem,utilInstance.MSGERROR);
          }

          dTela.dispose();

Criei a classe updateProgress conforme abaixo, para "tentar" a atualização da JProgressBar e do JLabel:

class updateProgress implements Runnable {

    private JProgressBar lpbBar;
    private int liIndice = 0;
    private JLabel llbProcesso;
    private int liPalavrasLidas = 0;
    private int liPalavrasImportadas = 0;
    private int liTamanhoTexto = 0;

    /**
     * Cria nova instância da classe updateProgress.
     */
    public updateProgress(JProgressBar ppbBar, Integer piIndice, JLabel plbProcesso, Integer piPalavrasLidas, Integer piPalavrasImportadas, Integer piTamanhoTexto) {
       lpbBar = ppbBar;
       liIndice = piIndice;
       llbProcesso = plbProcesso;
       liPalavrasLidas = piPalavrasLidas;
       liPalavrasImportadas = piPalavrasImportadas;
       liTamanhoTexto = piTamanhoTexto;

       lpbBar.setStringPainted(true);
       lpbBar.setFont(new java.awt.Font("MS Sans Serif",0,9));
       lpbBar.setForeground(new java.awt.Color(0, 0, 0));
       lpbBar.setBackground(new java.awt.Color(0, 0, 255));

       lpbBar.setValue(0);
       lpbBar.setMaximum(liTamanhoTexto);
       lpbBar.setString("Importando...");

       liPalavrasLidas = 0;
       liPalavrasImportadas = 0;

       llbProcesso.setText("Palavras Lidas: " + liPalavrasLidas + "  Palavras Importadas: " + liPalavrasImportadas);
       llbProcesso.setVisible(true);

       lpbBar.setVisible(true);

    }

    @Override
    public void run() {
       llbProcesso.setText("Palavras Lidas: " + liPalavrasLidas + "  Palavras Importadas: " + liPalavrasImportadas);
       lpbBar.setValue(liIndice);
    }

}

Não deu erro, mas continua só atualizando a JProgressBar e o JLabel ao exibir a mensagem “Importação efetuada com sucesso.”.

Eu não sei como fazer para que a nova Thread “enxergue” os valores atualizados da JProgressBar e JLabel, sendo que o processamento principal está sendo executado em outra Thread…

M

Você delegou a tarefa de atualizar a interface para a outra Thread, mas o processamento continua na mesmo Thread.

Praticamente tudo o que está no seu método actionPerformed deve rodar na Thread separada.

A

Tentei fazer do jeito que você falou…

Agora logo ao iniciar o processamento está mostrando a JProgressBar e o JLabel, porém está ocorrendo este erro:

org.jvnet.substance.api.UiThreadingViolationException: Component state change must be done on Event Dispatch Thread

at org.jvnet.substance.utils.SubstanceCoreUtilities.testComponentStateChangeThreadingViolation(SubstanceCoreUtilities.java:2385)

at org.jvnet.substance.SubstanceProgressBarUI$1.stateChanged(SubstanceProgressBarUI.java:156)

at javax.swing.DefaultBoundedRangeModel.fireStateChanged(DefaultBoundedRangeModel.java:348)

at javax.swing.DefaultBoundedRangeModel.setRangeProperties(DefaultBoundedRangeModel.java:285)

at javax.swing.DefaultBoundedRangeModel.setValue(DefaultBoundedRangeModel.java:151)

at javax.swing.JProgressBar.setValue(JProgressBar.java:831)

at WordFind.updateProgress.run(Importar.java:392)

at java.lang.Thread.run(Thread.java:619)

O meu código ficou assim:

No actionPerformed:

updateProgress andamento = new updateProgress(pbBar,
                                                        lbProcesso,
                                                        new Integer(txLetrasDe.getText()),
                                                        new Integer(txLetrasDe.getText()),
                                                        epTexto.getText(),
                                                        dTela);
          Thread myThread = new Thread(andamento);
          myThread.start();

A minha classe updateProgress está assim:

class updateProgress implements Runnable {

    private Utilidades utilInstance = Utilidades.getInstance();

    private int iPalavrasLidas = 0;
    private int iPalavrasImportadas = 0;

    private JProgressBar lpbBar;
    private JLabel llbProcesso;
    private int lLetrasDe;
    private int lLetrasAte;
    private String lTexto;
    private JDialog lTela;

    /**
     * Cria nova instância da classe updateProgress.
     */
    public updateProgress(JProgressBar ppbBar, 
                          JLabel plbProcesso,
                          Integer pLetrasDe,
                          Integer pLetrasAte,
                          String pTexto,
                          JDialog pTela) {
       lpbBar = ppbBar;
       llbProcesso = plbProcesso;
       lLetrasDe = pLetrasDe;
       lLetrasAte = pLetrasAte;
       lTexto = pTexto;
       lTela = pTela;

       lpbBar.setStringPainted(true);
       lpbBar.setFont(new java.awt.Font("MS Sans Serif",0,9));
       lpbBar.setForeground(new java.awt.Color(0, 0, 0));
       lpbBar.setBackground(new java.awt.Color(0, 0, 255));

       lpbBar.setValue(0);
       lpbBar.setMaximum(lTexto.length());
       lpbBar.setString("Importando...");

       iPalavrasLidas = 0;
       iPalavrasImportadas = 0;

       llbProcesso.setText("Palavras Lidas: " + iPalavrasLidas + "  Palavras Importadas: " + iPalavrasImportadas);
       llbProcesso.setVisible(true);

       lpbBar.setVisible(true);

    }

    @Override
    public void run() {

       try {

          Integer iUltima = 0;

          for (int i = 0; i < lTexto.length(); i++) {

             if ( ( lTexto.substring(i, (i + 1)).equals(" ") |
                    lTexto.substring(i, (i + 1)).equals(".") |
                    lTexto.substring(i, (i + 1)).equals(",") |
                    lTexto.substring(i, (i + 1)).equals(";") |
                    lTexto.substring(i, (i + 1)).equals(":") |
                    lTexto.substring(i, (i + 1)).equals("\r") |
                    lTexto.substring(i, (i + 1)).equals("\n") ) & i > 0 ) {

                   String stPalavra = lTexto.substring(iUltima, i);

                   if (! stPalavra.equals(" ") ) {
                      iPalavrasLidas++;
                      this.processaPalavra(stPalavra);
                   }

                   iUltima = i + 1;

             }

             lpbBar.setValue(i);

          }

          String stPalavra = null;

          if ( ! lTexto.substring( (lTexto.length() - 1), lTexto.length() ).equals(".") |
               ! lTexto.substring( (lTexto.length() - 1), lTexto.length() ).equals(",") |
               ! lTexto.substring( (lTexto.length() - 1), lTexto.length() ).equals(";") |
               ! lTexto.substring( (lTexto.length() - 1), lTexto.length() ).equals(":") |
               ! lTexto.substring( (lTexto.length() - 1), lTexto.length() ).equals("\r") |
               ! lTexto.substring( (lTexto.length() - 1), lTexto.length() ).equals("\n") ) {
             if ( iUltima < lTexto.length() ) {
                stPalavra = lTexto.substring(iUltima, lTexto.length());
                if (! stPalavra.equals(" ") ) {
                   iPalavrasLidas++;
                   this.processaPalavra(stPalavra);
                }
             }
          }

          lpbBar.setValue(lTexto.length());

          lpbBar.setString("Importação finalizada.");

          utilInstance.exibeMensagem("Atenção!","Importação efetuada com sucesso.",utilInstance.MSGINFO);

       } catch (Exception e) {
         String stackMensagem = utilInstance.montaMensagemErro(e.toString(),e.getStackTrace());
         utilInstance.exibeMensagem("Erro","Erro ao efetuar a importação.",stackMensagem,utilInstance.MSGERROR);
       }

       lTela.dispose();

    }


    private void processaPalavra(String stPalavra) {

       if ( stPalavra.length() >= lLetrasAte & stPalavra.length() <= lLetrasAte ) {

       boolean isOk = true;

          for (int testChar = 0; testChar < stPalavra.length() ; testChar++ ) {
             if ( stPalavra.substring(testChar, (testChar + 1)).equals("0") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("1") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("2") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("3") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("4") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("5") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("6") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("7") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("8") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("9") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("!") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("@") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("#") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("$") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("%") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("¨") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("&") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("*") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("(") |
                  stPalavra.substring(testChar, (testChar + 1)).equals(")") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("-") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("_") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("+") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("=") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("[") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("{") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("\"") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("´") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("`") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("^") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("~") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("]") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("]") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("º") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("<") |
                  stPalavra.substring(testChar, (testChar + 1)).equals(",") |
                  stPalavra.substring(testChar, (testChar + 1)).equals(">") |
                  stPalavra.substring(testChar, (testChar + 1)).equals(".") |
                  stPalavra.substring(testChar, (testChar + 1)).equals(":") |
                  stPalavra.substring(testChar, (testChar + 1)).equals(";") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("/") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("|") |
                  stPalavra.substring(testChar, (testChar + 1)).equals("\\") ) {
                 isOk = false;
                 break;
             }
          }

          if ( isOk ) {

             stPalavra = stPalavra.toUpperCase();

             Palavra pesqPalavra = new Palavra();
             pesqPalavra.settxPalavra(stPalavra);

             DAOPalavra regPalavra = new DAOPalavra();

             if (! regPalavra.localiza(pesqPalavra)) {
                pesqPalavra.settxPalavra(stPalavra);
                pesqPalavra.setidPalavra(utilInstance.getprxPalavra());
                pesqPalavra.settxAssunto1(null);
                pesqPalavra.settxAssunto2(null);
                pesqPalavra.settxAssunto3(null);
                regPalavra.inclui(pesqPalavra);
                iPalavrasImportadas++;
             }

          }

       }

       llbProcesso.setText("Palavras Lidas: " + iPalavrasLidas + "  Palavras Importadas: " + iPalavrasImportadas);

    }

}

O erro está ocorrendo na linha 78, na segunda vez que passa pelo FOR. Quando a variável "i" está com o valor "0" (zero) não dá erro, mas na segunda vez (quando está com o valor "1" um) dá o erro.

Criado 6 de janeiro de 2010
Ultima resposta 8 de jan. de 2010
Respostas 6
Participantes 2