Como descobrir qual variavel disparou o evento? [RESOLVIDO]

o problema é o seguinte:
eu to fazendo um programa q tem varias jLabel, e quando o usuario clica nelas, o icone delas muda
o problema é que tem MUITA label, entao eu criei um metodo, eu queria que esse metodo identificasse qual label foi clicada e alterasse o icone dela, só que eu não to sabendo como ver qual das label foi clicada, o unico jeito que eu conseguiria seria fazendo um if pra cada label, mas assim fica meio inviavel, alguem tem alguma ideia?

muito obrigado

cara,

no seu metodo listener vc tem um evento como parametro é vc so pegar o metodo getSource e comparar com todos suas variaveis de Jlabel, pq qdo ele achar a a referencia de variavel que seja igual ao objeto retornado, vc faz sua logica.

t+

o meu codigo ta assim:

esse é o metodo que vai aumentar o ponto e mudar a label:

 public void aumentaPonto (String atributo, int nivel) {
        if (atributo.equalsIgnoreCase("forca") && nivel<5) {
            imgNivelForca.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagens/nvl"+(nivel+1)+".png")));
        }
    }

aki é o evento:

private void imgNivelForcaMouseClicked(java.awt.event.MouseEvent evt) {                                    
        
        if (evt.getButton()==1) {
            aumentaPonto("forca",nivel);
        } else if (evt.getButton() == 3 ) {
            diminuiPonto("forca", nivel);
        }
        
    }

eu queria que quando esse evento fosse chamado, ele mandasse como parametro pro metodoa label que foi clicada, e o metodo ja mudasse o icone da label q ele recebeu como parametro.

se eu for fazer igual vc disse, dava pra continuar fazendo igual eu to fazendo e mandar a String como parametro, mas o problema é que eu teria que fazer aproximadamente 40 testes (um pra cada label que pode ser modificado) e eu tava evitando deixar o codigo tao grande assim, sera q n tem outra opção nao?

cara,

vc pode fazer assim como eu fiz aqui no codigo e vc vai so precisar atribuir esse medoto ao seu Jlabel no metodo addMouseListener

private MouseListener listenerMouse(){
		return new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mousePressed(MouseEvent arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseExited(MouseEvent arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseEntered(MouseEvent arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseClicked(MouseEvent evt) {
				((JLabel)evt.getSource()).setText("FOI CLICADO");				
			}
		};
	}

t+

pelo que eu entendi desse codigo, a unica coisa que voce fez foi mudar o texto da label q foi clicada para “foi clicada” isso tb n adiantaria, pq eu teria q testar label por label pra ver qual está com este texto, o que eu preciso é mandar como parametro do metodo a label q foi clicada, pra q o metodo altere a label entendeu?

entao cara,

eu so fiz um exemplo para vc ver, basta vc criar um parametro no seu metodo que recebe um JLabel e dentro do metodo mouseClicked basta vc passar fazer um cast do object que vem do metodo getSource().

acho que resolve seu problema.

t+

resolveu meu problema sim, muito obrigado xD

só mais uma coisa ^^"
eu coloquei o codigo igual voce fez no exemplo ai, mas n entendi mto bem o que eu fiz, ta funcionando, mas eu gostaria de saber o porque, tem como dar uma explicaçãozinha?

meu codigo ficou assim

o metodo:

public void aumentaPonto (JLabel label, int nivel) {
        if ( nivel<5) {
            label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagens/nvl"+(nivel+1)+".png")));
        }
    }

o evento:

    private void imgNivelForcaMouseClicked(java.awt.event.MouseEvent evt) {                                           
           
        if (evt.getButton()==1) {
            aumentaPonto((JLabel)evt.getSource(),nivel);
        } else if (evt.getButton() == 3 ) {
            diminuiPonto((JLabel)evt.getSource(), nivel);
        }
    }                

minha duvida é nessa parte que eu to enviando o parametro (na linha 4 do evento)
pra que serve esse (Jlabel) ai antes do evt.getSource() ?
qual o nome disso?
pq q qdo eu coloco o (Jlabel) na frente do evt.getSource() funciona direitinho e ele manda exatamente a label que eu quero, e quando eu coloco só o evt.getSource() ele manda outra coisa?
tem algum lugar em que eu possa aprender melhor sobre isso?

foi mal a quantidade de duvidas, mas é que nunca tinha visto isso mesmo, e parece ser algo bem interessante

de qualquer jeito, muito obrigado mesmo, voce me ajudou muito xD

entao cara,

isso chama cast, se vc ver o metodo getSource(), ele tem retorno de Object, entao vc ta falando para o Java que vc que vc quer um obejto especifico, pois ele ta passando um objeto generico, mas vc pode fazer uma pesquisa no google que vc acha bastante coisa sobre o assunto.

t+

valeu mesmo cara, pode deixar q eu vou pesquisar xD

[quote=yurifw]resolveu meu problema sim, muito obrigado xD

só mais uma coisa ^^"
eu coloquei o codigo igual voce fez no exemplo ai, mas n entendi mto bem o que eu fiz, ta funcionando, mas eu gostaria de saber o porque, tem como dar uma explicaçãozinha?

meu codigo ficou assim

o metodo:

public void aumentaPonto (JLabel label, int nivel) {
        if ( nivel<5) {
            label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagens/nvl"+(nivel+1)+".png")));
        }
    }

[/quote]

Fala cara blz?

Bem, isso funciona porque em Java todo objeto (incluindo os componentes também), ganham um espaço na memória e uma referência (instância), sendo assim, na hora que vc usa o cast:

(JLabel) evt.getSource() ... 

Você quer que o java pegue a referência desse objeto (no caso a label clicada) e transforme-a em JLabel para depois no método seu atributo setIcon() seja modificado, pegou?

Basicamente você disse pro java:

Pega a origem de quem foi clicado;
Muda o atributo (setIcon()) icone dele para… ;

Espero ter clareado um pouco mais as idéias.

vlw cara, deu uma clareada sim ^^