2017-09-22 46 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 
相关问题