Есть ли способ добавить MouseListener к графическому объекту? - PullRequest
17 голосов
/ 08 января 2011

Есть ли способ добавить 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 ]

20 голосов
/ 08 января 2011

Самый простой способ, которым я могу придумать, - это избежать 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());
   }
 }
4 голосов
/ 08 января 2011

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

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

Таким образом, вам не понадобится никакой специальный код в MouseListener.

0 голосов
/ 18 февраля 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...