2012-09-21 2 views
0

스윙 GUI와 외부 클래스가 있습니다. 스윙 GUI의 생성자에서 외부 클래스의 새 개체를 인스턴스화합니다. 하지만 GUI 클래스의 다른 메소드 (예 : 액션 리스너)에서이 객체를 사용할 수 없습니다. 액션 리스너에서 직접 객체를 인스턴스화하면 외부 클래스의 모든 메소드를 사용할 수 있습니다.스윙 GUI가 생성자에서 인스턴스화 된 외부 클래스를 알지 못합니다.

다음은 코드의 관련 스 니펫입니다. 당신이 필요로하는 더 내 외부 클래스)

1 :-) 말해 경우

public class ExternalClass 
{ 
    private int a = 100; 
    public int getA() { 
     return a; 
    } 
} 
는) 내 GUI 수준의

공용 클래스 GUI의 일부는 {

javax.swing.JFrame 2를 확장

// constructor 
public GUI() 
{ 
    initComponents(); 
    ExternalClass e = new ExternalClass(); 
} 
//... 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
{ 

    int u = e.getA(); 
// this doesn't work - the object e is not known by the method 

} 
//... 
     java.awt.EventQueue.invokeLater(new Runnable() 
    { 

     public void run() 
     { 
      new GUI().setVisible(true); 

     } 
    }); 

답변

2

개체가 생성자에서 선언되었습니다. 따라서 생성자 자체 내에 만 존재합니다. 다른 메소드에서이 메소드를 사용하려면 클래스의 속성으로 외부에 선언해야합니다 (예 : 이렇게.

ExternalClass e;  

// constructor 
public GUI() 
{ 
    initComponents(); 
    e = new ExternalClass(); 
} 

이 필드는 GUI 클래스가 포함 된 패키지의 모든 클래스에서 볼 수 있습니다. 패키지 액세스에 대한 액세스 레벨 (개인용, 공용 또는 없음)을 지정할 수 있습니다.

2

e 변수를 생성자 내에 선언하고 인스턴스화하면 생성자 내부에서만 볼 수 있습니다.

멤버 변수로 선언하면 생성자 또는 인스턴스 변수로 인스턴스화 할 수 있습니다.

2

e 개체의 범위 (범위는 변수의 표시 방법을 의미 함)는 해당 생성자에 ExternalClass e이라고 말했기 때문에 생성자로 제한됩니다.

가장 간단한 해결책은이 변수를 생성자에서 정의하는 것이 아니라 클래스의 구성원으로 만드는 것입니다.

ExternalClass e의 선언을 생성자 외부로 이동하지만 여전히 클래스 자체에 있습니다. 생성자에서 e = new ExternalClass();을 수행하십시오. e이 생성자에서 볼 수 있습니다. 왜냐하면 생성자가 클래스 자체보다 낮은 범위이기 때문에 동일한 이유로 jButton1ActionPerformed 메서드에서도 볼 수 있습니다.

관련 문제