2011-01-08 90 views
16

是否有任何方法将MouseListener添加到Graphic对象。
我有这个简单的GUI绘制一个椭圆形。
当用户点击椭圆有什么办法可以将MouseListener添加到Graphic对象吗?

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 

} 

} 

这个工程除了它我想是处理事件时触发的点击是围绕椭圆形虚框之内。
任何人都可以帮我把它点燃,当点击确实在椭圆形。
在此先感谢。

回答

19

我能想到的最简单的方法是避免fillOval并在java.awt.geom包中使用几何。所以你可以声明一个椭圆,因为看起来你正在绘制的椭圆是静态大小的。

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

     .... 

} 

然后在paintComponent中使用fill(Shape)方法来绘制它。

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

    } 

然后在鼠标事件,你可以或检测如果点击是在椭圆形不喜欢这样的:

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:哇,我从来不知道它可以用这么简单的方式完成!该死,我输了多少个小时。 – Rekin 2011-01-08 14:31:30

4

所有代码应包含在您的自定义组件类。你有自定义代码来绘制椭圆。现在您需要用于点击检测的自定义代码。你可以通过重写contains(...)方法来实现这一点。基于文森的建议,你会加入类似:

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

这样,你不需要在你的MouseListener任何自定义代码。

0

不,您不能直接将鼠标侦听器添加到Graphics,因为它不是组件。鼠标侦听器应添加到您的Component(或JComponent),该接收器在Swing调用paint(Graphics)和朋友时接收到合适的Graphics对象。

如果鼠标操作发生变化,应该修改组件的状态(字段),然后调用repaint。绘画组方法将在适当的时间稍后调用。

甚至更​​多你不能把听众放在几何图形像椭圆形。您需要获得鼠标点击坐标,并尝试确定单击是否位于图形中的一种或另一种方式。

相关问题