MIDP Command TextField TextBox Form代码分析

来源:互联网 发布:vb按钮按键样式设置 编辑:程序博客网 时间:2024/05/16 23:50

  在高级UI(比如Form或者List)上添加多个Command,在模拟器上和实际设备上的效果不同。TextField的输入效果,在模拟器和实际设备上也不同。它们为什么会有这种差异?能否实现一个控件,通过调用某个本地方法,实现TextField类似的效果?我要实现一个弹出的command List,能否参照MIDP的代码?带着这些疑问,我阅读了MIDP的相关代码。

    command相关的有二个疑问:    

    1.command是怎么绘制的?

    2.command是怎么响应的?

   TextField相关的也有一个疑问;

    1.TextField调用哪个本地方法,进入输入界面?

    2. 在本地输入的字符串如何传回来?

 

问题一:command是怎么绘制的?怎么响应的?

在之前的文章中,有分析过J2ME中高级UI的绘制。Form、List等继承自Screen,Screen和Canvas继承自Displayable,Displayable中实现了一个方法叫callpaint;Canvas重载了callpaint,在做了简单的坐标运算后,调用paint方法,而paint,由继承者实现。Form也重载了callpaint,在计算了坐标后,会遍历每个Item,调用Item的callPaint方法,继承自Item的TextField就重载了callPaint方法。

要搞清楚command是在哪里绘制的,首先要清楚它是在哪里被添加的。Displayable提供了addCommand的方法,我在Displayable中也发现了一个Command的数组用来存储添加的command。但是,在Displayable的callpaint方法中没有找到绘制command的部分,它提供了getCommands的方法,但是,在调用这个方法的地方也没有找到绘制的代码。它是在哪里被绘制的呢?

在Displayable.addcommand的实现中,调用了一个方法:updateCommandSet;

这个方法通过调用Display.updateCommandSet最终调用了一个本地方法:

 

public native void updateCommandSet(Command[] itemCommands, 

int numItemCommands,

Command[] commands, int numCommands);

这个方法将Command数组传给了本地,这让我怀疑command list的绘制是在本地绘制的!

 

 

在DefaultEventHandler中,有一个本地方法paintMenu,看起来很像。

如果就是这个方法,应该是这样一种逻辑:

在每次addCommand后,MIDP调用本地方法将command list传递给本地实现,在特殊的按键(一般是左右软键)发生后,本地实现会检查command list,如果有list,就发送一个command事件给MIDP,这个事件有两个值,一个值标识这是一个command type;另一个值标识这是一个MENU_REQUESTED;当MIDP收到这个事件后,就会暂停显示,进入menu模式,并调用本地方法paintMenu,显示这个menu list;在menu模式下,输入的信息都不会在MIDP处理;当选择某个command后,本地会再发送一个command事件给MIDP,这个事件有两个值,一个值标识这是一个command type;另一个值标识这个command的id;收到这个事件后,MIDP会推出menu模式,并调用相应的commandAction方法。

 

为了验证这个猜测,写了一个简单的Canvas,添加多个command,并重载了keypressed方法。当进入command list时,按某个key,发现keyPressed不会被调用。在实际设备上的测试结果验证了这个猜测。并发现Sun WTK在运行该测试程序时,出现了一个Bug。

 

DefaultEventHandler中还对KEY_EVENT、PEN_EVENT、SYSTEM_EVENT有类似的处理。

 

问题二:TextField调用了哪个本地方法?本地输入的字符串如何传回来?

在DefaultEventHandler中,对KEY_EVENT的处理由方法keyEvent完成。keyEvent有三个参数,type,str,code;

type标识这是KEY_EVENT的具体类型,code记录KEY_CODE,str记录了一个字符串。

对于普通的KEY TYPE,用参数key code;对于IME TYPE,用参数str。这个方法最终调用了Display.inputMethodEvent,最终将字符串传给了当前的TextField。这就是本地输入字符串传递的流程。

我在MIDP的code中没有找到TextField调用本地方法的代码。在TextField的构建中,获取了InputMethodHandler的引用:

 

 inputHandler = InputMethodHandler.getInputMethodHandler();

            inputClient  = new InputMethodClientImpl();

这个类的实现与平台是相关的,它从配置中读取信息:
String n = Configuration.getProperty(
                    "com.sun.midp.lcdui.inputMethodHandler");

 

默认的类是DefaultInputMethodHandler;在现有的平台上,我没有得到这个配置信息;手头的MIDP代码是参考代码,我想这是我没有找到本地方法的缘故。

TextField的实现,依然是有价值的。至少可以参照它实现自己的TextField,实现英文和数字的输入法。

 

另一个结论是,不能使用TextField类似的流程来封装输入控件,除非可以添加本地方法并修改MIDP的代码。

 

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家长诬陷老师打她家孩子耳光怎么办 一岁宝宝总觉得有痰怎么办 一岁宝宝感冒咳嗽有痰怎么办 哭的时候踹不过气来应该怎么办 孩子在幼儿园被老师罚站怎么办 孩子屁股打肿了又红又紫怎么办 生完孩子两个月一直浑身疼怎么办 宝宝被蚊子叮咬后红肿硬怎么办 小孩屁股青一块紫一块打的怎么办 小孩的手被鞭子抽红了怎么办 孩子每次写作业都要挨打挨骂怎么办 儿子四岁脾气特别大怎么办呢 月子里屁股被开水烫了怎么办 学生打闹家长只找老师责任怎么办 两个学生打闹受伤的孩子家长怎么办 小孩学习不好做家长的该怎么办 对学习不入门的小孩家长该怎么办 孩子老做作业发神上课不专心怎么办 儿子成绩考得差不专心未来怎么办 五年级学生写字慢又丑怎么办 宝宝上课坐不住不听老师话怎么办 三岁宝宝特调皮打他还还手怎么办 怀孕40天不知道喝酒了怎么办 怀孕四十天的时候喝酒抽烟了怎么办 宝宝怀孕三十天左右喝酒了怎么办 两个人都喝酒了意外怀孕怎么办 不知道自己怀孕了喝了很多酒怎么办 不知道自己怀孕了喝了一次酒怎么办 我儿子11岁了有多动症怎么办 面对老师的冷暴力家长该怎么办? 面对无德的老师家长该怎么办 如果你家长屏蔽老师老师该怎么办 小孩出完水痘后身上出现疱疹怎么办 脑子里兴奋的头疼怎么办 吃什么药 一个月宝宝异常兴奋不睡觉怎么办 四个月宝宝晚上兴奋不睡觉怎么办 20个月宝宝半夜惊醒哭闹怎么办 小孩吃了氨茶碱兴奋不睡觉怎么办 孩子在学校被同学撞鼻骨折怎么办 孩子在学校无意致使同学受伤怎么办 9个月的宝宝吃坏东西腹泻怎么办