2011-01-08 12 views
16

¿Hay alguna forma de agregar un MouseListener a un objeto Gráfico?
Tengo esta sencilla GUI que dibuja un óvalo.
Lo que quiero es controlar el evento cuando el usuario hace clic en el óvalo¿Hay alguna manera de agregar un MouseListener a un objeto Gráfico?

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 activa cuando el clic está dentro de una caja virtual alrededor del óvalo.
podría alguien me ayude a tener que disparar cuando el clic es exactamente en el óvalo.
Gracias de antemano.

Respuesta

19

La forma más simple que puedo pensar para hacer esto es para evitar fillOval y el uso de la geometría en el paquete java.awt.geom. Entonces 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 paint, utiliza el método de relleno (Shape) para dibujar esto.

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

    } 

Luego, en el evento de ratón puede detectar si el clic 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()); 
    } 
} 
+0

1: Vaya, no sabía que se podía hacer de una manera tan simple! Maldición, cuántas horas perdí. – Rekin

+0

@Rekin Ese es el propósito del paquete geom. Para encapsular todas las operaciones geométricas en sus gráficos 2D. –

+0

Esto es exactamente lo que quiero. Gracias Vincent –

4

Todo el código debe estar contenida 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, anule el método contains (...). Sobre la base de la sugerencia Vincent deberá añadir algo como:

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

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

0

No, no se puede agregar detector de ratón a gráficos directamente, ya que no es un componente. Ratón oyente debe ser añadido a su Component (o JComponent) que recibe los gráficos adecuados objeto pasado cuando se invoca oscilación paint(Graphics) y amigos.

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

Aún más no se puede poner un oyente en el la figura geométrica como ovalada. Debe obtener las coordenadas de clic del mouse y tratar de determinar de una u otra manera si el clic ha estado dentro de su figura.

Cuestiones relacionadas