mouseentered eventos event ejemplos java swing mouselistener

java - eventos - ¿Hay alguna manera de agregar un MouseListener a un objeto gráfico?



mouseentered event java (3)

La forma más sencilla que se me ocurre para hacer esto es evitar fillOval y usar la geometría en el paquete java.awt.geom. Por lo tanto, puede declarar una Elipse ya que parece que el óvalo que está dibujando tiene un tamaño estático.

class MyDrawPanel extends JComponent implements MouseListener { Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100); .... }

Luego, en el componente de pintura, use el método de relleno (Forma) para dibujar esto.

public void paintComponent(Graphics g) { .... Graphics2D g2d = (Graphics2D) g; .... g2d.fill(oval); }

Luego, en el evento del mouse, puede detectar si el clic está en el óvalo o no de esta manera:

public void mouseClicked(MouseEvent e) { if ((e.getButton() == 1) && oval.contains(e.getX(), e.getY()) ) { repaint(); // JOptionPane.showMessageDialog(null,e.getX()+ "/n" + e.getY()); } }

¿Hay alguna manera de agregar un MouseListener a un objeto gráfico?
Tengo esta interfaz gráfica de usuario simple que dibuja un óvalo.
Lo que quiero es manejar el evento cuando el usuario hace clic en el óvalo

import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.*; public class Gui2 extends JFrame { JFrame frame = new JFrame(); MyDrawPanel drawpanel = new MyDrawPanel(); public static void main(String[] args) { Gui2 gui = new Gui2(); gui.go(); } public void go() { frame.getContentPane().add(drawpanel); // frame.addMouseListener(this); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); } } class MyDrawPanel extends JComponent implements MouseListener { public void paintComponent(Graphics g) { int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); Color startrandomColor = new Color(red, green, blue); red = (int) (Math.random() * 255); green = (int) (Math.random() * 255); blue = (int) (Math.random() * 255); Color endrandomColor = new Color(red, green, blue); Graphics2D g2d = (Graphics2D) g; this.addMouseListener(this); GradientPaint gradient = new GradientPaint(70, 70, startrandomColor, 150, 150, endrandomColor); g2d.setPaint(gradient); g2d.fillOval(70, 70, 100, 100); } @Override public void mouseClicked(MouseEvent e) { if ((e.getButton() == 1) && (e.getX() >= 70 && e.getX() <= 170 && e.getY() >= 70 && e .getY() <= 170)) { this.repaint(); // JOptionPane.showMessageDialog(null,e.getX()+ "/n" + e.getY()); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } }

Esto funciona Excepto que se dispara cuando el clic está dentro de un cuadro virtual alrededor del óvalo.
¿Podría alguien ayudarme a que se dispare cuando el clic está EXACTAMENTE en el óvalo?
Gracias por adelantado.


No, no puede agregar la escucha del mouse a Gráficos directamente porque no es un componente. El detector de ratón debe agregarse a su Component (o JComponent ) que recibe el objeto de Gráficos adecuado que se pasa cuando Swing invoca a paint(Graphics) y amigos.

Si algo cambia al responder a las acciones del mouse, debe modificar el estado (campos) de su componente y luego invocar el repaint . Los métodos del grupo de pintura se invocarán más tarde en el momento adecuado.

Aún más, no puedes poner un oyente en la figura geométrica como un óvalo. Necesita obtener las coordenadas del clic del mouse e intentar determinar de una u otra forma si el clic ha estado dentro de su figura.


Todo el código debe estar contenido en su clase de componente personalizado. Tienes el código personalizado para pintar el óvalo. Ahora necesita un código personalizado para la detección de clics. Para ello, anula el método de los contenidos (...). De acuerdo con la sugerencia de Vincents, usted agregaría algo como:

public boolean contains(int x, int y) { return oval.contains(x, y); }

De esta manera no necesita ningún código personalizado en su MouseListener.