Carregando [RESOLVIDO]

Pessoal, eu tenho um framesenha que a pessoa digita usuário e senha, e ele valida no banco de dados…
Eu deixei uma label com um gif, de uma imagem “Carregando.”
Quando a pessoa clica no botão Entrar, ele chama a classe conectabanco que conecta no banco de dados… Mas as vezes demora para fazer a conexão…
Por isso deixei a label carregando, invisível, e quando clica no botão ENTRAR, ela fica visible true.

Botão:
[code] jLabel5.setVisible(true); //A LABEL QUE TEM A IMAGEM DO CARREGANDO

    String us = jTextField1.getText();
    String pas;
    pas = jPasswordField1.getText();

    ConectaBanco k = new ConectaBanco();
    Connection conec = null;

    try {
        conec = k.conecta();
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(FrameSenha.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(FrameSenha.class.getName()).log(Level.SEVERE, null, ex);
    }


VerificaLogin ver = new VerificaLogin();
    try {
        try {
            ver.verilog(conec, us, pas); //AKI!!!
        } catch (IOException ex) {
            Logger.getLogger(FrameSenha.class.getName()).log(Level.SEVERE, null, ex);
        }
        jTextField1.setText("");
        jPasswordField1.setText("");
    } catch (SQLException ex) {
        Logger.getLogger(FrameSenha.class.getName()).log(Level.SEVERE, null, ex);
    }

[/code]
Ali no ver.verilog(conec,us,pas), se a senha estiver errada, aparece mensagem de erro…
Eu comecei a fazer download aqui, para fazer a conexão com o banco de dados demorar + (ele tá na web).
Ae eu cliquei para entrar com uma senha errada… Ficou uns 3 segundos parado, e depois exibiu a mensagem de erro, e só depois que a label ficou com a imagem (CARREGANDO).

Ela tá antes do Verifica Login… Pq ela só aparece depois?
O que posso fazer?
Vlw.

Ps: Já tentei dexar a jlabel5 sem texto e sem imagem, e setar só na hora que clicar no botão com isso:

ImageIcon copo = new javax.swing.ImageIcon(getClass().getResource("/views/resources/carregando.gif")); // Copo abaixado jLabel5.setIcon(copo); jLabel5.setText("Carregando...");
Mas dá na mesma… Só depois da mensagem de erro que ela aparece…

Você tem que entender que as mudanças que você faz nos seus componentes swing não são instantâneas. Você altera um componente e esse componente enfilera um comando de repaint() na thread do Swing. Só quando a thread tive desocupada, é que esse repaint será processado.

Entretanto, se você coloca um código demorado no listener de um botão, esse código roda na própria thread do Swing. Ou seja, se lá você está alterando o estado da label e logo em seguida fazendo o processamento lento, esse processamento irá segurar a thread do swing e, só depois de pronto, o comando de repaint() será processado. E isso explica o comportamento que você está observando.

Para corrigir o problema, é necessário mover o código de processamento para outra thread, e manter apenas a pintura na thread do swing. Dá uma olhada nesse tópico:
http://www.guj.com.br/posts/list/139967.java

Não entendi muito bem o código…
Acho que no meu caso seria mais simples, porque só tem a frase “Carregando”, por isso eu só necessito alterar a visibilidade dela…
O que seria o jLabel5.setVisible(true);

Infelizmente, não é mais simples.

Como eu falei, sua GUI swing não dará repaint até que TODO processamento do botão esteja concluído. POr isso, é necessário mover o processamento pesado para outra thread.

[code]
jLabel5.setVisible(true); //A LABEL QUE TEM A IMAGEM DO CARREGANDO
new Thread(new Runnable() {
public void run() {
String us = jTextField1.getText();
String pas= jPasswordField1.getText();

  ConectaBanco k = new ConectaBanco();
  Connection conec = null;

  try {
     conec = k.conecta();
  } catch (Exception ex) {
     Logger.getLogger(FrameSenha.class.getName()).log(Level.SEVERE, null, ex);
  }

  VerificaLogin ver = new VerificaLogin();
  try {
     try {
        ver.verilog(conec, us, pas); //AKI!!!
     } catch (IOException ex) {
            Logger.getLogger(FrameSenha.class.getName()).log(Level.SEVERE, null, ex);
     }
     GuiSync.serText(jTextField1, "");
     GuiSync.setText(jPasswordField1, "");
     GuiSync.setVisible(jLabel5, false);
  } catch (SQLException ex) {
        Logger.getLogger(FrameSenha.class.getName()).log(Level.SEVERE, null, ex);
  }
}}).start();[/code]

A classe GuiSync está no outro post, que passei o link ali em cima.
Não se esqueça de fechar a conexão e o statement após usa-los.

Entendii…
Vlw