Sean's blog home

大胃的blog - When the going gets tough, the tough gets going.

用户操作
[即时聊天] [发私信] [加为好友]
高宇翔ID:sean_gao
106870次访问,排名839好友0人,关注者0
sean_gao的文章
原创 70 篇
翻译 2 篇
转载 0 篇
评论 283 篇
大胃的公告

  • 所有文章和代码在这里以"现状"提供,作者不提供任何形式的担保,也没有授予除阅读和有条件共享之外的任何权利。除非特别说明,所有文章均为本blog作者原创,如需转载请注明出处和原作者,如用于商业目的,需作者本人书面许可。

  • 作者的联系E-mail:
  • gaoyuxiang@gmail.com

  • [推荐镜像]
  • Java:
  • http://www.blogjava.net/sean/
  • .NET:
  • http://www.cnblogs.com/sean/

  • [近期推荐文章]
  • J2SE(TM)5.0专题之语言特性

最近评论
hdnero:wow power leveling
hkmgjsf:如果说到“对计算机和编程有着天生的热爱”,我算是第一类吧。说真的,我很注重自己的代码。
不过,说到“技术功底扎实”我这个不是计算机专业毕业的人,可能连第三类都及不上了。(CSDN的检验码也应该换一下了吧?输入最起码也有四十次了,每次都提示检验码无效)
eclipsef:eclipse插件站点。http://www.eclipsepowered.net
风中过客:Eclipse不错,但是耗资源有点吓人150-160的内存。256跑起来有点。。。。。。
allen:我个人认为jb是最好的ide,可惜收费
eclipse和netbeans各有优劣,不过现在eclipse占上风
文章分类
收藏
    相册
    Favorite blogs
    Craig's stack trace(RSS)
    jackei 的专栏(RSS)
    Li Jianzhong@Blog(RSS)
    Ninputer - 装配中的脑袋(RSS)
    Open Java Project(RSS)
    孟岩(RSS)
    老康的Java(RSS)
    Friends' blogs
    emu的专栏(RSS)
    kukoo的blog(RSS)
    Java-related links
    apache.org
    Jakarta Project
    java.net
    Javalobby
    SourceForge
    Sun Java Home
    The Eclipse Project
    TSS.com
    Other shortcuts of mine
    CSDN forum
    CSDN Home
    Gmail
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 [Eclipse笔记]在SWT中有效的管理图形系统资源收藏

    新一篇: [Eclipse笔记]Eclipse项目3.1开发目标和进度 | 旧一篇: [Eclipse笔记]SWT设计思路


    本文部分内容和灵感来自eclipse.org网站,特此声明。更多内容,请参考:

    http://eclipse.org/articles/Article-SWT-Design-2/SWT-Design-2.html

     

    由于SWT直接跟操作系统打交道,所以我们需要在处理系统的图形资源时格外小心,以免不必要的资源泄漏。所幸SWT提供了很好的资源管理机制,我们绝大多数情况下需要做的只是确保两条原则:

    第一条原则 谁分配谁销毁

    第二条原则 父控件销毁的同时销毁子控件

     

    下面我们分别来看一看这两条在实际中是如何体现的。

    先看第一条原则。乍一看这似乎是废话,但是在实际中往往并非那么简单。首先,构造方法不等于分配资源,实际上分配资源可以发生在一个类中的任何地方以及一个对象生命周期的任何时候,只要你的代码告诉操作系统这样做。你必须保证所有由你分配的资源当你不再使用时调用其dispose()方法;同时你也必须保证所有不是由你分配的资源不要随便调用其dispose()方法,否则很可能会影响到实际分配的那段相关代码的正常工作。好消息是,为了明确和简化这第一条原则所规定的分工,SWT在设计之初就确定下来,所有基于系统资源的SWT类都在其构造方法中完成所有所需的资源分配,在其他方法中则没有任何分配系统资源的动作,所以我们可以幸运的这样看待SWT的资源管理:如果你调用了某个SWT类的构造方法,那么就由你来调用其dispose()方法释放资源;如果你没有调用某个SWT类的构造方法,即便你使用了这个类的实例,也不应该由你来调用其dispose()方法。就是这么明确。

    比方讲,你new了一个Font对象,那么当你不再需要它时,就应该调用dispose();如果你通过某个控件的getFont()方法取得一个Font对象并使用后,你不应该去销毁它,而应该交给那个具体的控件去处理。

    对于第二条原则,SWT有一个很好的机制去支持它,那就是,所有的SWT控件,具体讲,Composite类及其子类的实例,都必须有一个父控件,这个父控件的引用在子控件的构造方法中被传入。需要注意的是,所有这些控件的不带参数的构造方法都只有默认访问级别,于是我们不能在自己的SWT程序中直接调用这样的默认构造方法而只能提供一个父控件的引用,而在Widget类(Composit的父类)的带参数构造方法中,它会调用如下方法:

    void checkParent (Widget parent) {
           
    if (parent == null) error (SWT.ERROR_NULL_ARGUMENT);
           parent.checkWidget ();
    }

    进而:

    protected void checkWidget () {
           Display display 
    = this.display;
           
    if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
           
    if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
           
    if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
    }

    这样的检查保证了任何控件在创建时都有父控件。当我们调用某个Compositedispose()方法时,它会调用:

    void releaseChildren () {
           Control [] children 
    = _getChildren ();
           
    for (int i=0; i<children.length; i++{
                  Control child 
    = children [i];
                  
    if (!child.isDisposed ()) child.releaseResources ();
           }

    }

    其中的_getChildren()方法通过OS对象的方法遍历控件的子控件,然后汇总到一起分别调用releaseResources()方法释放控件和句柄。

    回到上次的SimplestSWT的例子:


    package sean.test.swt;

    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;

    public class SimplestSWT {

        
    public static void main(String[] args) {
            Display display 
    = new Display();
            Shell shell 
    = new Shell(display);
            shell.pack();
            shell.open();
            
    while (!shell.isDisposed()) {
                
    if (!display.readAndDispatch()) {
                    display.sleep();
                }

            }

            display.dispose();
        }


    }

     

    这当中,Display是一个顶层的设备,它继承自Device类,而Device类实现了Drawable接口。Shell的父类是Decoration,而Decoration继承自CanvasCanvas继承自Composite,最终这条继承链一直连到Widget类。我们在创建Shell示例的时候,需要告诉构造方法它的父控件是什么,在这里就是display。于是当我们最后调用display.dispose()时,虽然我们没有明确写shell.dispose(),我们的Shell实例也随之销毁了。

    这就是SWT的资源管理机制,稍有例外的是MenuItemsetMenu()方法和ControlsetMenu()方法,它们通过显式调用setMenu的方式注册自己的父控件。

     


    发表于 @ 2005年03月20日 17:19:00|评论(loading...)|编辑

    新一篇: [Eclipse笔记]Eclipse项目3.1开发目标和进度 | 旧一篇: [Eclipse笔记]SWT设计思路

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 大胃