`
*冬眠*
  • 浏览: 952 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

胡言乱语之LWUIT的UI组件代码结构浅析

阅读更多

转:http://www.dongmian.org/2010/02/01/胡言乱语之lwuit的ui组件代码结构浅析/

 

LWUIT: https://lwuit.dev.java.net/ LWUIT是一个轻量级JavaME UI工具包。主要的特性包括:类似Swing 的MVC架构,支持多种布局(Layouts),皮肤更换,字体,触摸屏,动画效果,Rich控件,3D集成,Painter,模式对画 框,I18N/L10N等。值得一提的是LWUIT是sun公司主推的一个图形库,在wtk3.0中已经算是内置的库了。

LWUIT中的组件都在com.sun.lwuit这个包下,所有的组件都是要继承Component这个类,这里Component使用了composite 的设计模式

为了更形象得了解LWUIT的组件体系。可以看下面的UI组件的关系图。

component的继承图图一:Component的继承关系

从图一可以看出,Component分为五大类,分别是

1、Container

2、Label

3、List

4、MediaComponent

5、TextArea

Container与其它的四类组件的不同在于它可以存放子节点,其代码可以下面的方法

Container对子组件操作的方法


void  addComponent (Object constraints, Component cmp)
void  addComponent (int index, Object constraints, Component cmp)
void  addComponent (int index, Component cmp)
void  replaceAndWait (final Component current, final Component next, final Transition t)
void  replace (final Component current, final Component next, final Transition t)
void  removeComponent (Component cmp)
void  flushReplace ()
void  removeAll ()

那么每个组件的paint方法又在做什么了?

首先看Container这个类,Container的意思是容器,它的paint方法是对它所包含的每个Componet都有去调paintInternal方法。代码如下:

 component的paint方法 

    public void paint(Graphics g) {
        layoutContainer();
        g.translate(getX(), getY());
        int size = components.size();
        for (int i = 0; i < size; i++) {
            Component cmp = (Component)components.elementAt(i);
            cmp.paintInternal(g, false);
        }
        g.translate(-getX(), -getY());
    } 

paintInternal方法中有分有scrollbar和没有scrollbar两种,代码如下:

 component的paintInternal方法 

     final void paintInternal(Graphics g, boolean paintIntersects) {
        if (!isVisible()) {
            return;
        }
        int oX = g.getClipX();
        int oY = g.getClipY();
        int oWidth = g.getClipWidth();
        int oHeight = g.getClipHeight();
        if (bounds.intersects(oX, oY, oWidth, oHeight)) {
            g.clipRect(getX(), getY(), getWidth(), getHeight());
            paintBackground(g);
            //是否绘制scrollbar
            if (isScrollable()) {
                int scrollX = getScrollX();
                int scrollY = getScrollY();
                g.translate(-scrollX, -scrollY);
                //注意paint函数的调用 

                  paint(g);
                g.translate(scrollX, scrollY);
                if (isScrollVisible) {
                    paintScrollbars(g);
                }
            } else {
                paint(g);
            }
            if (isBorderPainted()) {
                paintBorder(g);
            }

            //paint all the intersecting Components above the Component
            if (paintIntersects && parent != null) {
                paintIntersectingComponentsAbove(g);
            }

            g.setClip(oX, oY, oWidth, oHeight);
        }
    }

这里要注意的paint的方法,根据多态性,它会去调用各个Component的真正方法.

Container下的子类都会去调用Compaint的paint方法,而Label的子类,除了Spinner外,paint方法都会去调用类似下面的方法

 Label子类的paint方法 

 UIManager.getInstance().getLookAndFeel().drawXXXX(g); 

这里面的drawXXXX代表是对应的组件名,比如说CheckBox,那它调用方法就是

 CheckBox的paint方法

 UIManager.getInstance().getLookAndFeel().drawCheckBox(g, this); 

RadioButton的调用就为

 CheckBox的paint方法 UIManager.getInstance().getLookAndFeel().drawRadioButton(g, this); 

从这的代码就引出了UIManager这个类,UIManager这个类的作用是为了移植而进行的封装的,使用单例模式,

在UIManager这个类中要注意的方法有两个:

 UIManager的关键方法   /**

     * Returns the currently installed look and feel
     *
     * @return the currently installed look and feel
     */
    public LookAndFeel getLookAndFeel(){
        return current;
    }

    /**
     * Sets the currently installed look and feel
     *
     * @param plaf the look and feel for the application
     */
    public void setLookAndFeel(LookAndFeel plaf){
        current.uninstall();
        current = plaf;
    }

这两个方法就是对组件Render的关键,如果我们想自己实现一套组件的表现,那么我们只要实现一个LookAndFeel的子类,然后对通过setLookAndFeel把它传给UIManager,这种做法也是高度封装的。

在UIManager中,默认的LookAndFeel是DefaultLookAndFeel这个类,这也是组件默认的表现方法。

通过上面的分析,这里使用了单例的设计模式和proxy的设计模式,具体流程为:

1、UIManager在程序初始化之前会根据不同的平台去调用不同的LookAndFeel的实例,而各个平台的LookAndFeel类里面实现各种UI组件的绘制方法。这时使用proxy设计模式。2、各种UI组件只要去调UIManager的对应的draw方法就可以了,这时使用的是单例的设计模式。

也就是下图

LWUIT的控件调用过程

如果一个软件为了可移植性,那么可以参考一下这种实现方法,当然可移植性还有很多方式来实现,如果有更好的方式欢迎发邮件议论,我的邮箱是:联系方式

附:从SVN中直接签出的LWUIT代码是适合netbeans的,但是如果使用Eclipse打开LWUIT的代码会出如下错误提示:

The method  方法名 is defined in an inherited type and an enclosing scope

这时只要在出错的代码前加一个“this.”就可以了。例如Form.java中的MenuBar()构造函数中

setLayout(new GridLayout(1, 3));


就会报“defined in an inherited type and an enclosing scope” 异常,只要把代码改成如下就不会报错了。红色部分是后面要添加的

 

this.setLayout(new GridLayout(1, 3));

一些名词定义

Singleton pattern(单例模式): http://en.wikipedia.org/wiki/Singleton_pattern

Composite pattern: http://en.wikipedia.org/wiki/Composite_pattern

Proxy pattern(代理模式): http://en.wikipedia.org/wiki/Proxy_pattern

 

 

分享到:
评论

相关推荐

    LWUIT最新源代码

    Sun发布了LWUIT(Light-Weight UI Toolkit)的源代码。项目主页访问:LWUIT。 The Lightweight UI Toolkit (LWUIT) 是一个轻量级JavaME UI工具包。LWUIT类似Swing 的MVC架构, 支持多种布局(Layouts), 皮肤更换, ...

    轻量级UI框架LWUIT最新源代码

    著名的LWUIT的最新源代码,比发布的lib要新,修复了很多BUG,本来subversion上面有得下载,这里我打包一下下来,方便没有subversion或不愿装的同志。

    lwuit最新源代码

    lwuit最新源代码,包含table和tree,最新的lwuit已经支持了

    j2me ui lwuit 1.3

    j2me ui lwuit 1.3 j2me UI库

    J2ME+UI框架LWUIT开发手册

    LWUIT J2ME UI框架 开发手册 LWUIT J2ME UI框架 开发手册

    LWUIT1.4 最新源代码

    sun.COM 开发的LWUIT ui 工具包 1.4版本 SVN-1184 同步保持更新,敬请关注

    LWUIT j2me UI例子

    制作漂亮的UI例子,九宫图 UIManager例子

    lwuit.rar_J2ME ui_LWUIT_j2me

    LWUIT实现了MVC架构,是J2ME程序中UI设计的一个JAR包。该文档是LWUIT帮助文档的CHM版

    J2me 轻量级UI控件-lwuit1.2.1

    LWUIT是属于sun为J2ME提供的一轻量级UI组件,拥有绚丽的动态效果。在我看来还是过于臃肿了,整个jar包接近400K,更不要说加上主题资源文件了。

    lwuit.jar JavaME UI工具包

    LWUIT是一个轻量级JavaME UI工具包。主要的特性包括:类似Swing 的MVC架构,支持多种布局(Layouts),皮肤更换,字体,触摸屏,动画效果,Rich控件,3D集成,Painter,模式对画框,I18N/L10N等

    LwuitAndroid:J2ME时代著名的Lwuit UI库到Android的实现

    安卓J2ME时代著名的Lwuit UI库到Android的实现这是 android 的 LWUIT 库端口。 Lwuit 是根据移动设备的 java swing 建模的。 它支持许多 UI 小部件,这些小部件可以通过使用主题构建器创建主题来进行不同的皮肤处理...

    LWUIT的最新源代码(官方的LWUIT.jar反编译)

    在网上找了很久源代码,基本上都是缺胳膊少腿的,svn上1.3版的代码还处于测试阶段...官方的只通了LWUIT.jar和Demo的下载,没有源代码,我把这个LWUIT.jar反编译了一下,把反编译过后产生的错误修改好了,已经可以用了。

    LWUIT.zip_3D UI_LWUIT_i18n_java 3d_new J2ME java

    Sung公司推出的LWUIT文档,J2ME新的UI控件LWUIT。LWUIT是一个轻量级JavaME UI工具包。主要的特性包括:类似Swing 的MVC架构,支持多种布局(Layouts),皮肤更换,字体,触摸屏,动画效果,Rich控件,3D集成,...

    LWUIT_3_1英文原版.part1

    The Lightweight UI Toolkit (LWUIT) 是一个轻量级JavaME UI工具包。LWUIT类似Swing 的MVC架构, 支持多种布局(Layouts), 皮肤更换, 字体, 触摸屏, 动画效果, Rich控件, 3D集成, Painter, 模式对画框, I18N/L10N等...

    JavaME 轻量级开发框架 LWUIT 源代码

    截至 20100210,官方公布的最新 LWUIT 源代码。

    LWUIT.jar LWUIT.jar

    LWUIT.jarLWUIT.jarLWUIT.jarLWUIT.jarLWUIT.jarLWUIT.jar

    lwuit 源代码 下载

    lwuit 源码 下载后把此源码放在src 中即可。 然后自习写程序 调用这些 就类就可以了。 顺便赚的资源分

    最新LWUIT_1_5

    LWUIT哦,最新的包,学习学习。非常好用哦

    The Lightweight UI Toolkit (LWUIT) 1.3 part2

    轻量级JavaME UI工具包 LWUIT 1.3版

    The Lightweight UI Toolkit (LWUIT) 1.3 part1

    轻量级JavaME UI工具包 LWUIT 1.3版

Global site tag (gtag.js) - Google Analytics