错误:从内部类引用的局部变量必须是final或effective final

时间:2016-09-14 06:18:52

标签: java swing

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]中解决此问题

2 个答案:

答案 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
                }
            });
        }
    }