Java Swing中的鼠标指针问题

4
我创建了一个简单的Java Swing程序,每次用户点击鼠标时它会在窗口中输出一个3*3的正方形。即使用户点击多次,这些正方形也会保留在窗口中。该程序编译和运行都很好,但是当用户在窗口中点击时,正方形绘制的位置远离鼠标指针。我已经思考了很长时间,到底需要怎么改变程序才能让正方形在每次点击时都与指针精确对应呢?非常感谢任何帮助!
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JComponent;
import javax.swing.JFrame;


public class ClickCloud extends JComponent {

    final ArrayList<Point2D> points = new ArrayList<Point2D>();

    public void addPoint(Point2D a) {
        points.add(a);
    }

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        for (int i = 0; i < points.size(); i++) {
            Point2D aPoint = points.get(i);
            g2.draw(new Rectangle2D.Double(aPoint.getX(), aPoint.getY(), 3, 3));
        }
    }

    public static void main(String[] args) {
        final ClickCloud cloud = new ClickCloud();
        JFrame aFrame = new JFrame();

        class ClickListen implements MouseListener {

            @Override
            public void mouseClicked(MouseEvent arg0) {
            }

            @Override
            public void mouseEntered(MouseEvent arg0) {
            }

            @Override
            public void mouseExited(MouseEvent arg0) {
            }

            public void mousePressed(MouseEvent arg0) {

                cloud.addPoint(arg0.getPoint());
                cloud.repaint();

            }

            @Override
            public void mouseReleased(MouseEvent arg0) {

            }
        }

        aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        aFrame.setSize(500, 500);
        aFrame.add(cloud);
        aFrame.addMouseListener(new ClickListen());
        aFrame.setVisible(true);
    }
}
1个回答

4
您正在向JFrame添加MouseListener,但在JComponent中显示结果并相对于JComponent显示。因此,单击的Point位置将相对于JFrame的坐标系,但然后相对于JComponent的坐标系显示,这将使事情向下移动标题栏的距离。相反,只需将MouseListener添加到负责显示结果的同一组件即可,以便显示和单击坐标匹配:
  aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  aFrame.setSize(500, 500);
  aFrame.add(cloud);
  //!! aFrame.addMouseListener(new ClickListen());  // !! Removed
  cloud.addMouseListener(new ClickListen());  // !! added
  aFrame.setVisible(true);

顺便说一下:感谢您创建并发布了一个不错的SSCCE,这使得分析和解决您的问题变得更加容易。


1
不用谢,其实是我在问问题!哈哈,你真的帮了我很大的忙,非常感谢你!这是一个快速而优秀的解决方案。 - astroDude1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接