0

I'd would know more about how e.getSource() works in ActionListener class, My Code is Here :

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());
        }
    }
}

In my understanding, e.getSource() will returns reference to the object that the event came from.

And now I don't understand why I can't call method of the source by doing like this :

System.out.println(e.getSource().getName());

I can only do By calling the private field theButton in the CLass, like this:

System.out.println(this.theButton.getName());

while it is already this.theButton == e.getSource() I can't understand why, can somebody explain more ?


Addition note, Why do I want to do this :

I can making a GUI with some action set to multiple button, And I want to separate the UI code and Action code in two class. My goal is let ActionController be the middle-man, calling function in another Class (Which those function able to reuse) while it has a list linking up button's name & the function.

I have read this question, The answer try to passing all the ui element while class is construct. Instead of that, I prefer to pass-in the ui element dynamicly by calling method after the class construct.

If it is able to call e.getSource().getName(), it will be a lots clean to doing like :

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);
     }
}

(a part of code, you got the idea) which it makes a lot easy to manage, because while I can't e.getSource().getName() I need to store array of MyButton, instead of just names of button.

Community
  • 1
  • 1
Theo Ymca
  • 109
  • 2
  • 10

1 Answers1

2

You need to cast it to your class MyButton:

if(e.getSource() instanceof MyButton) {
    MyButton btn = (MyButton)e.getSource();
    System.out.println(btn.getName());
}

e.getSource() returns Object type. There is no method named getName() within class Object. Hence compiler complaints about it.

Edited:

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