2011-03-02 98 views
4

我创建了以下简单的Java Swing程序,每次用户单击鼠标时都会在窗口中输出3 * 3的方块。即使用户多次点击,广场仍保留在窗口中。该程序编译并运行得很好,但是,当在窗口中单击时,正方形画出的位置远低于鼠标指针的位置。一段时间以来,我一直在绞尽脑汁地思考这个问题 - 我可以在这里改变什么来让广场与每次点击时的指针完全一致?非常感谢您的帮助!Java Swing中的鼠标指针问题

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

回答

4

你添加的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因为这使得它这么多更容易分析和解决您的问题。

+1

不要感谢我,我是问问题的人!大声笑你是一个很大的帮助,非常感谢!快速而优秀的解决方案。 – astroDude1 2011-03-02 05:59:49

+2

@ astroDude1请将答案标记为已接受。谢谢 – tanyehzheng 2011-03-02 06:13:34