[Resolvido] Evento MouseEntered dentro de um Loop

3 respostas
R

Amigos, venho mais uma vez pedir ajuda de vocês!

Tenho o seguinte cenário:
Do lado direito existe uma lista de JLabel exibindo nome de alunos - lbl_nomeAluno[3]
Do lado esquerdo existe uma lista de JCheckBox (um para cada aluno respectivamente) - jCheckBox_aluno[3]

Criei um evento que, ao passar com o mouse em cima do JCheckBox, o respectivo JLabel iria mudar para a cor vermelha, porém isso não está ocorrendo.

public void definirEventos2(){
            for (cont = 0; cont < 3; cont++){
                jCheckBox_aluno[teste].addMouseListener( new java.awt.event.MouseAdapter (){
                    public void mouseEntered (MouseEvent e){
                        lbl_nomeAluno[cont].setForeground(Color.red);
                    }
                });            
            }
        }

Ao executar o código, todos os JCheckBox, quando passo o mouse em cima, muda apenas a cor do último JLabel de aluno.

Alguém sabe como resolver isso?

Eu sei que poderia fazer manualmente um por um, mas o objetivo é mais para frente o numero de alunos aumentar.

3 Respostas

MarkKnopfler

O que está acontecendo é que a variável "cont" é a *mesma* para todas as instâncias do tratador de eventos. Isso é um detalhe que quem vai criar classes anônimas tem que ter em mente. Ao fim do loop, cont sai com o índice do último checkbox.

Ao invés de criar uma classe anônima, crie uma classe privada interna do seu JFrame:

class MeuJFrame extends JFrame {  // ou JPanel, JApplet, que seja

   // Classe tratadora de evento (privada da sua classe de interface)
   private class EventoCheck extends MouseAdapter {

      private int indice;

      public EventoCheck(int indice) {
         this.indice = indice;
      }

      public void mouseEntered(MouseEvent e) { 
         lbl_nomeAluno[indice].setForeground(Color.red);  // Aqui eu pego o índice armazenado
      }
   }

   // Atribuindo os eventos
   public void definirEventos2(){  
      for (cont = 0; cont < 3; cont++){  
        jCheckBox_aluno[cont].addMouseListener( new EventoCheck(cont) );   // Instancia um objeto da classe privada
      }  
   }  

}
R

MarkKnopfler, muito obrigado mesmo! Salvou minha madrugada xD
Realmente, depois que vc mencionou faz sentido ter ocorrido esse problema, mas com a sua solução o programa rodou direitinho.

Thanks

MarkKnopfler

you’re welcome.

Criado 11 de novembro de 2012
Ultima resposta 11 de nov. de 2012
Respostas 3
Participantes 2