2014-09-04 73 views
0

AbstractButton定義了方法addActionListenerJButton和其他幾個常見的類繼承它。JCombobox爲什麼不是AbstractButton的子類?

我想寫一個方法,它需要一個支持addActionListener的對象數組,並使用ActionListener,並將動作偵聽器添加到所有這些對象。所以我寫了像這樣的方法:

private void addActionListener(ActionListener listener, AbstractButton... buttons){ 
    for(AbstractButton button : buttons) 
     button.addActionListener(listener); 
} 

但是一些對象,我試圖在這個方法來傳遞的,是JCombobox實例。他們確實有一個方法addActionListener,它的確如它在AbstractButton子類中所做的那樣。但由於某種原因,JCombobox不會從AbstractButton繼承。

這迫使我使用適配器模式,以包住不兼容JCombobox ES在那些繼承AbstractButton對象:

private static class ComboBoxListenableAdapter extends AbstractButton { 
    JComboBox combobox; 
    public ComboBoxListenableAdapter (JComboBox combobox){ 
     this.combobox = combobox; 
    } 
    public void addActionListener(ActionListener listener){ 
     combobox.addActionListener(listener); 
    } 
} 

我的問題是:爲什麼不JCombobox繼承AbstractButton?這不合理嗎?

+0

爲什麼要組合框繼承按鈕的行爲?他們都接受'ActionListner',是的,但是否? – Tom 2014-09-04 21:55:12

+0

因此,至少由於動作監聽器是GUI中的一個基本概念,爲什麼請注意製作一個'Listenable'接口並且有幾個類實現它?我不知道,看起來很奇怪 – 2014-09-04 21:56:25

+0

因爲它這樣做沒有意義。 JComboBox不是一個按鈕,它不會共享按鈕 – MadProgrammer 2014-09-04 21:56:37

回答

2

因爲JComboBox不是AbstractButton。現在將AbstractButton和JComboBox都定義爲ActionListenerAccepter或類似的東西,但這並不是兩個類定義的方式。假設你想要一種方法的解決方案(如果不使用像所建議的那樣的重載方法),我只是在這種情況下使用instanceof來保持你的代碼簡單(避免像那個Adapter那樣)。

private void addActionListener(ActionListener listener, 
      JComponent... possibleActionListenerComponents) 
{ 
    for(JComponent c : possibleActionListenerComponents) 
     if (c instanceof AbstractButton) 
      ((AbstractButton)c).addActionListener(listener); 
     else if (c instanceof JComboBox) 
      ((JComboBox)c).addActionListener(listener); 
} 
+1

嗯,我想這只是我,但我更喜歡重載的方法,接受不同的'JComponent'子類型,而不是在每次迭代中檢查和投射它們。 – Tom 2014-09-04 22:19:24

+0

@Tom這是一個更好的方法,但我的印象是Prog想要一種方法的解決方案。 – NESPowerGlove 2014-09-04 22:20:37

+0

@NESPowerGlove我想要一隻小馬,我們並不總是得到我們想要的;) – MadProgrammer 2014-09-04 23:32:04

相關問題