2011-03-02 38 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