2012-10-21 3 views
0

저는 처음으로 자바 스윙 사용자이며 개인 클래스를 사용하려고 시도한 것은 이번이 처음입니다. AddButtonListener는 ActionListener 인터페이스를 구현하는 개인 클래스입니다비공개 클래스를 인스턴스화 할 수 없습니다

ActionListener listener = new AddButtonListener(); 

-

다음 코드를하려합니다.

private class AddButtonListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
    .... 
    } 
} 

그러나, 나는 형 someType의 어떠한 둘러싸는 인스턴스가 액세스 할 수 없습니다

를 읽어 일식 오류를 얻고있다. 할당 유형을 someType 유형 (예 : x.new A(), x는 someType의 인스턴스)으로 묶어야합니다.

클래스가 someType 내부의 정적 기본 메서드에서 인스턴스화되고 있습니다.

왜이 오류가 발생합니까? 주된 방법이 정적이기 때문에 그렇습니까?

+0

왜 AddButtonListener가 비공개입니까? – kosa

+0

하나의 특정 버튼 만 사용해야하기 때문에 다른 사람이 알지 못합니다. – praks5432

+0

이 최상위 클래스 (자신의 파일에있는 클래스)> – kosa

답변

5

AddButtonListener는 내부 클래스이고 정적이 아니므로 외부 클래스의 개체 만 사용하여 인스턴스화 할 수 있습니다. 당신이 SomeType 몇 가지 방법에있는 경우 AddButtonListener 클래스가 다음 SomeType에

SomeType obj = new SomeType(); 

SomeType.AddButtonListener listener = obj.new AddButtonListener(); 

을 정의되어있는 경우

는 예를 들어, 당신은

으로이 비 정적 내부 클래스의 객체를 만들 것
AddButtonListener listener = this.new AddButtonListener(); 

SomeType (인 클로징 유형)의 인스턴스를 사용하지 않고 AddButtonListener의 인스턴스를 만들려면 AddButtonListener를 정적 클래스로 표시해야합니다.

그래서 클래스가 개인용이 아닌 정적 인 것은 아닙니다.

+0

글쎄, 내가 정말로하려는 것은 GUI를 설정하는 클래스를 만드는 것이다. 청취자를 설정합니다.) - 최선의 방법은 무엇입니까? – praks5432

+1

AddButtonListener는 프레임/윈도우를 둘러싸 지 않으면 의미가없는 것처럼 보이기 때문에 비 정적 인 내부 클래스로 남겨두고 'this.new'구문을 사용하여 리스너의 객체를 만들고이를 연관시킵니다 창 컨트롤 (this.new 구문으로 내 업데이 트를 참조하십시오). – Vikdor

2

예외 메시지가 거의 모두 설명됩니다.

개인 클래스는 인스턴스화하기 위해 해당 인 클로징 형식의 인스턴스가 있어야합니다. 개인 클래스는 인 클로징 유형의 인스턴스에있는 멤버에 액세스 할 수 있기 때문에 그러한 인스턴스가 없으면 개인 클래스 인스턴스가 멤버를 액세스 할 수있는 위치는 어디입니까?

질문으로 돌아 가기.

다른 인스턴스를 만들지 않고 인스턴스를 만들고 싶다면. AddButtonListenerprivate static class으로 신고 할 수 있지만 AddButtonListener은 (는) SomeType 클래스 insatnce의 멤버에 액세스 할 수 없게됩니다.

또는 이와 같은 구문을 사용해야합니다.

SomeType t = new SomeType(); 
AddButtonListener listener = t.new AddButtonListener(); 

그러나 세부 코드를 입력하지 않았으므로 어떤 방법으로 올바른지 판단 할 수 없습니다. 내 경험에 의하면, 당신은 그 문제를 둘러싸고있는 클래스에서 개인 클래스를 사용하면 안된다.주요 방법으로 테스트하지 않는 한 ..

2

Vikdor가 맞습니다. 필요한 인터페이스 또는 클래스를 확장하여

여기
... 
ActionListener listener = new ActionListener(){ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub   
    }  

}; 
... 

당신이 방법 내부 onde 클래스를 정의하지만 이러한 경우 당신은 일반적으로 익명 클래스를 사용 (리스너는 한 번만 사용됩니다).

관련 문제