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

时间:2011-01-08 13:37:19

标签: java swing mouselistener

有没有办法将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() <= 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

 }

}

此作品除非点击位于椭圆周围的虚拟框内时触发 当椭圆形上的咔嗒声完全点击时,有人可以帮我解雇吗 提前谢谢。

3 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

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

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

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