Dúvida - Adicionar MouseListener a um retangulo desenhado (drawRect)

Bom dia pessoal,

Estou tentando adicionar um MouseListener à uma área retangular desenhada com Graphics2D (drawRect). Meu objetivo é que ao clicar com o direito do mouse no retângulo desenhado, seja aberto um JPopupMenu.

Alguem tem alguma sugestão de como eu possa adicionar o MouseListener à esta área desenhada :?:

Desde já agradeço a atenção de todos :wink:

Não pode. Você pode é adicionar um mouseListener na área onde o retângulo foi desenhado. Então, use o método intersect da classe Rectangle2D para dizer se o ponto clicado interceptou ou não a área desenhada.

Essa é uma das vantagens de se desenhar usando os objetos filhos de Shape, do Java2D, ao invés da função drawRect diretamente.

Obrigado ViniGodoy… :smiley:

A possibilidade de add o mouseListener na área desenhada acredito que me servirá também. Estou fazendo algumas pesquisas e testes (nunca havia mexido com Rectangle2D) e ao dar uma olhada neste site (http://java.comsci.us/examples/awt/geom/Rectangle2D.html), acredito que a melhor solução para mim seria utilizar contains ao invés de intersect, certo? Assim poderia identificar o ponto onde foi clicado se está contido na área do retângulo.

Sim, isso mesmo (falei o nome do método de cabeça, mas era o contains mesmo). Dá uma olhadinha no meu site, lá tem tutoriais sobre Java 2D, onde eu explico como usar essas classes.

Mas basicamente, o uso é bem trivial:

Rectangle2D rect = new Rectangle2D.Float(x, y, w, h); g2d.fill(rect);

Os tutoriais lá dão uma série de outras dicas, como como usar as transformações, por exemplo.

Perfeito Vini!!! :stuck_out_tongue:

Baseado no código daquele site que mensionei acima + suas dicas consegui fazer o que desejava…

Ao clicar em qualquer parte do primeiro retângulo com o direito do mouse o menu de contexto é aberto.

Segue o código à quem possa interessar:

[code]import javax.swing.*;

import java.awt.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.
;

public class Rectangle2D1 extends JApplet implements ActionListener, ItemListener{

private Rectangle2D Shape1;
private Rectangle2D Shape2;
private Rectangle2D Shape3;
private Rectangle2D Shape4;
private boolean Contained;

public Rectangle2D1 () {
Shape1 = new Rectangle2D.Double ();
Shape1.setRect (20., 20., 100., 50.);
Shape2 = new Rectangle2D.Double (140., 20., 100., 50.);
Shape3 = new Rectangle2D.Float ();
Shape3.setRect (260., 20., 100., 50.);
Shape4 = new Rectangle2D.Float (380.F, 20.F, 100.F, 50.F);
createPopupMenu();
}

public void paint (Graphics g) {
Graphics2D g2D;

g2D = (Graphics2D) g;

g2D.draw (Shape1);
Contained = Shape1.contains (30., 30.);
g2D.drawString ("contains = " + Contained, 20, 90);

g2D.fill (Shape2);
Contained = Shape2.contains (160., 10., 30., 40.);
g2D.drawString ("contains = " + Contained, 140, 90);

g2D.draw (Shape3);
Contained = Shape3.intersects (280., 10., 30., 50.);
g2D.drawString ("intersects = " + Contained, 260, 90);

g2D.fill (Shape4);
Contained = Shape4.intersectsLine (400., 10., 490., 70.);
g2D.drawString ("intersectsLine = " + Contained, 380, 90);

g2D.setColor (Color.blue);
g2D.drawLine (10, 10, 10, 10);
g2D.drawLine (30, 30 - 10, 30, 30 + 10);
g2D.drawRect (160, 10, 30, 40);
g2D.drawRect (280, 10, 30, 50);
g2D.drawLine (400, 10, 490, 70);

}

public void createPopupMenu() {
JMenuItem menuItem;

  //Create the popup menu.
  JPopupMenu popup = new JPopupMenu();
  menuItem = new JMenuItem("primeiro item do menu");
  menuItem.addActionListener(this);
  popup.add(menuItem);
  menuItem = new JMenuItem("segundo item do menu");
  menuItem.addActionListener(this);
  popup.add(menuItem);

  //Add listener to the area so the popup menu can come up.
  MouseListener popupListener = new PopupListener(popup);
  this.addMouseListener(popupListener);

}

class PopupListener extends MouseAdapter {
JPopupMenu popup;

  PopupListener(JPopupMenu popupMenu) {
      popup = popupMenu;
  }

  public void mousePressed(MouseEvent e) {
	  if(Contained = Shape1.contains(e.getX(), e.getY()))
	  {
		  maybeShowPopup(e);
	  }
  }

  public void mouseReleased(MouseEvent e) {
	  if(Contained = Shape1.contains(e.getX(), e.getY()))
	  {
		  maybeShowPopup(e);
	  }
  }
  private void maybeShowPopup(MouseEvent e) {
      if (e.isPopupTrigger()) {
          popup.show(e.getComponent(),e.getX(), e.getY());
      }
  }

}

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub

}

}[/code]

Mais uma vez, muito grato! 8)