Java: Using an actionlistener to call a function in another class on an object from that class

63,148

Solution 1

One way to reference things in an anonymous class is using the final keyword:

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

Alternatively, you can access members (variables or methods) of an enclosing type:

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}

Solution 2

I've had the same problem like you and this is how i solved it.

You can either make your object final (final CastleCrash sim = new CastleCrash();), but i didn't want to do that, or you can make something like a setter method to run the method in your other class:

My code for the listener class:

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

My code for the other class:

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

Hope this is helpful, good luck ! :)

Solution 3

McDowell already answers practically with good examples on how to access variables from event listeners (or anonymous inner classes in general). There is however a more general Sun resource on Event Listeners in Swing that is canonical and a good overview of all the caveats to take into account when writing them.

Share:
63,148
Myles
Author by

Myles

Mad Scientist in Training.

Updated on June 29, 2020

Comments

  • Myles
    Myles almost 4 years

    Basically what I want to do is get a start button to initiate a method running in another class and acting on another object.

    My code for the listener:

    button1a.addActionListener(new ActionListener() {
        public void actionPerformed (ActionEvent event) {
            // Figure out how to make this work
            //sim.runCastleCrash(); 
        }
    } );
    

    My code for the other class:

    public static void main(String[] args) {
        CastleCrash sim;
        sim = new CastleCrash();
    }
    

    and

    public void runCastleCrash() {
        System.out.println("Castle Crash is beginning...");
        //Other method parts here to be added
    }
    

    I get the feeling this can't be too hard, but I'm missing a piece.

  • Myles
    Myles over 14 years
    I don't quite understand the second option you describe. How is it possible to access the methods of an enclosing type?
  • McDowell
    McDowell over 14 years
    If you added a method doFoo() to AnctionListenerDemo2, then you could call it from inside actionPerformed. actionPerformed belongs to the anonymous inner class implementation of the interface ActionListener. Intro to nested classes here: java.sun.com/docs/books/tutorial/java/javaOO/nested.html