为按钮数组注册监听
来源:互联网 发布:淘宝卖家客户电话 编辑:程序博客网 时间:2024/05/17 09:09
在完成“别踩白块”的课设时,遇到了按钮数组注册监听的问题,现将问题和解决办法记录如下:
问题
如下设置监听会提示:从内部引用的本地变量必须是最终变量或实际上的最终变量(使用final修饰的变量)此处的错误为变量i,并非mBolk数组。
for(int i=0;i<mBolk.length;i++){ mBolk[i] = new Bolk(); mBolk[i].addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ if( mBolk[i].getValue()){ mBolk[i].setValue(false); mBolk[i].set_Color(); } } }); panel.add(mBolk[i]);}
问题分析
这个问题在内部类的使用过程中比较常见,为内部类调用外部变量时必须保证外部变量时final类型的,即为最终变量。此处调用的为局部变量,局部变量不存放在对象所在的存储区中,即不予actionPerformed()方法共享存储区,在形式上来说即为方法中的方法调用了存放在运行栈上的局部变量(某种意义上来说感觉像内部类调用栈上的变量),所以需要将局部变量设置为最终变量,但是设置为最终变量后,变量i将失去原有的功能,所以在此处进入一个死循环。
解决方式
错误思路:设置监听的时候就决定该按钮监听方法,在监听方法中,希望传入按钮,对按钮进行操作,即通过传入不同的按钮,来实现不同的方法。
解决思路:在监听方法获取响应的按钮,然后对按钮执行操作。
区别:解决思路中所有的按钮只需要注册同一个监听方法,在方法中判断按钮需要执行的操作,错误思路中将不同的按钮都注册监听,造成了代码的无必要重复。
for(int i=0;i<mBolk.length;i++){ mBolk[i] = new Bolk(); mBolk[i].addActionListener(this); panel.add(mBolk[i]);}public void actionPerformed(ActionEvent event){ Bolk bolk = (Bolk)event.getSource(); if(Game.isSuccess(bolk)){ grade++; }else{ System.out.println(grade); }}
源码地址:https://github.com/cartridge1024/WhiteAndBlack
0 0
- 为按钮数组注册监听
- 为按钮添加监听事件
- 为按钮添加监听事件,监听方法不能用private
- 按钮监听
- 如何为JOPtionPane的showConfirmDialog对话框中的按钮设置监听
- android设置软件按钮为“搜索”,并监听事件
- Android中如何为Fragment中的按钮添加监听事件
- 注册按钮
- 为提交按钮(服务端控件)注册一个处理函数
- Android 程式开发:(十一)监听UI事件 —— 11.2为view注册监听
- JAVA之简单界面设计(布局,更改背景图片,按钮监听 + 数据库登陆注册相关..)
- MathType 6.9B 无法注册,或者注册按钮为灰色的解决方法
- 动态监听注册
- EventListener,监听注册
- 动态注册数据库监听
- oracle监听注册
- Oracle 动态监听注册
- oracle 监听注册分析
- Python入门笔记(5)_ 切片与迭代
- 扑克牌大小
- Codeforces Round #202 (Div. 1) A. Mafia(二分,思路)
- Picasso源码的简单解析(一)
- C+指针开辟堆区内存空间并使用回收
- 为按钮数组注册监听
- [译]依赖反转在Android中的实践
- Zookeeper.NET Client (一)【自己编写客户端 连接实例】
- Android动画Animation
- CSS3 url()语法 绝对路径问题
- C++多重继承
- 2016 Multi-University Training Contest 3 Sqrt Bo
- Spring事务管理
- HDU 5084/BC 15C HeHe