Reputation: 26075
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?
Upvotes: 8
Views: 37586
Reputation: 36601
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" ));
}
});
Upvotes: 22
Reputation: 691645
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);
}
Upvotes: 24
Reputation: 285405
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);
}
Upvotes: 13