2013-07-11 94 views
1

因此,通常我是C,C++和C#程序員,在C#WPF中擁有大部分GUI經驗。我已經被安置在一個使用Java的項目上,並且我發現我的詞彙表對於C#而言並不能很好地與Java混合使用。Java操作說明

一個問題我已經遇到涉及Jbutton將,想必已經被稱爲在C#「代表」什麼。從這個example有這段代碼:

jbnButton1.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     jtfInput.setText("Button 1!"); 
    } 
}); 

簡單地說,這是什麼所謂的,其中一個函數定義爲一個參數(或作爲參數傳遞)?另外,這是最佳做法嗎?在我所開發的項目中,Initialize()函數充滿了像按鈕,複選框等這樣的函數,這使得它變得非常不易操作。我更喜歡在類級別定義,而不是在Initialize()中。

這讓我想起另一個example(上面的代碼示例)。與這些代碼行:

b1.addActionListener(this); 
    b3.addActionListener(this); 
... 
} 

public void actionPerformed(ActionEvent e) { 
    if ("disable".equals(e.getActionCommand())) { 
     b2.setEnabled(false); 
     b1.setEnabled(false); 
     b3.setEnabled(true); 
    } else { 
     b2.setEnabled(true); 
     b1.setEnabled(true); 
     b3.setEnabled(false); 
    } 
} 

實質上,代碼分配爲按鈕一次,b1和按鈕3的動作,b 3分配給相同的事件處理程序,這是在我更喜歡的範圍限定(外部的,其中按鈕正在初始化)。有沒有辦法讓它們指向不同的功能?另外,通過調用

.addActionListener(this); 

編譯器如何計算出在此使用actionPerformed(ActionEvent e)?是預先定義的行動將解決'actionPerformed(ActionEvent e)'?

+0

:這是當前類,它必須實現ActionListener接口。編譯器不會「找出」使用actionPerformed。相反,addActionListener要求參數實現ActionListener接口,其中包含actionPerformed()方法。使用ActionEvent.getSource()來確定是否單擊了b1或b3,然後從actionPerformed方法調用適當的方法。 – DwB

回答

1

你的第一個例子稱爲匿名類。它通常用於聽衆(如ActionListener s),但只能在您不必刪除偵聽器時使用,因爲沒有參考被保存。

對於問題的第二部分,編譯器不搞清楚何時調用actionPerformed。它是在ActionListenerdocumentation聲明:

當動作事件發生時,該對象的actionPerformed方法被調用。

因此,它是JButton有責任呼籲每當動作發生已添加到它的所有ActionListener小號actionPerformed

沒有辦法使b1b3指向不同的方法。這是其中一個匿名類將使一個更好的設計一個很好的例子:

b1.addActionListener(new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     b2.setEnabled(false); 
     b1.setEnabled(false); 
     b3.setEnabled(true); 
    } 
}); 

b3.addActionListener(new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     b2.setEnabled(true); 
     b1.setEnabled(true); 
     b3.setEnabled(false); 
    } 
}); 

假設b1有拉布勒「禁用」。然後this將不再需要執行ActionListener

1

你給第一個例子被稱爲「匿名內部類」。您所定義的ActionListener一個匿名子類,覆蓋其actionPerformed方法,實例化它(創建這個子類的實例),然後傳遞引用該實例的方法jbnButton1.addActionListener。這是迄今爲止最接近「關閉」的Java(至少在Java 8之前)。

這是慣用的時候,動作監聽器很簡單,但你可以重新編寫此作爲

class MyListener extends ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     jtfInput.setText("Button 1!"); 
    } 
} 
... 
jbnButton1.addActionListener(new MyListener()); 

但你可能要安排一個構造MyListener接受並保存jtfInput參考。內聯定義簡化了這一點。但是對於更復雜的情況,你可能想要在線外定義這個類。

至於第二個問題:

.addActionListener(this); 

其中這似乎必須實現ActionListener界面,所以它必須具有actionPerformed()方法的類。這就是讓框架「知道」要調用什麼的東西。

1

你的第二個代碼示例:

它知道,因爲你使用添加actionlistener -s到按鈕類實現該接口ActionListener

使用該actionperformed(),如果你傳遞給addActionListener方法自己的類(本),您必須實現actionPerformed方法,它的工作原理就像anonymous classes,因爲它是一個ActionListener

addActionListener方法知道s它有一個actionPerformed方法(它必須有一個),所以它會自動調用你的第二個問題的