2010-11-21 7 views
0

약간의 스윙 응용 프로그램을 작성 중이며 도움이 필요합니다. MouseListener에 대한 인라인 클래스가 있고 부모 클래스에서 메서드를 호출하려는 메서드 중 하나의 내부에 this은 MouseListener의 인스턴스입니다.Java 인라인 클래스 부모 클래스의 메서드 호출

class ParentClass 
{ 
    void ParentMethod() 
    { 
     //... 
     swing_obj.addMouseListener(
      new MouseListener() 
      { 
       public void mouseClicked(MouseEvent e) 
       { 
        //Want to call this.methodX("str"), but 
        //this is the instance of MouseListener 
       } 
       public void mouseEntered(MouseEvent e){ } 
       public void mouseExited(MouseEvent e){ } 
       public void mousePressed(MouseEvent e){ } 
       public void mouseReleased(MouseEvent e){ } 
      } 
     ); 
     //... 
    } 
    void methodX(String x) 
    { 
     //... 
    } 
} 

도움을 주시면 감사하겠습니다.

+1

참고 : 올바른 용어는 "익명 내부 클래스"입니다. –

답변

3

this이 익명 유형의 인스턴스이지만 여전히 methodX("str")을 호출 할 수 있습니다. 접두사로 접두사로 this을 붙여야합니다. 당신이 명시하려면

, 나는 당신이 그것을 할 수 있습니다 몇 가지 구문 있다고 생각 - 당신은

ParentClass.this.methodX("str"); 

을 쓸 수 있지만, 개인적으로 난 당신이 정말로하지 않는 한 명시되는 귀찮게하지 않을는 (예를 들어 MouseListener에있는 방법으로 호출을 모호하게 만들 수 있습니다.

1

전화에서 this을 제거하기 만하면되지만 아무 것도 할 필요가 없습니다.

this을 계속 사용하려면 ParentClass 접두어가 있어야합니다. 예 : ParentClass.this.methodX(...) ...하지만 그건 그냥 못 생겨서 필요할 때 (이름 충돌 등) 사용해야합니다.

+1

왜 추한 것 같니? – khachik

+1

@khachik : 개인 취향? 나는 다른 클래스의 메소드 호출 전에'this'를 사용하지 않습니다. – dacwe

+0

나도 마찬가지다. 그래서 이것이 컨테이너 클래스를 참조하는'methodX'가 때때로 나를 혼란스럽게 만든다. 그냥 개인적인 취향, 네 말이 맞아. – khachik

0

다른 언급했듯이 this. 만 제거하면 외부 클래스에서 메서드를 호출 할 수 있습니다. 드물게 외부 클래스와 중첩 클래스에 동일한 이름과 매개 변수 목록을 가진 methodS가있는 경우이를 OuterClass.this.someMehtod(...);이라고합니다.

익명 내부 클래스를 작성할 때 더 깨끗한 코드를 사용하려면 어댑터를 사용하는 것이 좋습니다. Swings 인터페이스의 많은 것들을 위해, 그것들을 구현하는 추상적 인 어댑터가 있으며 당신은 단지 관심있는 메소드만을 오버라이드 할 뿐이다. 이 경우 MouseAdapter :

관련 문제