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

sagegz 2013-10-05 05:49:43
下面的代码报了
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了,就不能循环了吧?如何解决呢?
...全文
1041 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sagegz 2013-10-28
  • 打赏
  • 举报
回复
看来得升级JDK,用lambda表达式了。
疯狂熊猫人 2013-10-05
  • 打赏
  • 举报
回复
哈哈,看我的吧


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);
        	        }
        	});
    	}
zsjpower 2013-10-05
  • 打赏
  • 举报
回复
引用 10 楼 sagegz 的回复:
[quote=引用 9 楼 zsjpower 的回复:] fianl int index=i;在定义一个变量呗、、、
有10个按钮,定义10个变量?那就不用循环了,我有2个鼠标的事件,那就是写10对事件,一共有20个了。 在这里,final是用来定义常量的。。[/quote] 在循环里定义不行吗? 如果你不想这么做,那么写一个类实现EventHandler接口,然后定义i的属性和构造方法也可以。
sagegz 2013-10-05
  • 打赏
  • 举报
回复
引用 9 楼 zsjpower 的回复:
fianl int index=i;在定义一个变量呗、、、
有10个按钮,定义10个变量?那就不用循环了,我有2个鼠标的事件,那就是写10对事件,一共有20个了。 在这里,final是用来定义常量的。。
zsjpower 2013-10-05
  • 打赏
  • 举报
回复
fianl int index=i;在定义一个变量呗、、、
sagegz 2013-10-05
  • 打赏
  • 举报
回复
不用Sorry,呵呵。大家一起讨论就好。 1.如果用HashMap保存Button和i的关系,给每一个Button都添MouseEvent.MOUSE_ENTERED事件,最终还是得用循环的。 2.buttonList是一个ArrayList,并不是Button类型,不知道为什么派生Button类。。。
healer_kx 2013-10-05
  • 打赏
  • 举报
回复
哦,Sorry,才发现有i的问题,那么其实它们本来是不同的handler了。 你那个写法其实比较好,但是是不同的对象,内存多一些而已,但是用了类似于 closure,代码很清楚。。。 你用我那个写法,也可以,内存少了一些,但是你要在那个handler的内部类里面得到button的i信息了。 1. 其实你把button的实例,和i做个映射关系就行了,比如说你用hashMap保存button和i的关系。 2. 或者简单派生一下button类,里面加个 getI, setI的属性。
colie_li 2013-10-05
  • 打赏
  • 举报
回复
监听者模式..
sagegz 2013-10-05
  • 打赏
  • 举报
回复
EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() { 这里面有i,不行啊。提示一样的错误:在内部类中不能引用一个定义在不同方法中的非final的变量i 这个i如何传参数呢?
healer_kx 2013-10-05
  • 打赏
  • 举报
回复
首先, 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 ); } 这样不就得了?
sagegz 2013-10-05
  • 打赏
  • 举报
回复
在哪都可以。Java比较弱,用的还是
sagegz 2013-10-05
  • 打赏
  • 举报
回复
引用 1 楼 healer_kx 的回复:
你非得在那new?
只要能解决,在那都可以。呵呵!
healer_kx 2013-10-05
  • 打赏
  • 举报
回复
你非得在那new?

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