下面的代码报了
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了,就不能循环了吧?如何解决呢?

解决方案 »

  1.   

    在哪都可以。Java比较弱,用的还是
      

  2.   

    首先,
    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 );
    }这样不就得了?
      

  3.   

    EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
    这里面有i,不行啊。提示一样的错误:在内部类中不能引用一个定义在不同方法中的非final的变量i
    这个i如何传参数呢?
      

  4.   

    哦,Sorry,才发现有i的问题,那么其实它们本来是不同的handler了。
    你那个写法其实比较好,但是是不同的对象,内存多一些而已,但是用了类似于 closure,代码很清楚你用我那个写法,也可以,内存少了一些,但是你要在那个handler的内部类里面得到button的i信息了。1.
    其实你把button的实例,和i做个映射关系就行了,比如说你用hashMap保存button和i的关系。2. 或者简单派生一下button类,里面加个 getI, setI的属性。
      

  5.   

    不用Sorry,呵呵。大家一起讨论就好。1.如果用HashMap保存Button和i的关系,给每一个Button都添MouseEvent.MOUSE_ENTERED事件,最终还是得用循环的。
    2.buttonList是一个ArrayList,并不是Button类型,不知道为什么派生Button类
      

  6.   

    fianl int index=i;在定义一个变量呗、、、
      

  7.   

    有10个按钮,定义10个变量?那就不用循环了,我有2个鼠标的事件,那就是写10对事件,一共有20个了。
    在这里,final是用来定义常量的。。
      

  8.   

    有10个按钮,定义10个变量?那就不用循环了,我有2个鼠标的事件,那就是写10对事件,一共有20个了。
    在这里,final是用来定义常量的。。
    在循环里定义不行吗?
    如果你不想这么做,那么写一个类实现EventHandler接口,然后定义i的属性和构造方法也可以。
      

  9.   

    哈哈,看我的吧
    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);
                     }
             });
         }
      

  10.   

    看来得升级JDK,用lambda表达式了。