2014-12-09 3 views
1

awt 패키지로 작업하고 있는데, 그것이 내가 필요한 것 같아서, 프레임을 만들고, 그 프레임 안에 들어가는 컴포넌트와 컨테이너를 만들고 있습니다. 그렇게하기 위해서 Component 나 (아직은 아니지만) Container 나 내가 필요로하는 다른 것을 확장하는 클래스를 만들고 있습니다. 내 문제는 MouseListeners 및 ComponentListeners를 사용해야하지만 "둘러싸는 범위 내에서 최종 변수가 아닌 변수에 액세스 할 수 없습니다." 자, A : 최종적이 아닌 고정적 일 필요가있는 것처럼 보입니다. 그러나 나는 그것을 믿을 것입니다. B : 어떻게하면 돼? 기본적으로 "this"에 액세스 할 수 있어야하지만 "this"는 클래스가 아닌 새로운 Listener입니다. 아무도 이것을 고치는 법 및/또는 일을하는 다른 방법을 알고 있습니까? 감사!enclosing scope 내의 변수들, 특히 BlahListeners

+1

문제를 보여주는 최소한의 (그러나 완전한) 코드를 표시하면 도움이 될 것입니다. –

답변

0

어쩌면 이렇게 할 수 있을까요? 내가 제대로 이해 않은 경우 당신은 리스너의 범위에서 얻을 필요)

ContainingClass.this.someMethod(); // Inside your Listener for example 

ContainingClass 및 것으로 someMethod는 가짜 값입니다.

+0

이 구문을 사용하여 메서드를 호출하거나 멤버 변수에 액세스 할 필요가 없습니다 - 직접 할 수 있습니다. (someMethod()를 호출하십시오.) – Arkadiy

0

편집 : 질문을 오해 한 것이므로 이전 대답은 부적절합니다.

익명의 내부 클론에서 비 최종 로컬 변수에 액세스하는 방법에 대해 질문합니다. 자바가 허용하는 것이 아닙니다. 사실, 그것을 구현하는 것은 다소 어려울 것입니다.

변수가 final 인 경우 그 값을 취할 수 있습니다. 그러나 최종적이지 않은 경우 여러 개의 무언가 인스턴스가 공유 할 수있는 메모리를 제공해야합니다. 모든 인스턴스는 수정할 수 있습니다. 이것은 상당히 문제입니다 : 그 기억은 어디에 할당 될까요? 멀티 쓰레딩 환경에서 어떻게 보호 하시겠습니까?

일반적으로 익명 내부 클래스 (정적 멤버 일 필요는 없음)간에 쓰기 가능한 정보를 공유하기 위해 멤버 변수를 사용하는 것이 일반적입니다.

+0

gwt/gxt 나 다른 프레임 워크를 사용할 때 그리 드문 일이 아닙니다. – cgew85

+0

예.하지만 Healthbar.this.blah()와 함께 작동했습니다. 절대적으로 괜찮 았어. –