W jednej z klas w konstruktorze stworzyłem 16 przycisków przy pomocy pętli, co działa poprawnie. Jednak chciałbym dodać do każdego z nich obsługę zdarzeń... Mógłbym to zrobić oddzielnie dla każdego z nich definiując actionPerformed w klasach anonimowych lub razem korzystając z if'ów. Jednak, aby nie wydłużać niepotrzebnie kodu pomyślałem, że mógłbym wykonać to w pętli, jednak napotkałem problem przy przekazywaniu dodatkowego argumentu i:
Local variable i defined in an enclosing scope must be final or effectively final.
Kod zaś przedstawia się następująco:
public class ChooseClub extends Frame {
public ChooseClub(String title) {
super(title);
setLayout(new FlowLayout(FlowLayout.CENTER, 128, 10));
JButton button[] = new JButton[16];
ImageIcon icon[] = new ImageIcon[16];
for (int i = 0; i < 16; i++) {
button[i] = new JButton(Main.league.get(i).getName());
icon[i] = new ImageIcon(getClass().getResource("logos/" + Main.league.get(i).getLogo() + ".png"));
button[i].setIcon(icon[i]);
button[i].setVerticalTextPosition(SwingConstants.BOTTOM);
button[i].setHorizontalTextPosition(SwingConstants.CENTER);
button[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
EditFootballer editFootballer = new EditFootballer("Beniaminek - Edycja zawodników", i);
editFootballer.setVisible(true);
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
add(button[i]);
}
}
}
Co należy zrobić, aby zmienna i była widoczna wewnątrz funkcji anonimowej? Jest możliwość przeładowania metody przy obsłudze zdarzeń?