我想进一步了解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/

10-12 00:41