2011-03-02 3 views
4

나는 사용자가 마우스를 클릭 할 때마다 창에 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); 
    } 
} 

답변

4

당신은 JFrame의에의 MouseListener를 추가하지만, JComponent의에 결과를 표시하고 JComponent의를 기준으로하고 있습니다. 따라서 클릭 된 점의 위치는 JFrame의 좌표를 기준으로하지만 JComponent의 좌표를 기준으로 표시되며 제목 표시 줄의 거리만큼 항목을 이동시킵니다. 그런데

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를 게시 주셔서 감사를 대신 단순히 디스플레이와 클릭이 일치하는 좌표 있도록 결과를 표시 할 책임이 같은 구성 요소에의 MouseListener를 추가 문제를 쉽게 분석하고 해결할 수 있습니다.

+1

고맙지 만, 나는 그 질문을하는 사람입니다! LOL 당신은 큰 도움이되었습니다, 대단히 감사합니다! 빠르고 우수한 솔루션. – astroDude1

+2

@ astroDude1 대답을 수락 한 것으로 표시하십시오. 감사 – tanyehzheng