我会更多地了解e.getSource()
在ActionListener
课程中的工作原理,
我的代码在这里:
public class ActionController implements ActionListener{
private MyButton theButton;
public void setTheButton(MyButton btn){
this.theButton = btn;
}
public void actionPerformed(ActionEvent e){
if(this.theButton == e.getSource()){
System.out.println(e.getSource().getName());
}
}
}
根据我的理解,e.getSource()
将返回对事件来自的对象的引用。
现在我不明白为什么我不能通过这样做来调用来源方法:
System.out.println(e.getSource().getName());
我只能在CLass中调用私有字段theButton
,如下所示:
System.out.println(this.theButton.getName());
虽然已经this.theButton == e.getSource()
我无法理解为什么,有人可以解释更多吗?
补充说明,我为什么要这样做:
我可以创建一个GUI,将一些动作设置为多个按钮,我想在两个类中分离UI代码和Action代码。 我的目标是让ActionController成为中间人,在另一个类中调用函数(这些函数能够重用),同时它有一个列表链接按钮的名称&功能。
我已阅读this question,答案尝试在构造类时传递所有ui元素。而不是那样,我更喜欢通过在类构造之后调用方法来动态地传入ui元素。
如果它能够呼叫e.getSource().getName()
,那么这样做会非常干净:
private String[] element_funtion_table;
public void actionPerformed(ActionEvent e){
String eleName = e.getSource().getName();
String ftnName = this.getLinkedFtn(eleName);
if(!ftnName.equals("")){
this.callFtn(ftnName);
}
}
(代码的一部分,你有了这个想法),它使管理起来很容易,因为
虽然我不能e.getSource().getName()
我需要存储MyButton数组,而不仅仅是按钮名称。
答案 0 :(得分:2)
您需要将其投放到您的班级MyButton
:
if(e.getSource() instanceof MyButton) {
MyButton btn = (MyButton)e.getSource();
System.out.println(btn.getName());
}
e.getSource()
返回Object
类型。类getName()
中没有名为Object
的方法。因此编译器对此抱怨。
被修改:
public void actionPerformed(ActionEvent e){
if(e.getSource() instanceof MyButton) {
MyButton btn = (MyButton)e.getSource();
String ftnName = this.getLinkedFtn(btn.getName());
if(!ftnName.equals("")){
this.callFtn(ftnName);
} else {
System.out.println("unknown ftnName");
}
} else {
System.out.println("unknown source");
}
}