Pegar coordenadas do click do mouse no Jpanel

Ola ,espero que alguem possa me ajudar…

Estou começando a desenvolver um projeto, e preciso pegar o click do mouse no panel e
comparar com um local especifico no mesmo.
Caso a pessoa clique nesse local a imagem do panel será trocada… se não, não…

Obrigado.

Fazer isso é uma péssima técnica!

Você deve adicionar a imagem num painel apenas para a imagem, e adicionar esse painel da imagem em outro painel da sua aplicação.

JPainel são containers, interfaces gráficas em Java se baseam em containers.

Opa, realmente eu nao tenho muita noção ainda…
vou tentar implementar isso aqui…

valeu.

1 curtida
seuPanel.addMouseListener(new MouseAdapter(){
   public void mouseCliked(MouseEvent e){
     int x=e.getX();
     int y=e.getY();
  }
 }
);

Ola flaryon, valeu pela ajuda.
Com isso eu pego as coordenadas do mouse certo…

Mas e o local onde eu quero que ele click? Como vou fazer pra especificar…

Tipo se eu rodar o programa e dar os clicks no panel e mandar exibir o x e y …talvez eu possa assim
achar as coordenadas do panel onde será preciso ser clicado…

Vou tentar aqui valeu, muito obrigado.

então…isso teoricamente é mais fácil de fazer…

basta vc criar um par de variáveis auxiliares que guardem o local que você quer …Imagine o seuPanel como sendo um plano cartesiano, onde o canto superior esquerdo é o ponto de coordenadas (0,0), o canto superior direito (x,0),
o canto inferior esquedo (0,y) e por fim o canto inferior direito (x,y)…de posse disse você pode fazer o seguinte:

logo dentro do código que lhe passei vc pode inseriir o seguinte código:

if(x<=10&&x>=5&&y<=10&&y>=5){
    System.out.println("As coordenadas são: x:"+x+" , y:"+y);
}

esse código define um quadrado de lado 5, se o usuário clicar dentro desse quadrado , exclusivamente neste quadrado, vai imprimir na tela as coordenadas X e Y do click do mouse.

espero que tenha dado pra entender!

Se voce tiver a posição e o tamanho da imagem no JPanel voce pode atraves do mouse saber qual imagem que esta no lugar. Com um pouco de matematica é claro.

[quote=flaryon]então…isso teoricamente é mais fácil de fazer…

basta vc criar um par de variáveis auxiliares que guardem o local que você quer …Imagine o seuPanel como sendo um plano cartesiano, onde o canto superior esquerdo é o ponto de coordenadas (0,0), o canto superior direito (x,0),
o canto inferior esquedo (0,y) e por fim o canto inferior direito (x,y)…de posse disse você pode fazer o seguinte:

logo dentro do código que lhe passei vc pode inseriir o seguinte código:

if(x<=10&&x<=5&&y<=10&&y<=5){
    System.out.println("As coordenadas são: x:"+x+" , y:"+y);
}

esse código define um quadrado de lado 5, se o usuário clicar dentro desse quadrado , exclusivamente neste quadrado, vai imprimir na tela as coordenadas X e Y do click do mouse.

espero que tenha dado pra entender![/quote]

Era isso que eu queria dizer… mas o código tem um pequeno erro.

if( (x<=10 && x>=5) && (y<=10 && y>=5)){
    System.out.println("As coordenadas são: x:"+x+" , y:"+y);
}

de fato!!! já alterei!!!

=)

Então eu entendi o que vcs disseram …

Mas não ta dando certo aqui.


public PEMPanel() {

		setLayout(null);

		add(b1);
		add(b2);

		Insets insets = getInsets();
		Dimension size = b1.getPreferredSize();
		b1.setBounds(860 + insets.left, 560 + insets.top, size.width,
				size.height);
		b2.setBounds(950 + insets.left, 560 + insets.top, size.width,
				size.height);

		b1.addActionListener(this);
		b2.addActionListener(this);

		carregarImagem(contador_imagens); 

		addMouseListener(new MouseAdapter() {

			public void mouseCliked(MouseEvent e) {
				int x = e.getX();
				System.out.println(x);
				int y = e.getY();
				System.out.println(y);
			}
		});

	}

