2017-09-22 50 views
0

我有以下問題:添加的ActionListener到不明物體

我有這樣的功能:

public void addActionListenerObject(Object object) { 
    object.addActionListener(this); 
} 

我的問題是:我需要一個解決方案,我可以通過任何物體與addActionListener函數作爲參數。 該列表可以在這裏找到:https://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html

有沒有辦法解決這個問題,沒有大量的實例?

感謝

+0

是什麼'this'類的定義?擴展/實現了什麼類/接口? –

+0

'This'是一個ActionListener – qry

回答

1

飼養簽名

如果你不能改變你的方法的簽名(即,如果你必須接受一個Object,並調用addActionListener()如果有這樣的方法定義),更一般的/可靠的解決方案將使用Java Reflections檢查實際對象是否有已定義的方法addActionListener(),並通過反射來調用它。無論如何,這聽起來都很冒昧。

更改簽名

如果你可以改變你的方法簽名,請嘗試使用AbstractButtonhttps://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html#addActionListener(java.awt.event.ActionListener)),這是定義JButtonJToggleButtonJMenuItem這種方法的父類,比如(請參見「直接已知子類「和類定義樹來找出方法實際提供的位置)。

只有實際存在一個定義該方法的超類才能使用第二種方法。如果有不止一個,則必須使用if-else結構和instanceof +顯式演員(比您可以保留原始Object簽名)檢查可能的班級。

如果您提供有關原始問題的更多信息(例如,您爲什麼需要這種方法),我們可能會找到更好的方法。

+0

所以AbstractButton的方法是我已經做過的,但是它沒有掩蓋其他對象。反射方法可能是最好的,但性能可能是一個問題。我需要該方法將多個Action Listeners封裝到一個Libary中......老實說,我只是可以將用戶添加爲ActionListener,但它感覺不對。 if-else結構可能是最好的方法... – qry

+0

反射方法更強大,因爲實現'addActionListener(...)'方法的任何第三方或將來的類都將無需更改代碼。另一方面,如果需要該方法的可靠性很低(這意味着可能的使用將包含AbstractButton等一系列緊密的類),並且性能和代碼可維護性是更重要的要求, d選擇「if-else」方法。一如既往,最好的選擇將取決於你實際問題的全貌。 ;) –

0

你在找什麼是多態。所有類型爲Component的實例都有addActionListener方法。更改您的方法簽名期望Component,而不是Object

我以爲addActioListener繼承自Component。不是這樣。 該方法被單獨添加到每個組件類型中,沒有父類。

+0

類組件沒有函數addActionListener。我有同樣的想法,但我正在尋找合適的課程,我無法找到它。 – qry

+0

看我的編輯。你最好的選擇是爲每種類型編寫單獨的方法。 – Strikegently

1

傳遞功能接口(> = Java的1.8)如果你被允許改變addActionListenerObject簽名:

 
public class Just { 
    private ActionListener actionListener; 
    public void addActionListener(ActionListener actionListener) { 
     this.actionListener = actionListener; 
    } 
    public void doIt() { 
     System.out.println("Hello"); 
     actionListener.actionPerformed(new ActionEvent(this, 3, "World")); 
    } 
} 

public class MyActionListener implements ActionListener { 
    public void addActionListenerObject(Consumer<ActionListener> consumer) { 
     consumer.accept(this); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(e.getActionCommand()); 
    } 
} 

這樣一來,即添加動作監聽器(在我的例子中的類,這是Just )不需要實現一個接口。

使用它:

 
Just just = new Just(); 

MyActionListener listener = new MyActionListener(); 
listener.addActionListenerObject(just::addActionListener); // Aha! 

just.doIt(); 

此打印:

 
Hello 
World 
相關問題