2011-03-29 135 views
4

我有一個在swing應用程序中的幾個不同點上使用的GUI元素。當按下「確定」按鈕時,我需要在每個實例中運行不同的代碼。將塊傳遞給Java中的方法

我已經通過在每種情況下傳遞一個動作偵聽器來解決這個問題,但是隨着我繼續這變得混亂。在Ruby中儘可能將塊傳遞給方法。我想知道Java中是否存在類似但乾淨的東西。

凌亂代碼: 主要是由於需要調用GUI對象元素的方法。如果我在構造函數中傳遞ActionListener,則該對象尚不存在。我可以在每種情況下調用第二種方法,但不是優選的。

回答

0

我已經使用的解決方案並沒有真正解決問題的標題,但完全滿足了我的需求。因爲:

  • 在我的情況下,它總是被解析的功能(即,onConfirm功能),並且這個功能在每個實例中都是必需的。
  • 每個需要獨特功能的實例都不適合工廠模式。

我已經作出了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(); 
    } 
}); 
3

您有正確的想法。將任意代碼塊傳遞給方法的通常解決方案是Command pattern。如果您可以顯示您現在具有的「雜亂」代碼示例,則可以幫助您清理它。

更新回覆:亂碼

如果我通過了ActionListener的構造函數中的對象還不存在。

一個實際的代碼示例將有助於提供良好的響應。有人猜測,我想說,也許你想看看Factory pattern?在這種情況下,我更多地考慮封裝優勢,而不是多態優勢。再次,只是猜測。看到代碼有幫助。

0

Java不支持作爲一流公民的代碼塊(或功能)的想法。這就是事件通過實現特定接口的類來完成的原因。你似乎已經做了類似的事情,所以也許你只需要創建自己的接口來支持你想要支持的特定事件。

1

通過ActionListener實現可能是您現在可以做的最好的。

Java 8將提供對「閉包」的支持,這將大大簡化使用單個單參數方法實現接口的過程。但是,對於Java 7幾乎沒有出現,對於Java 8來說這將是幾年。

+0

我不懷疑你是正確的估計,但最後我聽說他們還在2012年底拍攝的Java 8。官方估計是否改變了? – 2011-03-29 18:10:23

+0

@Mark Peters - 不,我認爲這仍然是官方估計。 – erickson 2011-03-29 18:40:12