Java:封闭范围中定义的局部变量mi必须是final或有效的final

我收到错误提示,就像在主题中一样,请问如何修复…错误在menuItem循环中,在这里我尝试将textArea前景颜色设置为从menuItem中选择的一种:(colors

[mi])

    String[] colors = {

"blue",

"yellow",

"orange",

"red",

"white",

"black",

"green",

};

JMenu mnForeground = new JMenu("Foreground");

for (int mi=0; mi<colors.length; mi++){

String pos = Character.toUpperCase(colors[mi].charAt(0)) + colors[mi].substring(1);

JMenuItem Jmi =new JMenuItem(pos);

Jmi.setIcon(new IconA(colors[mi]));

Jmi.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

JMenuItem item = (JMenuItem) e.getSource();

IconA icon = (IconA) item.getIcon();

Color kolorIkony = getColour(colors[mi]); // ERROR HERE: (colors[mi])

textArea.setForeground(kolorIkony);

}

});

mnForeground.add(Jmi);

}

public Color getColour(String colour){

try {

kolor = Color.decode(colour);

} catch (Exception e) {

kolor = null;

}

try {

final Field f = Color.class.getField(colour);

kolor = (Color) f.get(null);

} catch (Exception ce) {

kolor = Color.black;

}

return kolor;

}

回答:

该错误意味着 。


要在内部类中使用变量,必须对其进行声明final。只要mi是循环计数器并且final不能分配变量,就必须创建一种变通方法来获取可在内部类内部访问mifinal变量中的值:

final Integer innerMi = new Integer(mi);

因此,您的代码将如下所示:

for (int mi=0; mi<colors.length; mi++){

String pos = Character.toUpperCase(colors[mi].charAt(0)) + colors[mi].substring(1);

JMenuItem Jmi =new JMenuItem(pos);

Jmi.setIcon(new IconA(colors[mi]));

// workaround:

final Integer innerMi = new Integer(mi);

Jmi.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

JMenuItem item = (JMenuItem) e.getSource();

IconA icon = (IconA) item.getIcon();

// HERE YOU USE THE FINAL innerMi variable and no errors!!!

Color kolorIkony = getColour(colors[innerMi]);

textArea.setForeground(kolorIkony);

}

});

mnForeground.add(Jmi);

}

}

以上是 Java:封闭范围中定义的局部变量mi必须是final或有效的final 的全部内容, 来源链接: utcz.com/qa/420830.html

回到顶部