2011-12-11 2 views
-1

내 대화 상자에는 button.In 액션 리스너 메소드가 무엇을 참조합니까? 단추의 참조 또는 JDialog의 참조입니까? 내가 눈치 챘을 때 JDialog의 참조입니다 때 내 IDE에서 내가 누르십시오. 다른 모든 구성 요소와 용기의 방법은 dispose과 같이 나타납니다. 그렇다면 JDialog의 레퍼런스는 어떻습니까? 그것은 JButton이어야합니다.jdialog의 버튼의 액션 리스너 메소드에서 이것이 무엇을 참조합니까?

jButton5.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton5ActionPerformed(evt); 
     } 
    }); 

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {           
    boolean rB_1 = jRadioButton1.isSelected(); 
    boolean rB_2 = jRadioButton2.isSelected(); 
    boolean rB_4 = jRadioButton4.isSelected(); 

    if(rB_2) 
     new class_design().changeStatusOfMessageDisplayMode(true); 

    this.dispose(); // <-------- this one 
} 

done라는 버튼이 넷빈즈의 코드처럼 보이는 jdialog

답변

3

그것은 addActionListenerActionListener 인터페이스 당신을 구현하는 클래스의 객체에 대한 참조입니다.

"독립 실행 형"클래스를 구현 한 경우 해당 클래스의 인스턴스가됩니다. 익명 클래스를 전달한 경우 해당 익명 클래스의 인스턴스에 대한 참조입니다.

조치 수신기가 JDialog 그 자체 인 경우, this은 JDialog 오브젝트를 참조합니다.

귀하의 경우 익명의 클래스를 사용하고 있습니다. 따라서 actionPerformed 안에있는 this은 해당 클래스의 인스턴스를 나타냅니다. 그러나, 그 익명 클래스에 정의되지 않은 함수를 호출하는 것을 알 수 있습니다. 그것은 "마법"이 일어나는 곳입니다 : 내부 클래스는 둘러싸는 클래스에 대한 참조를가집니다.

myenclosingobject.jButton5ActionPerformed(evt); 

그래서 jButton5ActionPerformed 내부 this은 포함 클래스의 객체 익명 클래스 인스턴스 만들어 하나를 말한다 :

jButton5ActionPerformed(evt); 

는 동일하다.

이는 JLS Inner classes and Enclosing instances 설명한다 :

I 클래스 O의 직접적인 내부 클래스 C의 인스턴스 나 직접 둘러싸 인스턴스라고도 O의 인스턴스와 관련된다. 개체를 즉시 둘러싸는 인스턴스 (있는 경우)는 개체 생성시 결정됩니다 (§15.9.2).

+0

'익명 클래스를 전달하면 익명 클래스의 인스턴스에 대한 참조입니다.'익명 클래스는 JDialog 클래스를 확장하지 않습니다. 그렇다면 어떻게'dispose'와 같은 메소드에 접근 할 수 있습니까? –

+1

나는 결코 그렇게 말하지 않았습니다. 그리고 당신이 익명의 클래스를 통과하고 있다고 생각하지 않습니다. 당신의'jButton5ActionPerformed' 코드 안에있는'this'는 그 메소드를 정의하는 클래스의 인스턴스가 될 것입니다. 그것은 다른 것의 인스턴스가 될 수 없으며, 그 메소드가 익명 클래스에 있다고 생각하지 않습니다. – Mat

+0

메서드 호출 방법을 참조하십시오. _EDITED_ –

3

에서 클릭하면 위의 코드가 호출됩니다. jButton5ActionPerformed는 JDialog 내부의 메소드로서 자체적으로 서 있습니다. 이것은 메소드를 포함하고있는 JDialog 클래스를 분명히 가리킨다. 이 같은 상황에 점점 방지하기 위해

jButton1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      this <---Refers to the ActionListener. 
     } 
    }); 
    this <---Refers to the class (JDialog in your case) 

는 넷빈즈는 익명의 ActionListener 외부 jButton1ActionPerformed 새로운 방법을 만들고, 그것을 호출합니다.

jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    this <---obviously refers to the JDialog 
} 
+0

'이 <--- 분명히 당신이 내 두 번째 코드 샘플에서 그것을 –

+0

을 설명하시기 바랍니다 수있는 JDialog'을 의미 설치해야을 말한다 jButton1ActionPerformed 메소드를 호출하십시오. "this"를 사용했을 때,이 메소드 내에서 그것은 둘러싼 클래스의 인스턴스를 참조합니다.이 클래스의 메소드이기 때문에 여러분의 경우 JDialog입니다. 첫 번째 코드 샘플에서 첫 번째 "this"는 ActionListener 클래스의 메서드이고 두 번째 코드는 JDialog이므로 ActionListener 개체를 참조합니다. –

1

1) 그렇지 않으면 시간 만되면 JDialog를 작성하고 다른 행동/이벤트에 대한 것을 다시, 당신은 다음 JDialog#dispose() 전화 생존 구간 응용 프로그램 당 한 번만 JDialog를 만드는 경우) How to Make Dialogs

2를 읽을 필요

1

귀하의 경우에는이 시나리오를 가정합니다.

아마도 netbeans에서 jframe을 만든 다음 jdialog를 추가했을 것입니다. 톤, 이제 두 번 (의 actionPerformed 또는 마우스 오른쪽 버튼으로 클릭 이벤트> 액션>) 작업을 수행하기위한 코드를 작성하기 버튼을 클릭

참고 : 는 당신이 여기서 n은에 떨어 끌려 의미하는 JDialog를 추가 틀. 주어진 시나리오에서

, jframe 아닌 jdialog

관련 문제