我想进一步了解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成为中间人,在另一个Class中调用该函数(这些函数可以重用),同时它具有一个链接按钮名称和函数的列表。
我读过this question,答案是尝试在构造类时传递所有ui元素。取而代之的是,我更喜欢通过在类构造之后调用method来动态传递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的数组,而不仅仅是按钮的名称。 最佳答案
您需要将其强制转换为您的课程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");
}
}
关于java - 为什么我不能调用e.getSource()的返回方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28621706/