Como eu identifico o objeto clicado em um evento MouseListener? [RESOLVIDO]

10 respostas
Matheus_Prado

Ex: Para saber o objeto que foi clicado em um evento ActionListener uso o getSource(),
o que eu uso para identificar um objeto clicado em um evento MouseListener?

obrigado.

10 Respostas

ViniGodoy

Você usa o getSource(). E num KeyTyped? O getSource() também.

Matheus_Prado

vo ti dar em exemplo

se eu faço assim dá certo:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class UsodeIcone extends JFrame {

JLabel Sair;

public UsodeIcone(){

  super ("Uso de Icone como Botao");
  
  Container tela = getContentPane();
  setLayout(null);
  setSize(140, 160);
  setLocationRelativeTo(null);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  Sair = new JLabel();   
  Sair.setIcon(new ImageIcon(getClass().getResource("teste.png"))); 
  Sair.setBounds(30, 30, 64, 64);  
  tela.add(Sair);
  Sair.addMouseListener(new MouseAdapter() {   
  public void mouseClicked(MouseEvent evt) {       
	  System.exit(0);                      
   }}  );
  
}    
    public static void main(String args[]) {
    UsodeIcone UI = new UsodeIcone();
	UI.setVisible(true);
    }
}

mas se eu tento assim nao dá, qual meu erro?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class UsodeIcone extends JFrame implements MouseListener {

JLabel Sair;

public UsodeIcone(){

  super ("Uso de Icone como Botao");
  
  Container tela = getContentPane();
  setLayout(null);
  setSize(140, 160);
  setLocationRelativeTo(null);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  Sair = new JLabel();   
  Sair.setIcon(new ImageIcon(getClass().getResource("teste.png"))); 
  Sair.setBounds(30, 30, 64, 64);  
  tela.add(Sair);  
 
  }

 public void mouseClicked(MouseEvent evt) {   
      if (evt.getSource() == Sair)    
	  System.exit(0);                      
 } 
   
    public static void main(String args[]) {
    UsodeIcone UI = new UsodeIcone();
	UI.setVisible(true);
    }
}

obrigado.

ViniGodoy

No segundo caso você não deu addMouseListener.

Lá no construtor faça:

Matheus_Prado

humm, verdade
tinha esquecido de add o ouvinte. :?

mas mesmo assim continuou dando erro
ai tive que add os outros 4 métodos além do mouseClicked(),
pq isso?

brigadão aee :lol:

ViniGodoy

Pq a interface MouseListener tem 4 métodos. E você é obrigado a implementar todos.

Note que no outro exemplo você estendeu MouseAdapter. Mouse adapter é uma classe assim:

public abstract class MouseAdapter implements MouseListener { void mouseClicked(MouseEvent e) {} void mouseEntered(MouseEvent e) {} void mouseExited(MouseEvent e) {} void mousePressed(MouseEvent e) {} void mouseReleased(MouseEvent e) {} }

Ou seja, ela implementa os métodos todos em branco. Aí, quem estende não é obrigado a fazer isso, como vc fez…

(na verdade, ela é um pouco diferente, pq também implementa mouseWheelListener e mouseMotionListener, mas por isso só terá mais métodos em branco).

ViniGodoy

Só um comentário. A forma que vc fez por primeiro é mais elegante que a que você fez por segundo. Implementar interfaces diretamente em suas classes expõe vários métodos como públicos, e eles não deveriam ser assim.

Por isso, eu geralmente prefiro implementar interfaces como essas usando classes privadas, como vc fez no primeiro caso.

Matheus_Prado

massa
vlw mesmo ae cara

:stuck_out_tongue:

Matheus_Prado

e outra coisa

pra que que serrve o getClass e o getResource ?

ViniGodoy

O getClass() retorna um objeto do tipo Class. Esse objeto descreve uma classe, no caso, a UsodeIcone.
Você poderia perguntar para esse objeto, que métodos essa classe tem, e até invoca-los.

Dentre os métodos do objeto class, encontra-se o método getResource(). Ele retorna quem foi o ResourceManager responsável por carregar essa classe. Quando uma classe Java é criada, o Java cria um gerente de recursos para carregar os arquivos da classe. Esse gerente pode ser diferente caso a classe esteja num .jar ou no sistema de arquivos, por exemplo.

O gerente de recursos é capaz de carregar um arquivo qualquer. Ele se baseia no classpath de sua aplicação, ou seja, a raiz do gerente de recursos será igual a raiz do seu classpath. Portanto, se você pedir um ícone “/projeto/imagens/teste.jpg”, você terá que ter um pacote no seu projeto com o nome projeto.imagens. E é nesse pacote que você terá que ter o arquivo teste.png.

A vantagem de usar o getResource() no lugar do File, é que o File efetivamente representa um arquivo no sistema de arquivos. Assim, se sua aplicação mais tarde for empacotada num .jar, o file continuará enxergando o sistema de arquivos, enquanto o getResource() irá procurar pelos arquivos dentro do .jar.

Matheus_Prado

show de bola ;D

Criado 17 de outubro de 2009
Ultima resposta 18 de out. de 2009
Respostas 10
Participantes 2