Java:在封闭范围内定义的局部变量 mi 必须是最终的或实际上是最终的

标签 java

我收到错误,如主题所示,请教您如何修复它... 错误在 menuItem-loop 中,我尝试将 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;
}

最佳答案

错误意味着您不能使用局部变量mi在内部类中


要在内部类中使用变量,您必须声明它 final .只要mi是循环的计数器,final无法分配变量,您必须创建一个解决方法来获取 mi final 中的值可以在内部类内部访问的变量:

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 必须是最终的或实际上是最终的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33799800/

相关文章:

java - 转换为具体类并在 Java 中调用方法

java - 使用 JQuery 返回列表

Java JFrame 删除和重绘组件不起作用

java - 从 String 解码 Base64InputStream 并在 Java 中使用 GZIPInputStream 解压缩

java - JNativeHook_6363198016012433909.dll : Access is denied

java - 如何根据特定键获取 MongoDB 中的最大值和最小值?

java - 是否存在允许一定比例的失败的测试框架?

java.Security.NoSuchAlgorithmException

java - 设备跟踪协议(protocol)

java - 关于Azure表存储中的表实体