Java Swing中的鼠标指针问题

Posted

技术标签:

【中文标题】Java Swing中的鼠标指针问题【英文标题】:Mouse Pointer Problem in Java Swing 【发布时间】:2011-07-07 00:50:34 【问题描述】:

我创建了以下简单的 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】:

您将 MouseListener 添加到 JFrame,但在 JComponent 中显示结果并与 JComponent 相关。因此,单击的点的位置将相对于 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,因为这样可以更轻松地分析和解决您的问题。

【讨论】:

不用谢我,我是问这个问题的人!大声笑你帮了大忙,非常感谢!一个快速而出色的解决方案。

以上是关于Java Swing中的鼠标指针问题的主要内容,如果未能解决你的问题,请参考以下文章

Swing:鼠标悬停时显示/隐藏按钮

我可以在颤动桌面中移动鼠标指针吗

Cinnamon解决鼠标主题部分指针缺失的问题

Delphi 如何判断鼠标指针是不是在窗口中

如何使用 Internet Explorer 的 javascript 获取鼠标指针位置?

java swing中怎么自由设置鼠标的样式(小手,十字,等待.....)