2014-04-15 3 views
1

나는 아주 어리 석다. 그러나이 간단한 코드가 타원의 색을 변경하지 않는 이유는 무엇입니까?그래픽 객체의 MouseListener

기본적으로 그래픽 객체 인 타원형에 마우스 수신기를 추가하려고합니다. 마우스 커서가 타원형 인 경우 타원은 색상을 변경합니다. 그러나이 코드는 전혀 변경되지 않습니다 ...이 코드는 테스트 용입니다.

public class Help extends JFrame{ 

    public static void main(String [] agrs){ 
     Help h = new Help(); 
     h.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     h.add(new Help_Option()); 
     h.setSize(2000, 1000); 
     h.setVisible(true); 
    } 
} 

class Help_Option extends JComponent implements MouseListener{ 
    Ellipse2D ellipse = new Ellipse2D.Double(0, 0, 1000, 500); 
    Color c = Color.BLACK;  

    public Help_Option(){ 
     this.addMouseListener(this); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 

     g2d.setColor(Color.BLUE); 
     g2d.draw(ellipse); 

     g2d.setColor(c); 
     g2d.fill(ellipse);   
    } 

    public void setColor(Color c){ 
     this.c = c; 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mousePressed(MouseEvent e) {} 

    @Override 
    public void mouseReleased(MouseEvent e) {} 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     if (ellipse.contains(e.getX(), e.getY())) { 
      setColor(Color.GREEN); 
      repaint(); 
     } 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 
} 
+0

어떤 오류가 발생합니까? –

+0

오류가 없습니다! 하지만 색깔이 바뀌지는 않습니다 ... –

+0

"전혀 작동하지 않습니다"라는 말은 무엇입니까? 컴파일러가 오류 (어떤?)를 주었습니까? 프로그램이 예외를 부여합니까 (?), 아니면 단순히 아무것도하지 않는 것입니까? –

답변

5

당신은 MouseListener를 추가하고 mouseEntered 이벤트를 기다리고 있습니다. 마우스가 Component이 아닌 해당 영역에 들어가면 시작됩니다. 타원이 표시된 곳에서 구성 요소의 경계를 입력하고 관찰하십시오.

마우스로 픽셀 단위로 관찰 할 수 있도록 MouseMotionListener이 필요합니다. mouseMoved 또는 mouseDragged 이벤트를 사용하십시오.

당신은 여전히 ​​MouseMotionEvent의는 구성 요소의 경계 내부 동안 해고로 여전히 타원 내부 동안 구성 요소를 종료 마우스를 놓칠 수 있으므로, mouseEntered 또는 mouseExited 이벤트를 수신해야 할 수도 있습니다.

디버깅을위한 좋은 방법은 이벤트 처리기 내에 인쇄물을 추가하는 것입니다. 그런 다음 핸들러가 호출 된 것을 볼 수 있지만 구성 요소 내에서 마우스를 움직일 때가 아니라 한 번 또는 몇 번만 호출됩니다. 내가 타원의 경계를 사용 ..if


class Help_Option extends JComponent implements MouseListener, MouseMotionListener { 
    Ellipse2D ellipse = ...; 

    public Help_Option() { 
     this.addMouseListener(this); 
     this.addMouseMotionListener(this); 
    } 

    public void mouseMoved(MouseEvent e) { 
     if (ellipse.contains(e.getX(), e.getY())) { 
      //mouse is inside the ellipse 
     } else { 
      //mouse is outside the ellipse 
     } 
    } 

    public void mouseExited(MouseEvent e) { 
     //mouse is outside the ellipse 
    } 

    //more method stubs 
} 
+0

하지만 타원 경계를 사용하면 직사각형이되므로 마우스를 직사각형이 아닌 타원을 입력 할 때마다 색이 바뀝니다 ... 실제로 원하는 것은 아닙니다 ... –

+0

글쎄, 그것은 마우스 모션 리스너와 함께 작동합니다. 하지만 꽤 궁금 해서요, 당신은 이것 좀 봐 http://stackoverflow.com/questions/4634107/is-there-any-way-to-add-a-mouselistener-to-a-graphic-object 나는 같은 일이지만 .... –

+1

그들은 클릭을 기다리고 있으므로 똑같은 것은 아닙니다.타원을 입력하거나 나가는 마우스를 감지 할 필요는 없지만 특정 지점에 있는지 여부는 알 수 있습니다. 탐지가 어떻게 작동하는지 명확히하는 몇 가지 코드를 추가했습니다. –

5

, 그렇게 할 때마다 내 마우스 사각형-만 아니라 -에 - 타원, 색상

변경됩니다를 입력, 직사각형 것

참조 :

  • Shape.contains(x,y) : 지정한 좌표가 Shape의 경계 내에있는 경우 테스트 , 내면의 정의에 의해 기술 된 바와 같이.
  • Shape.contains(Point2D) : 내재성의 정의에 설명 된대로 이 Shape의 경계 안에 있는지 테스트합니다.

도형 사이의 충돌을 보여주는 데모는 this answer을 참조하십시오.