Даже больше вы не можете поместить слушателя в геометрическую фигуру, как овал. Вам нужно получить координаты щелчка мышью и попытаться определить, каким образом щелчок был внутри вашей фигуры.

ли способ добавить MouseListener к графическому объекту.
У меня есть этот простой графический интерфейс, который рисует овал.
Я хочу обработать событие, когда пользователь нажимает на овал

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)

вы не можете напрямую добавить слушателя мыши в Graphics, потому что он не является Компонентом. Слушатель мыши должен быть добавлен к вашемуComponent (или жеJComponent), который получает подходящий объект Graphics, переданный при вызове Swingpaint(Graphics) и друзья.

Если что-то меняется в зависимости от действий мыши, вы должны изменить состояние (поля) вашего компонента, а затем вызватьrepaint, Методы группы рисования будут вызваны позже в соответствующее время.

Даже больше вы не можете поместить слушателя в геометрическую фигуру, как овал. Вам нужно получить координаты щелчка мышью и попытаться определить, каким образом щелчок был внутри вашей фигуры.

Решение Вопроса

которым я могу придумать, - это избежать 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());
   }
 }
 Rekin08 янв. 2011 г., 15:31
+1: Вау, я никогда не знал, что это можно сделать таким простым способом! Блин, сколько часов я потерял.
 Vincent Ramdhanie08 янв. 2011 г., 15:36
@Rekin Это цель пакета geom. Инкапсулировать все геометрические операции в вашей 2D-графике.
 Abu Muhammad09 янв. 2011 г., 12:24
Это именно то, что я хочу. Спасибо Винсент

ственный код для рисования овала. Теперь вам нужен специальный код для обнаружения кликов. Вы делаете это путем переопределения метода contains (...). Основываясь на предложении Винсента, вы добавите что-то вроде:

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

Таким образом, вам не нужно никакого специального кода в MouseListener.

Ваш ответ на вопрос