有没有办法将MouseListener添加到Graphic对象?

有没有办法将MouseListener添加到Graphic对象。
我有这个简单的GUI绘制椭圆形。
我想要的是当用户点击椭圆时处理事件

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() = 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 } } 

此工作除了当点击位于椭圆周围的虚拟框内时触发。
当椭圆形上的咔哒声完全点击时,任何人都可以帮我解雇它。
提前致谢。

我能想到的最简单的方法是避免使用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()); } } 

所有代码都应包含在自定义组件类中。 您有自定义代码来绘制椭圆。 现在您需要用于点击检测的自定义代码。 您可以通过重写contains(…)方法来完成此操作。 根据Vincents的建议你会添加如下内容:

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

这样,您不需要在MouseListener中使用任何自定义代码。

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

如果某些内容更改为鼠标操作,则应修改组件的状态(字段),然后调用repaint 。 将在适当的时间调用paint组方法。

你甚至不能把听众放在像椭圆形的几何图形上。 你需要获得鼠标点击坐标,并尝试确定一个或另一种方式,如果点击已经在你的图中。