下面的代码报了
Cannot refer to a non-final variable i inside an inner class defined in a different method
在内部类中不能引用一个定义在不同方法中的非final的变量i(翻译能力有限)
for(int i = 0; i < buttonIconList.size(); i++) {
//Adding the shadow when the mouse cursor is on
buttonIconList.get(i).addEventHandler(MouseEvent.MOUSE_ENTERED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
buttonIconList.get(i).setEffect(shadow);
}
});
}如果把i定义成final, buttonIconList.get(i).setEffect(shadow);这行就不报错了。可是i定义成final了,就不能循环了吧?如何解决呢?
Cannot refer to a non-final variable i inside an inner class defined in a different method
在内部类中不能引用一个定义在不同方法中的非final的变量i(翻译能力有限)
for(int i = 0; i < buttonIconList.size(); i++) {
//Adding the shadow when the mouse cursor is on
buttonIconList.get(i).addEventHandler(MouseEvent.MOUSE_ENTERED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
buttonIconList.get(i).setEffect(shadow);
}
});
}如果把i定义成final, buttonIconList.get(i).setEffect(shadow);这行就不报错了。可是i定义成final了,就不能循环了吧?如何解决呢?
EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
buttonIconList.get(i).setEffect(shadow);
};
OK,你就一个handler 的实例对象了。然后
for
{
buttonIconList.get(i).addEventHandler(MouseEvent.MOUSE_ENTERED, handler );
}这样不就得了?
这里面有i,不行啊。提示一样的错误:在内部类中不能引用一个定义在不同方法中的非final的变量i
这个i如何传参数呢?
你那个写法其实比较好,但是是不同的对象,内存多一些而已,但是用了类似于 closure,代码很清楚你用我那个写法,也可以,内存少了一些,但是你要在那个handler的内部类里面得到button的i信息了。1.
其实你把button的实例,和i做个映射关系就行了,比如说你用hashMap保存button和i的关系。2. 或者简单派生一下button类,里面加个 getI, setI的属性。
2.buttonList是一个ArrayList,并不是Button类型,不知道为什么派生Button类
在这里,final是用来定义常量的。。
在这里,final是用来定义常量的。。
在循环里定义不行吗?
如果你不想这么做,那么写一个类实现EventHandler接口,然后定义i的属性和构造方法也可以。
for(int i = 0; i < buttonIconList.size(); i++) {
//Adding the shadow when the mouse cursor is on
buttonIconList.get(i).addEventHandler(MouseEvent.MOUSE_ENTERED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
类 param=(类)e.getSource();//拿到鼠标事件的触发对象
param.setEffect(shadow);
//buttonIconList.get(i).setEffect(shadow);
}
});
}