2017-04-27 87 views
3

我在Java類它得到具有這樣的功能觸發一個動作偵聽器(如下所示):java的多個對象作爲參數爲函數

// action event fired when hitting a checkbox 
public void fireActionCheckBox(MyMainClass frame, JCheckBox theButtonExample) { 

    for(ActionListener a: theButtonExample.getActionListeners()) { 
     a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null) { 
       //Nothing need go here, the actionPerformed method (with the 
       //above arguments) will trigger the respective listener 
     }); 
    } 
} 

然後我具有不相同爲一個第二功能JButton的動作偵聽器:

// action event fired when hitting a button 
public void fireActionButton(MyMainClass frame, JButton theButtonExample) { 

    for(ActionListener a: theButtonExample.getActionListeners()) { 
     a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null) { 
       //Nothing need go here, the actionPerformed method (with the 
       //above arguments) will trigger the respective listener 
     }); 
    } 
} 

據我所知,在Java開始前的參數必須指定,但它似乎沒有效率的兩次寫相同的代碼。有沒有更好的方法來做到這一點,他們會允許我不寫兩個功能來執行類似的操作。

謝謝你的幫助!

+3

提示:是否有共同的父類een'JButton'和'JCheckBox'? –

+0

也許你可以在一個單獨的類中使用for循環作爲方法,然後在這兩個地方調用 – wylasr

+0

@Joe C - yes'JComponent'是'JButton'和'JCheckBox'的父類,但我無法使用'.getActionListeners()'帶有'JComponent' – JFreeman

回答

3
public void fireActionCheckBox(MyMainClass frame, AbstractButton button) { ... } 

有一個抽象類AbstractButton這是這兩個類的父。它已經定義了getActionListeners方法。

此外,你可以在一個更通用的方法重寫方法:

public <T extends AbstractButton> void fireActionButton(MyMainClass frame, T button) { ... } 
+0

將它作爲第二個例子顯示出來會帶來什麼好處? – JFreeman

+1

@JFreeman,它只是看起來更有表現力,沒有什麼區別,直到你使用具有某種層次結構的類型集合。 – Andrew

+0

好的,謝謝! – JFreeman

2

您可以傳遞給方法a 泛型參數而不是JCheckBox theButtonExampleJButton theButtonExample。例如,假設兩個類擴展了相同的父,你可以做

public <J extends commonParent> void fireActionButton(MyMainClass frame, J j) { 
    //... 
} 

由於@Sweeper在評論中指出的,由於父母沒有聽衆,你將需要檢查類型做一個向下轉換

public <J extends JComponent> void fireActionButton(MyMainClass frame, J j) { 
    if (j instanceof JComboBox) { 
    JCheckbox jbox = (JComboBox)j; 
    // Do something else 
    } 
} 
+2

問題是,'JButton'和'JComboBox' - 'JComponent'的常見父項沒有'getActionListeners'方法。 – Sweeper

+0

你說得對。我認爲在這種情況下,我們需要檢查方法中的對象類型。儘管如此,我認爲這比兩次寫同樣的方法要好:P – PhoenixPan

1

JCheckBox的和JButton的都是同一個父類的孩子的:

enter image description here

定義與方法兩者的超類:

public void fireActionAbstractButton(MyMainClass frame, AbstractButton myAbstractButton) { 
     System.out.println(myAbstractButton.getClass().getName()); 
    } 
+0

是的這有效! (我不幸只能標記一個答案是正確的) – JFreeman