如何在mouseClicked事件中使用局部变量?解决内部类变量引用报错
问题解决:内部类引用局部变量报错
报错原因
Java 规定,匿名内部类(比如你代码里的MouseAdapter子类)访问外部方法的局部变量时,该变量必须是final或者有效final(即变量初始化后不再被修改)。你的代码中i在循环里持续执行i++,属于被修改的变量,不符合规则,因此编译器报错。
解决方案
方案1:用final临时变量保存当前索引
在循环内部创建一个final变量,存储当前的i值,让内部类引用这个不会被修改的临时变量:
int i = 0; for (dvc : devicelist) { final int currentIndex = i; fields[i] = new JTextField(""); fields[i].setEditable(false); fields[i].addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { addComponents(currentIndex); } }); i++; }
方案2:改用普通for循环(适用于可索引集合)
如果devicelist是List这类支持索引访问的集合,直接用普通for循环,同样配合final临时变量:
for (int i = 0; i < devicelist.size(); i++) { final int currentIndex = i; fields[i] = new JTextField(""); fields[i].setEditable(false); fields[i].addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { addComponents(currentIndex); } }); }
方案3:把索引存储到文本框的自定义属性中
利用Swing组件的putClientProperty方法,将索引值绑定到JTextField上,点击时再取出:
int i = 0; for (dvc : devicelist) { fields[i] = new JTextField(""); fields[i].setEditable(false); fields[i].putClientProperty("componentIndex", i); fields[i].addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { JTextField source = (JTextField) e.getSource(); int index = (int) source.getClientProperty("componentIndex"); addComponents(index); } }); i++; }
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

