我有一個在swing應用程序中的幾個不同點上使用的GUI元素。當按下「確定」按鈕時,我需要在每個實例中運行不同的代碼。將塊傳遞給Java中的方法
我已經通過在每種情況下傳遞一個動作偵聽器來解決這個問題,但是隨着我繼續這變得混亂。在Ruby中儘可能將塊傳遞給方法。我想知道Java中是否存在類似但乾淨的東西。
凌亂代碼: 主要是由於需要調用GUI對象元素的方法。如果我在構造函數中傳遞ActionListener,則該對象尚不存在。我可以在每種情況下調用第二種方法,但不是優選的。
我有一個在swing應用程序中的幾個不同點上使用的GUI元素。當按下「確定」按鈕時,我需要在每個實例中運行不同的代碼。將塊傳遞給Java中的方法
我已經通過在每種情況下傳遞一個動作偵聽器來解決這個問題,但是隨着我繼續這變得混亂。在Ruby中儘可能將塊傳遞給方法。我想知道Java中是否存在類似但乾淨的東西。
凌亂代碼: 主要是由於需要調用GUI對象元素的方法。如果我在構造函數中傳遞ActionListener,則該對象尚不存在。我可以在每種情況下調用第二種方法,但不是優選的。
我已經使用的解決方案並沒有真正解決問題的標題,但完全滿足了我的需求。因爲:
我已經作出了GUI元素摘要:
abstract class Element extends JPanel {
...
private final JButton button = new JButton("OK");
protected abstract void onConfirm();
public Element(){
this.button.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent e) {
onConfirm();
}
});
...
}
}
與幾個匿名內部類實現每個讓我訪問GUI元素的內部。
this.getContentPane().add(new Element(){
@Override public void onConfirm() {
doStuffWithCommand();
}
});
您有正確的想法。將任意代碼塊傳遞給方法的通常解決方案是Command pattern。如果您可以顯示您現在具有的「雜亂」代碼示例,則可以幫助您清理它。
更新回覆:亂碼
如果我通過了ActionListener的構造函數中的對象還不存在。
一個實際的代碼示例將有助於提供良好的響應。有人猜測,我想說,也許你想看看Factory pattern?在這種情況下,我更多地考慮封裝優勢,而不是多態優勢。再次,只是猜測。看到代碼有幫助。
Java不支持作爲一流公民的代碼塊(或功能)的想法。這就是事件通過實現特定接口的類來完成的原因。你似乎已經做了類似的事情,所以也許你只需要創建自己的接口來支持你想要支持的特定事件。
通過ActionListener
實現可能是您現在可以做的最好的。
Java 8將提供對「閉包」的支持,這將大大簡化使用單個單參數方法實現接口的過程。但是,對於Java 7幾乎沒有出現,對於Java 8來說這將是幾年。
我不懷疑你是正確的估計,但最後我聽說他們還在2012年底拍攝的Java 8。官方估計是否改變了? – 2011-03-29 18:10:23
@Mark Peters - 不,我認爲這仍然是官方估計。 – erickson 2011-03-29 18:40:12