2011-12-11 23 views
-1

在我的對話框中,我有一個按鈕。它是動作偵聽器方法這是指什麼?它是按鈕的引用還是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 
} 

當從jdialog

回答

3

它的類的對象,實現了ActionListener接口你addActionListener參考。

如果爲此實現了「獨立」類,它將是該類的一個實例。如果你傳入一個匿名類,那麼它就是對該匿名類的一個實例的引用。

如果動作偵聽器是JDialog本身,則this引用JDialog對象。

就你而言,你正在使用一個匿名類。所以在actionPerformed裏面,this是指那個類的一個實例。 但是,請注意,您正在調用未在該匿名類中定義的函數。這就是「魔法」發生的地方:內部類有對封閉類的引用。

jButton5ActionPerformed(evt); 

相當於:

myenclosingobject.jButton5ActionPerformed(evt); 

所以內部jButton5ActionPerformedthis指封裝類的一個對象,即創建匿名類實例的一個。

這在JLS Inner classes and Enclosing instances說明:

一類的O的直接內類C的我一個實例爲O的一個實例,被稱爲我的立即封閉實例相關聯。對象創建時(第15.9.2節)會確定對象的立即封閉實例(如果有)。

+0

'如果你傳入了一個匿名類,那麼它就是對這個匿名類的一個實例的引用.'那個匿名類永遠不會擴展JDialog類。那麼我如何能夠訪問'dispose'' –

+1

等方法,我從來沒有說過。我不認爲你會通過一個匿名課程。 'jButton5ActionPerformed'代碼中的'this'將(必須)是定義該方法的類的實例。它不能成爲其他任何事物的實例,我認爲這種方法不在匿名類中。 – Mat

+0

請查看如何調用該方法。 _EDITED_ –

3

這看起來像Netbeans的代碼點擊一個名爲done按鈕,上面的代碼被調用。 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) 

爲了避免陷入這樣的情況下,Netbeans的創建匿名的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

'這個<---顯然是指JDialog'能否請您解釋一下 –

+0

在我的第二個代碼示例,你有調用jButton1ActionPerformed方法。當你使用「this」時,在這個方法裏面它引用封閉類的實例,在你的情況下它是一個JDialog,因爲它是這個類的一個方法。在第一個代碼示例中,第一個「this」引用ActionListener對象,因爲它是ActionListener類的一個方法,第二個是JDialog。 –

1

1),你必須閱讀How to Make Dialogs

2)如果你創建JDialog只有一次每個應用life_cycle然後調用JDialog#dispose(),只有一次時間,否則創建JDialog和重用,對另一個動作/事件

1

在你的情況,我想這個場景,

可能在netbeans中,你創建了一個jframe,然後添加了一個jdialog.Then添加了一個jbut噸,現雙單擊該按鈕,編寫執行動作的代碼(或右鍵單擊,事件>行動>的actionPerformed)

注:然後添加一個JDialog,我的意思是你拖ñ它下降到幀。

在給定的情況下,這jframe而不是jdialog

相關問題