JButton[] button = new JButton[noOfDays];
for(int j=0 ;j<studentNameList.size() ;j++) {
for(int i=0 ;i<button.length ;i++) {
button[i]=new JButton((i+1)+"");
attendencepanels.add(button[i]);
button[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
----> button[i].setBackground(Color.red); //Local variable refenced from inner class must be final or effective final
//JOptionPane.showMessageDialog(null, "test");
}
});
如何在actionPerformed method
中的button [i]中解决此问题答案 0 :(得分:3)
虽然我不确定,但您可以从JButton
参数中获取ActionEvent e
引用。似乎getSource()
返回的内容(The object on which the Event initially occurred
):
而不是
button[i].setBackground(Color.red);
试
JButton button = (JButton) e.getSource();
button.setBackground(Color.red);
答案 1 :(得分:1)
变量i在此上下文中被修改,因此编译器无法处理它。改为给它一个不变的参考:
for(int j=0 ;j<studentNameList.size() ;j++) {
for(int i=0 ;i<button.length ;i++) {
JButton btn = new JButton((i+1)+""); // effectively final in that scope
button[i] = btn;
attendencepanels.add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
btn.setBackground(Color.red); //works now
}
});
}
}