解读 LWUIT 之一:“纠正” Eclipse 编译 LWUIT 源码出错
解读 LWUIT 之一:“纠正” Eclipse 编译 LWUIT 源码出错
Eclipse 编译通过后的 LWUIT 源代码下载
查看源码是一件很惬意的事情:通过阅读源码我们不仅仅可以了解到 JavaDoc 背后的运行机制,而且还可以更好地领会作者的设计思想。正所谓“会开车的人未必会修车;会修车的人一定会开车”。LWUIT 是开放源码的。见到不少朋友要 LWUIT 的源码,说是官网给了 demo 以及二进制文件.jar 的下载链接,就是没有给源码的下载链接。本文介绍了如何使用 Eclipse “下载”LWUIT 的源代码,并针对 Eclipse 编译 LWUIT 源码出错的问题进行了“纠正”,希望可以方便到更多的 LWUIT 爱好者。
当然,仅仅装个 SVN 客户端也可以下载全部 LWUIT 源码,但是对于 Eclipse 程序员来说,直接使用 Eclipse 将 LWUIT 源码 checkout 到自己的工作目录中,即当前 Project Explorer 中,岂不是“一步到位”?
步骤一:将 SVN 插件安装至 Eclipse。
无须安装 SVN 客户端,只需要将 SVN 插件安装到 Eclipse 即可。详细步骤请参考作者另一篇博客《集成 svn 至 eclipse 全过程》。
步骤二:去 LWUIT 官网免费注册一个帐户。
登录官网地址:https://lwuit.dev.java.net,直接点击右上角“注册”即可,比如:
帐户:defonds
密码:123
步骤三:Eclipse 检出 LWUIT 源代码。
Project Explorer 空白处右击鼠标,Import -> Import... -> SVN -> 从 SVN 检出项目,点击“Next” -> 勾选“创建新的资源库位置”,点击“Next” -> URL 输入官网给的服务器地址:https://lwuit.dev.java.net/svn/lwuit/trunk。点击“Next” -> (因为是国外的服务器,要等待几十秒钟)出现 https://lwuit.dev.java.net/svn/lwuit/trunk 服务器下的三个分支 BlackBerry、MIDP、www。单击 MIDP 左侧加号图标将 MIDP 展开,出现 Applications、LWUIT 两个分支,其中 LWUIT 就是我们要检出的项目了,选中 LWUIT ,点击“Next” -> 输入刚才申请的用户名和密码,比如 defonds 和 123,确认,进入“检出为”对话框,选择检出 LWUIT 的方式,作者选择的是“做为新项目检出,并使用新建项目向导进行配置”点击“Finish” -> 弹出“New Project”对话框,选择 J2ME 下的 J2ME Midlet Suite,点击“Next” -> Project name 里随意给新项目取个名,比如“LwuitSrc”点击“Next” -> 点击“Finish” -> “确认覆盖”对话框选择“OK”。
现在开始 SVN 检出,因为是国外的服务器,这个过程可能需要一分钟左右的时间(视网速不同有所差异)。
步骤四:“纠正”LWUIT 源代码。
这个时侯,LWUIT 源代码已经检出到你的工作目录下了,美中不足的是 src 下有两个类 Eclipse 编译不通过,有红叉。红叉出现在 com.sun.lwuit.Form.java 和 com.sun.lwuit.layouts.GroupLayout.java 两个类中,说是 getPreferredSize、setLayout、addComponent 等方法“is defined in an inherited type and an enclosing scope”。难道源码有误?不会吧。解读源码,终于发现问题所在。
com.sun.lwuit.Form 定义了一个内部类:com.sun.lwuit.Form.MenuBar。巧了,Form 和 MenuBar 都继承自 com.sun.lwuit.Container,Form 重写了 Container 的 setLayout 方法(如果仅仅是继承而不重写编译也可以通过的),在 MenuBar 里调用 setLayout 方法,既可以走 Form 改写后的 setLayout 方法,也可以走 MenuBar 继承自 Container 的 setLayout 方法。这是不允许的,于是 Eclipse 不允许这样的代码编译通过。这样说很抽象,读一下下面的源代码,并分别运行一下 Child1 和 Child2 看一下输出结果就明白怎么回事了:
Parent 源代码:
Child1 源代码:
Child2 源代码:
LWUIT 作者的本意应该是调用继承自 Container 的 setLayout 方法,而不是调用 Form 重写的 setLayout 方法,所以我们“纠正”一下源码,在 getPreferredSize、setLayout、addComponent 等方法都加上“this.”。Eclipse 编译通过。
但是,据说在 netbeans 这里是可以编译通过的,作者没有在 netbeans 下尝试。不过作者觉得还是 Eclipse 下的编译比较严谨一些。