Java: Using an actionlistener to call a function in another class on an object from that class
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.
Comments
-
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 over 14 yearsI don't quite understand the second option you describe. How is it possible to access the methods of an enclosing type?
-
McDowell over 14 yearsIf you added a method
doFoo()
toAnctionListenerDemo2
, then you could call it from insideactionPerformed
.actionPerformed
belongs to the anonymous inner class implementation of the interfaceActionListener
. Intro to nested classes here: java.sun.com/docs/books/tutorial/java/javaOO/nested.html