2014-12-05 10 views
0

g를 사용하여 원을 그려서 paintComponent (Graphics g) 메서드를 재정의하는 JComponent에서 상속하는 새 클래스를 만드는 경우 MouseListener가 트리거되도록하려면 무엇을 수정해야합니까? 구성 요소의 경계 내부를 클릭하면 어떻게됩니까?자바 : 사용자 정의 JComponent에 MouseListener 추가

구성 요소의 생성자에서 setBounds (...)를 추가 한 다음 MouseListener를 추가했기 때문에 사용자 정의 구성 요소가있는 컨테이너 안의 아무 곳이나 클릭 할 때마다 발생합니다. .

내 구성 요소 내에서 이벤트가 발생했는지 여부를 mouseClicked() 메소드에서 확인하고 싶지는 않습니다. 클릭이 내부에있을 때만 호출되기를 원합니다. 그것은 단지 당신의 JComponent에의 범위 내에서 작동으로 마우스 리스너가 제대로 작동

public class Node extends JComponent { 
    private int x, y, radius; 

    public Node(int xx, int yy, int r) { 
     x = xx; 
     y = yy; 
     radius = r; 
     this.setBounds(new Rectangle(x - r, y - r, 2 * r, 2 * r)); 
     setPreferredSize(new Dimension(2 * r, 2 * r)); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D gr = (Graphics2D) g; 
     gr.setColor(Color.BLACK); 
     gr.drawOval(x - radius, y - radius, 2 * radius, 2 * radius); 
    } 

    public static void main(String[] args) { 
     final JFrame f = new JFrame(); 
     f.setSize(new Dimension(500, 500)); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JPanel p = new JPanel(); 
     p.setLayout(new BorderLayout()); 
     Node n = new Node(100, 100, 25); 
     n.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       super.mouseClicked(e); 
       System.out.println("clicked"); 
      } 
     }); 
     p.add(n); 
     f.add(p); 
     f.setVisible(true); 
    } 
} 
+0

코드를주세요. 그리고'paintMethod (Graphics g)'가 없으므로'paintComponent (Graphics g)'를 오버라이드 (override)한다는 의미가되기를 바랍니다. –

+0

실수로 사과드립니다. 수정하여 코드를 추가했습니다. – user

답변

1

:

여기 내 코드입니다.

public Node(int xx, int yy, int r) { 
    //. .... 
    setBorder(BorderFactory.createTitledBorder("Node")); 
} 

당신이 구성 요소는 기본에 BorderLayout를-사용하여 컨테이너에 추가되는 걸 이해 (BorderLayout.CENTER) 위치 : 자신에게 그것을 증명하는 것은, 실제로 커버 무엇인지 확인하기 위해 구성 요소 주위에 테두리를 넣어 , 따라서 컨테이너를 채 웁니다. 구성 요소의 경계를 설정하거나 (일반적으로 피해야하는) 원하는 크기를 설정하는 것은 중요하지 않습니다.

내 돈을 위해 노드를 논리적 클래스, 즉 JComponent를 확장하는 클래스가 아닌 Shape 인터페이스를 구현하는 논리 클래스로 만든 다음 노드의 모양을 알 필요가있을 때마다 Shape의 contains(Point p) 메서드를 사용할 수 있습니다. 이 (가) 클릭되었습니다.

+0

나는 그 문제를 보았다. 그리고 getPreferredSize() 메서드를 오버라이드하고 FlowLayout을 사용하면 모든 것이 작동합니다. 구성 요소의 크기를 동적으로 수정하려면 올바른 레이아웃은 무엇입니까? 고맙습니다. – user