Como descobrir qual variavel disparou o evento? [RESOLVIDO]

10 respostas
Y

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

10 Respostas

A

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+

Y

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?

A

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+

Y

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?

A

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+

Y

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

A

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+

Y

valeu mesmo cara, pode deixar q eu vou pesquisar xD

S

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")));
        }
    }

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.

Y

vlw cara, deu uma clareada sim ^^

Criado 23 de dezembro de 2011
Ultima resposta 28 de dez. de 2011
Respostas 10
Participantes 3