当前位置:编程学习 > JAVA >>

java中如何给多个按钮添加同样的事件

下面的代码报了
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了,就不能循环了吧?如何解决呢? --------------------编程问答-------------------- 你非得在那new?
--------------------编程问答--------------------
引用 1 楼 healer_kx 的回复:
你非得在那new?

只要能解决,在那都可以。呵呵! --------------------编程问答-------------------- 在哪都可以。Java比较弱,用的还是 --------------------编程问答-------------------- 首先,
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 );
}

这样不就得了? --------------------编程问答-------------------- EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
这里面有i,不行啊。提示一样的错误:在内部类中不能引用一个定义在不同方法中的非final的变量i
这个i如何传参数呢? --------------------编程问答-------------------- 监听者模式.. --------------------编程问答-------------------- 哦,Sorry,才发现有i的问题,那么其实它们本来是不同的handler了。
你那个写法其实比较好,但是是不同的对象,内存多一些而已,但是用了类似于 closure,代码很清楚。。。

你用我那个写法,也可以,内存少了一些,但是你要在那个handler的内部类里面得到button的i信息了。

1.
其实你把button的实例,和i做个映射关系就行了,比如说你用hashMap保存button和i的关系。

2. 或者简单派生一下button类,里面加个 getI, setI的属性。

--------------------编程问答-------------------- 不用Sorry,呵呵。大家一起讨论就好。

1.如果用HashMap保存Button和i的关系,给每一个Button都添MouseEvent.MOUSE_ENTERED事件,最终还是得用循环的。
2.buttonList是一个ArrayList,并不是Button类型,不知道为什么派生Button类。。。
--------------------编程问答-------------------- fianl int index=i;在定义一个变量呗、、、 --------------------编程问答--------------------
引用 9 楼 zsjpower 的回复:
fianl int index=i;在定义一个变量呗、、、

有10个按钮,定义10个变量?那就不用循环了,我有2个鼠标的事件,那就是写10对事件,一共有20个了。
在这里,final是用来定义常量的。。 --------------------编程问答--------------------
引用 10 楼 sagegz 的回复:
Quote: 引用 9 楼 zsjpower 的回复:

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

有10个按钮,定义10个变量?那就不用循环了,我有2个鼠标的事件,那就是写10对事件,一共有20个了。
在这里,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);
                 }
         });
     }
--------------------编程问答-------------------- 看来得升级JDK,用lambda表达式了。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,