鼠标包含在对象内

时间:2014-12-30 00:53:28

标签: java mouselistener jcomponent contain

我刚开始学习Java,几天后我一直在搜索点击绘制对象的方法,将鼠标包含在g.drawRect(x,x,x,x)等对象中。 ..

我遇到了下面的代码,我试图让它工作,这样我就可以了解在对象中包含鼠标需要什么,但我似乎无法使其工作。

获得来自"的代码Is there any way to add a MouseListener to a Graphic object?"

我已经尝试按照他们给出的提示让它工作但没有希望:(。

感谢任何帮助。



import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;

import javax.swing.*;

public class Gui3 extends JFrame {
  JFrame frame = new JFrame();
  MyDrawPanel drawpanel = new MyDrawPanel();

  public static void main(String[] args) {
    Gui3 gui = new Gui3();
    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 {

  Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100);

  public void paintComponent(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;

    g2d.fillOval(70, 70, 100, 100);

  }

  @
  Override
  public void mouseClicked(MouseEvent e) {
    if ((e.getButton() == 1) && oval.contains(e.getX(), e.getY())) {
      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) {

  }

  @
  Override
  public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

  }

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




2 个答案:

答案 0 :(得分:0)

您的注释行暗示您的问题 - 您实际上从未向GUI添加MouseListener,因此没有人收到鼠标事件的通知。看来你已经把你的面板作为鼠标监听器(这很好),所以在MyDrawPanel类的构造函数中注册它。将此构造函数添加到MyDrawPanel,您应该很高兴。

public MyDrawPanel(){
    addMouseListener(this);
}

另外,绘制实际的oval变量而不是使用Graphics的drawOval(..)方法可能是一个好主意,因为你在内存中创建了一个形状,并且与一个不相交的图像另一个。请尝试使用此paintComponent(Graphics g)

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

答案 1 :(得分:0)

基本上,您需要将MouseListener注册到DrawPanel,您希望这样做,因为您希望鼠标事件位于DrawPanel的上下文中,否则{ {1}}位置信息不正确。

MouseEvent

您还需要在进行任何自定义绘画之前调用class MyDrawPanel extends JComponent implements MouseListener { Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100); public MyDrawPanel() { addMouseListener(this); }

super.paintComponent

您还应该确保在Event Dispatching Thread的上下文中创建/修改UI。有关详细信息,请参阅Initial Threads

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;

    g2d.fillOval(70, 70, 100, 100);

}