解读 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 源代码:

package com.defonds.scope; public class Parent { public void sysHello(){ System.out.println("Parent-sayHello"); } }  
        Child1 源代码:

package com.defonds.scope; public class Child1 extends Parent { public static void main(String[] args){ Child1 child1 = new Child1(); Child1.Inner1 inner1 = child1.new Inner1(); } class Inner1{ public Inner1(){ sysHello(); } } public void sysHello(){ System.out.println("Child1-sayHello"); } }  
        Child2 源代码:

package com.defonds.scope; public class Child2 extends Parent { public static void main(String[] args){ Child2 child2 = new Child2(); Child2.Inner2 inner2 = child2.new Inner2(); } class Inner2 extends Parent{ public Inner2(){ this.sysHello(); } } public void sysHello(){ System.out.println("Child2-sayHello"); } }  
        LWUIT 作者的本意应该是调用继承自 Container 的 setLayout 方法,而不是调用 Form 重写的 setLayout 方法,所以我们“纠正”一下源码,在 getPreferredSize、setLayout、addComponent 等方法都加上“this.”。Eclipse 编译通过。
        但是,据说在 netbeans 这里是可以编译通过的,作者没有在 netbeans 下尝试。不过作者觉得还是 Eclipse 下的编译比较严谨一些。

你可能感兴趣的:(eclipse,SVN,服务器,Class,Netbeans,j2me)