-
-11 9
-
刚刚完成一个程序,由于里面用到时间的,所以我采用了J2ME的DateField组件,这个组件主要是显示时间,以及进行时间的调整的,其中我用到了 getDate()方法,以及Form中的insert(int i,Item)方法,就是在这两个方法中我遇到了问题,第一个问题我遇到的是:在两个Form中我都要用到时间的显示,因此我就打算在两个Form中都使用同一个DateField组件,结果出错了,显示为illegalStateException,后来我看了一下MIDP的文档,才找到,原来一个组件是不能够放在不同的Container中的,如果放在不同的容器中就会发生这样的错误,不光是DataField,包括所有的Item的子类都是不能够这样子的。 因此一定要注意,看来组件是不能够在不同的Form中共享的了?当然不是,组件可以放在不同的容器内了,只不过是每次只能够放在一个容器之中,也就是说一个Item可以看作是一个人,而一个Form呢就相当于房间了。如果我们说某Item现在在A房间里,那他肯定不可能在同时在B房间,如果你非要将它放在两个房间里的话,那只有将它切成两半了,那自然就会发生异常了。但如果你让他从A 房间里出来,然后再进到B房间里,那就没问题了。显示在程序上就是采用Form的delete(int itemNum)方法,或者是deleteAll()将他从一个Form中删除掉,再用append()或者是Insert()方法将其添加到另外一个 Form中了。
再说一下我遇到的DateField问题,因为要从DataField里取时间,所以就用了他的getDate()方法,但是一直得到null型的返回值,这让我很困惑,于是就再去查文档,果然,就在class 描述里, 我看到解释,如果没有设置,DateField里调用getDate()时会返回null,也就是说,new DateField()之后,你虽然建立了这个组件,你也可以对这个组件进行各种操作,一切都是正常的,例如你可以显示时间,选择时间或者是调节时间,这些都没有问题,但是一旦你要在内部调用getDate(),你实现并没有得到时间,得到的只是null值。而如果你在显示DataField之后有过一些操作,那你就会得到设置好的时间了,而不去操作,则会返回null。如果你在函数内部没有调用setDate(Date date)方法,就会出现,当你的用户使用的时侯,如果他调整过时间,那就一切正常,而如果他没有动过DateField组件,而直接进行了其他操作,如果你需要用到从DateField里取时间,你就会得到null的异常。这样的错误在测试时很难发现,因为如果没有读过J2ME带的文档的话,你很找到为什么会这样。或者是你就根本没有测试到这个问题。
今天很幸运,这两个问题都让我遇到了,虽然这两个问题都可以在J2ME里查到,第一个问题还好说,如果你是静态的将同一个Item插入到不同的Form里时,编译器就会报错,但如果你是在调用中动态的将Item放到不止一个Form里的时候,只有在运行时才会出错,而第二个问题就比较严重了,估计许多人都象我一样想当然的认为如果DateField没有做过任何调整,应该是返回系统时间才对,而且这个问题在测试的时候会发生你没有测试到的情况,这样的问题如果埋藏到系统里面,那就会很难发现,也许已经交付产品了, 用户在使用时才会发现。对于第二个问题我个人觉得DateField这个类如果能够提供一个初始值比较好一点,不过我们不能够去改动类库,只有自己注意了。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
- 评论(0)
发表评论 TrackBack