2

我是学习Java的新手,几天来我一直在寻找一种方法来单击绘制的对象,以将鼠标包含在诸如g.drawRect(x,x,x,x)之类的对象中......

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

从“有什么方法可以将 MouseListener 添加到 Graphic 对象吗?

我试图根据他们给出的提示让它工作,但没有希望:(。

任何帮助表示赞赏。

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);
  }
}

4

2 回答 2

0

您的注释行暗示了您的问题-您实际上从未将 MouseListener 添加到 GUI,因此没有人收到鼠标事件的通知。看来您已将面板设置为鼠标侦听器(这很好),因此在MyDrawPanel该类的构造函数中注册它。将此构造函数添加到您的 MyDrawPanel,您应该一切顺利。

public MyDrawPanel(){
    addMouseListener(this);
}

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

public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.fill(oval);
}
于 2014-12-30T01:30:42.263 回答
0

基本上,您需要向 注册MouseListenerDrawPanel您想要这样做,因为您希望鼠标事件在 的上下文中,DrawPanel否则MouseEvent位置信息将不正确。

class MyDrawPanel extends JComponent implements MouseListener {

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

    public MyDrawPanel() {
        addMouseListener(this);
    }

super.paintComponent在进行任何自定义绘画之前,您还需要致电

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

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

}

您还应该确保从事件调度线程的上下文中创建/修改您的 UI。有关更多详细信息,请参阅初始线程

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            Gui3 gui = new Gui3();
            gui.go();
        }
    });
}
于 2014-12-30T01:38:08.300 回答