Search code examples
javaclassmethodscallactionlistener

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


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.


Solution

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