为什么我不能调用e.getSource()的返回方法?

时间:2015-02-20 04:37:17

标签: java

我会更多地了解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数组,而不仅仅是按钮名称。

1 个答案:

答案 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");
    }
}