Tipo esse é o Panel… mas diz que o metodo não esta sendo usado e tb não imprime o x e y.
podem verificar pra mim,
Obrigado.

Dexa eu ver se entendi de fato: Vc quer que imprima a coordenada X e Y qd vc clciar em uma área específica do seu Painel…eh isso?

aparentemente estpa tudo correto…qd vc clica no panel o que acontece?

Não é isso… deixa eu explicar melhor.

De fato eu quero trocar a imagem do panel quando clicar em um lugar especifico no panel.

Eu só fiz isso como teste pra mim ter o x e y do local que foi clicado.
Mas acontece que não ta funcionando, não ta imprimindo nada.

Bem é isso…valeu mais uma vez.

qd vc quer alterar uma imagem em um painel vc tem q redesenhá-la…

seuPanel.revalidate();

coloca isso após o me´todo que faz trocar a imagem!!!

Tipo esse é o construtor a classe ja esta estendida para Jpanel.
valeu.

Mostre a classe inteira.

Bom vou mostrar o que eu ja fiz ate agora.

public class PEMPanel extends JPanel implements ActionListener {

	private Image imagem;
	private String[] colecao_imagens = { "inicial", "imagem_um", "imagem_dois" };
	private int contador_imagens = 0;
	private static final String LOCAL_IMAGENS = "Extras/Img/";

	private Clip clip;
	private String[] colecao_sons = { "som_um", "som_dois" };
	private int contador_sons = 0;
	private static final String LOCAL_SONS = "Extras/Sons/";

	JButton b1 = new JButton("avançar");
	JButton b2 = new JButton("menu");
	JButton b3 = new JButton("sair");

	public PEMPanel() {

		setLayout(null);

		add(b1);
		add(b2);

		Insets insets = getInsets();
		Dimension size = b1.getPreferredSize();
		b1.setBounds(860 + insets.left, 560 + insets.top, size.width,
				size.height);
		b2.setBounds(950 + insets.left, 560 + insets.top, size.width,
				size.height);

		b1.addActionListener(this);
		b2.addActionListener(this);

		carregarImagem(contador_imagens);

		addMouseListener(new MouseAdapter() {
			public void mouseCliked(MouseEvent e) {
				int x = e.getX();
				System.out.println(x);
				int y = e.getY();
				System.out.println(y);
			}
		});

	}

	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();

		if (source == b1) {

			if (contador_imagens < 3 && contador_sons < 2) {

				carregarImagem(contador_imagens);
				repaint();

				carregarSom(contador_sons);
				tocaSom();
			}

			else {

				contador_imagens = 0;
				contador_sons = 0;

				carregarImagem(contador_imagens);
				repaint();
			}

		}

		else if (source == b2) {

			contador_imagens = 0;
			contador_sons = 0;

			carregarImagem(contador_imagens);
			repaint();

		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponents(g);
		if (imagem != null)
			g.drawImage(imagem, 0, 0, null);
	}

	public void carregarImagem(int posImagem) {

		try {
			imagem = ImageIO.read(new File(LOCAL_IMAGENS
					+ colecao_imagens[posImagem] + ".gif"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		contador_imagens++;

	}

	public void carregarSom(int posSom) {

		File soundFile = new File(LOCAL_SONS + colecao_sons[posSom] + ".wav");
		AudioInputStream sound = null;

		try {
			sound = AudioSystem.getAudioInputStream(soundFile);
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());
		try {
			clip = (Clip) AudioSystem.getLine(info);
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}

		try {
			clip.open(sound);
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		contador_sons++;

	}

	public void tocaSom() {
		clip.start();
	}

}

Espero que possa me ajudar.
To començando agora e sei que deve ter muita coisa errada no codigo.

E as coordenadas que eu não to conseguindo pegar…visualizar.

Obrigado.

eh, eu sei, percebi depois… =p~~~
vc adicionou a linha q escrevi?

no fim do método paintComponent adiciona

 this.repaint();

não creio que deva solucionar o problema de imprimir as coordenadas…Aparentemente seu código está correto

Então ainda continuo sem as coordenadas.

Devo informar tb que esse mesmo panel esta adicionado ao frame.
Pq ainda naum consegui adiciona- lo em outro panel.
Pq quando tentei não deu certo.

Será que pode ser por isso?

Obrigado.