Pass variables to ActionListener in Java
33,953
Solution 1
In addition to Hovercraft's answer, you should note that you're not forced to use anonymous classes for your listeners. The code of Hovercraft's answer is similar to the following one:
private class PageActionListener implements ActionListener {
private int page;
public PageActionListener(int page) {
this.page = page;
}
public void actionPerformed(ActionEvent e) {
setPage(page);
}
}
...
for(int i = 0; i < 10; i++){
button = new JButton(buttons[i]);
button.addActionListener(new PageActionListener(i));
menu.add(button);
}
Solution 2
A totally different approach would be to add a property to the button, and retrieve that property in your action listener. E.g.
button=new JButton(buttons[i]);
button.putClientProperty( "page", i );
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
setPage((Integer)((JButton)e.getSource()).getClientProperty( "page" ));
}
});
Solution 3
The variable i
is in fact in the scope of the ActionListener, but since you're trying to use a local variable in an inner class, the variable must be final. So, you could use a final variable for this:
for(int i=0;i<10;i++){
final int index = i;
button=new JButton(buttons[i]);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
setPage(index);
}
});
menu.add(button);
}
Author by
Leo Jiang
Senior Frontend Engineer @ Facebook Formerly Lime, Pinterest, Google, Square
Updated on June 15, 2020Comments
-
Leo Jiang almost 4 years
I have something like the code below:
for(int i=0;i<10;i++){ button=new JButton(buttons[i]); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { setPage(i); } }); menu.add(button); }
However, the variable
i
isn't defined in the scope of the ActionListener class. How can I pass the variable? -
Robin almost 12 yearsI like this approach, more then making a final variable in the loop (personal preference of course). A +1 to correct the downvote
-
Akshay Damle almost 9 yearsThis should be the accepted answer. It's a simpler approach. Frankly, I didn't know that properties can be added to buttons like that. Great answer.
-
Xel over 7 yearsMaybe the asker decided to not use an anonymous class anymore so he accepted the answer by JB Nizet instead.
-
Markus Tonsaker about 7 yearsWhat if you are using a class that doesn't have "putClientProperty()"? Such as javax's Timer.