﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-乐在其中</title><link>http://www.blogjava.net/charles/</link><description>以JEE为主攻，以Flex为点缀，以Eclipse RCP为乐趣&lt;br/&gt;
请访问&lt;a href='http://www.inframesh.org'&gt;http://www.inframesh.org&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 11:42:41 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 11:42:41 GMT</pubDate><ttl>60</ttl><item><title>Flex组件生命周期</title><link>http://www.blogjava.net/charles/archive/2009/07/05/285578.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Sun, 05 Jul 2009 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/07/05/285578.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/285578.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/07/05/285578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/285578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/285578.html</trackback:ping><description><![CDATA[<h4>Flex组件生命周期大概可以分为3步：</h4> <h6>1. Intiliazition</h6> <h6> <li>Construction </h6> <p>Construction是组件构造阶段，组件的构造器不能有必须的参数。在构造函数中可以添加事件监听器，初始化属性。这个阶段只做很少的事情。 <h6> <li>Configuration </h6> <p>Configuration是组件的配置阶段，组件的属性，事件回调函数，样式和效果定义都在这个阶段完成。你不应该把这些任务推迟到Attachment和Initlization阶段之后。 <h6> <li>Attachment </h6> <p>Attachment阶段是把该组件追加到显示列表当中，一个Flex组件会被一个Flex容器IContianer以addChild方法添加到显示列表当中。 <h6> <li>Initlization </h6> <p>在Initlization初始化阶段，组件会执行一次完整的invalidation/validation周期。这个阶段做的工作流程是： <ul> <li>发出preinitialize事件。  <li>执行方法createChildren()  <li>发出initialize事件。  <li>行一次完整的invalidation/validation周期。  <li>发出creationComplete事件。 </li></ul> <h6>2. Updating</h6> <p>用户可能会与组件产生交互，组件的位置大小可能改变，样式可能被重新赋值，也可能获得焦点或者被禁用等等。这些情况的发生都用影响到组件外观的变化。所以组件需要重绘自身来响应这些变化。 <h6> <li>Invalidation </h6> <p>如果一个组件的属性改变，它可能就会标记组件为失效状态。 <h6> <li>Validation </h6> <p>一个组件被标记失效后，会验证是否需要更新组件，如果需要会调用相关的方法来更新。组件有三个极其重要的方法来更新自己： <ul> <li>commitProperties()  <li>measure()  <li>updateDisplayList(unscaledWidth,unscaledHeight) </li></ul> <p>除了这三个方法，还有一个重要的方法是styleChanged(styleName)，当某个样式改变时，styleChanged被调用，然后执行Invalidation标记组件。如果你有自定义一个组件，有一些法则必要得遵守： <p>不要在子类中显式调用commitProperties，measure和updateDisplayList这三个方法，你要做的是override，而不是call。如果你添加了新的样式，同样是要继承styleChanged方法，加入自己的逻辑。 <h6>3. Destruction</h6> <h6> <li>Detachment </h6> <p>当不需要这个组件时，把它从显示列表中移出。把组件从一个容器中移出再添加到另一个容器中比创建新的组件有更小的开销。 <h6> <li>Garbage Collection </h6> <p>如果组件不再被引用时，它就成为符合垃圾回收的对象了，所以垃圾回收的第一条准则是不再有活动的引用。<br>更加值得注意的是第二条准则，即不包含使用了强引用的事件监听器，Dictionary和Timer。<br>所以尽量使用弱引用是多么重要，但是同样，小心你的弱引用在不该回收的时刻被回收了。例如对函数中的临时变量使用弱引用，你可能得不到你想要的异步结果。</p></li><img src ="http://www.blogjava.net/charles/aggbug/285578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-07-05 19:28 <a href="http://www.blogjava.net/charles/archive/2009/07/05/285578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>What Tamarin really means ?(zz)</title><link>http://www.blogjava.net/charles/archive/2009/07/01/285012.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 01 Jul 2009 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/07/01/285012.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/285012.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/07/01/285012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/285012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/285012.html</trackback:ping><description><![CDATA[<p>Adobe 开放 AVM2 source 加入 Tamarin 计画的新闻已经出来两天，在各大forum与blogs里都引起热烈讨论，毕竟能让 javascrīpt 跑的比现在快 10倍，确实是件大事啊。 <p>但很有趣的是虽然官方已提供了详细的 FAQ 回答常见的问题，但仍然有许多误解存在，也因此我特别针对这些问题请教了 Gordon Smith (from Adobe Flex team) 两人一阵 email 往返后，大概已得出最佳化的答案，下面我试者将学到的资讯整理出来。 <p>＊Actionscrīpt 3 与 Javascrīpt 2 的差别 <p>AS3 与 JS2 都是依循 Ecmacript 4 规格所实作出来的语言，它们的 core language 是完全一样的。 <p>Core language 包含: sealed classes, interfaces, namespaces, method closures, exceptions, strong typing, E4X 等，所以像 Array, String, int 等也都包含在内。 <p>但在 core language 之上，就会依它执行的环境不同，而加上不同的 extension。 <p>AS3: 在 <a href="http://www.51js.com/"><u><strong>flash</strong></u></a> player 里执行，因此会加上 flash所需的 DOM (Document Object Model) 例如 Sprite, MovieClip, Socket等。 <p>JS2: 在 Browser 里执行，就会加上 Browser 相关的 DOM, 例如 Document, Form等。 <p>＊Tamarin 是什么？ <p>Tamarin 是由 AVM2 延伸而来，它只负责执行 Ecmacript 4 core language 的部份。 <p>因此 Mozilla Foundation 拿到 Tamarin engine 后，第一件要做的事就是在上面实作 Browser 相关的 DOM，例如 Form 要怎么生成、Document 物件要如何存取。 <p>Adobe 要做的事则是在上面实作 Flash 相关的 DOM, 例如 Sprite 要如何画出来？Video 要怎么串流与播放？Audio 的载入与音量控制等。(很显然的，这部份工作已经做完，不然你手上的 flash player 9 是打那儿来的？) <p>＊Adobe 与 Tamarin 往后的关系 <p>如果日后，Mozilla 的 developer community 针对 Tamarin 做了某些最佳化，例如有神童出现把 E4X 的执行效率提高了100倍(例如他写了一个 routine/library 可以让 xml 的 processing time 缩短为原本的1/100)，这些改变一旦被加入 Tamarin 的 codebase，Adobe 也就可以共享成果。 <p>因此每当 Tamarin 有重大升级或改版时，Flash Player 就可能也跟者推出新版，因为它内部的 core language scrīpt engine 也需要升级才能整合 Tamarin 的改变。 <p>＊这代表 Adobe 也将 Flash Player open source了吗？ <p>不。 <p>Flash Player = Tamarin + Flash-specific DOM <p>而这次开放出去的只有核心的 Tamarin engine，因此跟 open source flash player 完全没关系。 <p>实际上做为一个 universal platform，最好也不要有太多的 branch/fork，所以在可见的将来也不太可能见到官方做这件事。 <p>＊将来 Firefox 不再需要 flash player 了吗？ <p>不，从上面可知，Firefox + Tamarin 只是取得了一个快速的 Ecmascrīpt 4 core language engine, 但它并没有内含 flash DOM，所以用 Flash 开发的程式(swf)还是要乖乖在 flash player 里跑。 <p>不然，adobe 还投入人力开发 64bit 与 linux player，难不成是做心酸的吗？ <p>＊Tamarin 可以用在其它地方吗？ <p>可以。 <p>以 Dreamweaver 为例，它有内建 javascrīpt engine，可以让user写一些巨集之类的指令，自动化做某些事。 <p>目前它是用 javascrīpt 1.5 语法，底层则是内建了 SpiderMonkey engine，然后在这之上，加入了 Dreamweaver 独有的 DOM, 例如 MenuCommand, EditorWindow，让user可以用 js1.5 去控制 Dreamweaver 的某些行为。 <p>将来，Dreamweaver 可以选择改用 Tamarin 取代掉 SpiderMonkey 做为内建的 scrīpt engine, 这样user就可以写 OO 式的 JS2 巨集。 <p>这就是一个不同的应用实例，而实际上 Fireworks, Flash, Acrobat 等也都有这样的能力，知名的 Red5 目前用 Rhino 将来也可以考虑改用 Tamarin，毕竟有个10倍速的免钱 scrīpt engine，何乐不为呢？ <p>＊Tamarin 对 Flex developer 的影响 <p>这部份就很有趣，简单来说，影响都是正面的，只是要把时间放长来看，正面的效应大概要一到两年后才会出现，但最多三年(2009)后就可以看出这步棋下的完全正确，而且可能是决定性的一步。<br>以上文字来自：<a href="http://ria.richtechmedia.com/">http://ria.richtechmedia.com/</a></p><img src ="http://www.blogjava.net/charles/aggbug/285012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-07-01 19:41 <a href="http://www.blogjava.net/charles/archive/2009/07/01/285012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简记V8与SquirrleFish/Tamarin的对比点(zz)</title><link>http://www.blogjava.net/charles/archive/2009/07/01/285011.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 01 Jul 2009 11:38:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/07/01/285011.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/285011.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/07/01/285011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/285011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/285011.html</trackback:ping><description><![CDATA[<h5><a href="http://rednaxelafx.javaeye.com/blog/236291">简记V8与SquirrleFish/Tamarin的对比点</a></h5> <p>刚才还是忍不住到V8的官网读了些文档，想看看到底它的技术特点是什么。 <br>V8官网：<a href="http://code.google.com/p/v8/">Google V8 JavaScript Engine</a><br>设计概念的文档：<a href="http://code.google.com/apis/v8/design.html">Design Elements</a><br>有人初试V8的经过：<a href="http://d.hatena.ne.jp/amachang/20080903/1220405193">http://d.hatena.ne.jp/amachang/20080903/1220405193</a><br>V8是BSD许可证的，比较自由，方便用在各种项目中。 <br>它是一个相当快的JavaScript实现。根据其设计概念的文档，它的高性能主要来自：  <ul> <li>快速的属性访问  <li>动态机器码生成  <li>高效的垃圾收集</li></ul>其中前两点应该是紧密相关联的。在JavaScript引擎的实现中，V8特别就特别在“隐藏类”（hidden class）的使用。Hidden class的概念可以到那篇文档去看，解释得比较生动。简单来说，对于某个对象，每次属性的数量（或类型？这个得回头仔细研究下）发生改变时，虚拟机就会新创建一个对应的隐藏类，记录下其中各个属性的相对偏移量，并将原本的隐藏类与新的隐藏类之间建立一个关联。当再次有同一类型的对象创建时则不会重复创建隐藏类，而能复用前面已经出现的隐藏类。 <br>其它JavaScript引擎（以及许多其它脚本语言的实现）一般使用某种形式的关联容器来储存所有变量；通常叫字典，也会被称为映射表或者关联数组，典型的实现方式是哈希表或者红黑树等。对象中的成员变量（下面将称为“属性”）一般也是这样与某个对象关联在一起的。访问某个对象的某个属性时就需要动态查询这样的关联容器，是不可忽视的开销。 <br>V8则不使用关联容器来储存属性，而是采用更接近于静态编译的类的形式，将对象中每个属性的相对偏移量记下来，在生成机器码时直接把偏移量写到指令中。这样，访问某个对象的某个属性就只需要很少量的指令就能完成，比起关联容器的方式高效许多。 <br>V8使用动态机器码生成，先把要执行的JavaScript代码直接编译为机器码，而不使用字节码也不通过解释的方式来执行。这样在执行一些被大量重读执行的代码时效果会特别好。与之相对，Apple Webkit的JavaScriptCore/<a href="http://webkit.org/blog/189/announcing-squirrelfish">SquirrelFish</a>是先将JavaScript编译到字节码，然后以纯解释的方式执行字节码；Mozilla/Adobe的<a href="http://www.mozilla.org/projects/tamarin/">Tamarin</a>则是先将JavaScript编译到字节码，然后以即时编译（JIT）的方式执行。SquirrelFish与Tamarin的字节码设计思路又不一样：前者是基于寄存器的，而后者是基于栈的。一般认为基于寄存器形式的字节码比较快，而基于栈形式的字节码比较小，总之也是各有特点。 <br>与“隐藏类”相关的是，V8会预先猜测某段代码中的对象对应的隐藏类，如果命中的话就能直接用已经生成到机器码里的偏移量；如果没有命中，则使用实际的隐藏类中的信息来修改已生成的机器码。这样，如果多次执行中对象的“实际类型”都与猜测一样，执行速度就可以非常的快。 <br>Mozilla的新JavaScript执行引擎，TraceMonkey则通过别的方式来提高执行速度。通过记录代码执行的路径，当发现某条执行路径回到了某个早先经过的节点，就发现了一个“trace”；然后对trace花时间做重点优化，编译为高效的机器码。与HotSpot JVM不同的是，trace不是以函数（或者说方法）为单位的，可以在更小的范围内做精确的优化，减少不必要的优化开销。 <br>在垃圾收集器方面，V8采用的是一个两代的分代式准确垃圾收集器。相对的，JavaScriptCore的GC继承自KJS，没记错的话是一个没有分代的准确M&amp;S式（mark-and-sweep）垃圾收集器；Tamarin使用的则是Adobe提供的<a href="http://developer.mozilla.org/En/MMgc">MMgc</a>，主要算法是“延迟的引用计数”（DRC，Deffered Reference Counting），外加增量式保守M&amp;S的垃圾收集器。这三种实现方式各有特点，实际效果要比较起来恐怕比较难。准确式的垃圾收集器必须知道堆的位置和布局，所以难以做成通用的；保守式收集器则可以做得很通用，著名的<a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm GC</a>是个典型的例子。但保守式收集器有潜在的内存泄漏的危险，因为可能会把并不是对象指针的数据识别为指针，使本来应该已经可以释放的空间无法被释放。 <br>=========================================================================== <br>V8中使用了下列第三方库：  <p>引用 <p>&nbsp; - Jscre, located under third_party/jscre.&nbsp; This code is copyrighted <br>&nbsp;&nbsp;&nbsp; by the University of Cambridge and Apple Inc. and released under a <br>&nbsp;&nbsp;&nbsp; 2-clause BSD license. <br>&nbsp; - Dtoa, located under third_party/dtoa.&nbsp; This code is copyrighted by <br>&nbsp;&nbsp;&nbsp; David M. Gay and released under an MIT license. <br>&nbsp; - Strongtalk assembler, the basis of the files assembler-arm-inl.h, <br>&nbsp;&nbsp;&nbsp; assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h, <br>&nbsp;&nbsp;&nbsp; assembler-ia32.cc, assembler-ia32.h, assembler.cc and assembler.h. <br>&nbsp;&nbsp;&nbsp; This code is copyrighted by Sun Microsystems Inc. and released <br>&nbsp;&nbsp;&nbsp; under a 3-clause BSD license. <p>Jscre我没怎么听说过，不知道跟PCRE（Perl Compatible Regular Expressions）的关系是怎样的。在Jscre源码的目录里看到了"pcre"的字样，不过详细情况还是以后再看看好了。Apple Webkit里的JavaScriptCore应该是直接用了PCRE的吧？还是说我看漏了…… <br>=========================================================================== <br>今天Mozilla方面也没忘记对Chrome/V8的发布作出反应。Brendan Eich，JavaScript的创始者，在其blog上发表了一篇相关评论： <br><a href="http://weblogs.mozillazine.org/roadmap/archives/2008/09/tracemonkey_update.html">Brendan Eich: TraceMonkey Update</a> <p>Brendan Eich 写道 <p><img title="点击查看原始大小图片" height="430" src="http://rednaxelafx.javaeye.com/upload/picture/pic/21171/c2cbf917-ce6a-356e-ad25-3ae36907ec8b.png" width="700"> <p>（向右多的是TraceMonkey比较快，向左多的是V8比较快） <br>可以看到在Brendan做的SunSpider测试中，TraceMonkey在递归密集的程序中速度会比V8慢许多，而在正则表达式等方面则比V8快。据Brendan称，TraceMonkey的开发时间还不长，递归方面的trace还没多少进度，所以在这部分是比较慢的。但下一步将会解决这个问题。  <img src ="http://www.blogjava.net/charles/aggbug/285011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-07-01 19:38 <a href="http://www.blogjava.net/charles/archive/2009/07/01/285011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2 递归查询</title><link>http://www.blogjava.net/charles/archive/2009/06/25/284074.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Thu, 25 Jun 2009 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/06/25/284074.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/284074.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/06/25/284074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/284074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/284074.html</trackback:ping><description><![CDATA[<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"> <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">CREATE</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #0000ff">TABLE</span> FAMILY</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">    (</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        PERSON_ID <span style="color: #0000ff">INTEGER</span>,</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        NAME <span style="color: #0000ff">VARCHAR</span>(50),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        AGE <span style="color: #0000ff">INTEGER</span>,</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        GENDER <span style="color: #0000ff">CHARACTER</span>(1),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        PARENT_ID <span style="color: #0000ff">INTEGER</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">    )</pre></div></div>
<p>&nbsp;</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">insert <span style="color: #0000ff">into</span> FAMILY (PERSON_ID, NAME, AGE, GENDER, PARENT_ID) <span style="color: #0000ff">values</span> </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">(1, <span style="color: #006080">'Apple'</span>, 10, <span style="color: #006080">'F'</span>, 10),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">(2, <span style="color: #006080">'Zoe'</span>, 11, <span style="color: #006080">'F'</span>, 3),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">(3, <span style="color: #006080">'John'</span>, 30, <span style="color: #006080">'M'</span>, 13),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">(4, <span style="color: #006080">'Mary'</span>, 25, <span style="color: #006080">'F'</span>, 24),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">(5, <span style="color: #006080">'Peter'</span>, 14, <span style="color: #006080">'M'</span>, 4),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">(6, <span style="color: #006080">'Jenny'</span>, 13, <span style="color: #006080">'F'</span>, 4),</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">(24, <span style="color: #006080">'Robert'</span>, 60, <span style="color: #006080">'M'</span>, 30);</pre></div></div>
<p>查询Jenny的祖先</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">WITH</span> temptab (person_id, name, parent_id, <span style="color: #0000ff">LEVEL</span>) <span style="color: #0000ff">AS</span>          </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">     (<span style="color: #0000ff">SELECT</span> person_id, name, parent_id, 0               </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #0000ff">FROM</span> FAMILY</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">       <span style="color: #0000ff">WHERE</span> name = <span style="color: #006080">'Jenny'</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">      <span style="color: #0000ff">UNION</span> <span style="color: #0000ff">ALL</span>                                      </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">      <span style="color: #0000ff">SELECT</span> SUPER.person_id, SUPER.name, SUPER.parent_id, CHILD.<span style="color: #0000ff">LEVEL</span>+1         </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #0000ff">FROM</span> FAMILY SUPER, temptab CHILD</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">       <span style="color: #0000ff">WHERE</span> SUPER.person_id = CHILD.parent_id</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">) <span style="color: #0000ff">SELECT</span> * <span style="color: #0000ff">FROM</span> temptab                               </pre></div></div>
<p>查询Robert的子孙</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">WITH</span> temptab (person_id, name, parent_id, <span style="color: #0000ff">level</span>) <span style="color: #0000ff">AS</span>          </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">     (<span style="color: #0000ff">SELECT</span> person_id, name, parent_id, 0               </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #0000ff">FROM</span> FAMILY</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">       <span style="color: #0000ff">WHERE</span> name = <span style="color: #006080">'Robert'</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">      <span style="color: #0000ff">UNION</span> <span style="color: #0000ff">ALL</span>                                      </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">      <span style="color: #0000ff">SELECT</span> CHILD.person_id, CHILD.name, CHILD.parent_id, SUPER.<span style="color: #0000ff">LEVEL</span>+1         </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #0000ff">FROM</span> FAMILY CHILD, temptab SUPER</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">       <span style="color: #0000ff">WHERE</span> SUPER.person_id = CHILD.parent_id <span style="color: #0000ff">AND</span> <span style="color: #0000ff">level</span> &lt; 2</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">) <span style="color: #0000ff">SELECT</span> * <span style="color: #0000ff">FROM</span> temptab <span style="color: #0000ff">WHERE</span> <span style="color: #0000ff">LEVEL</span>&lt;&gt;0</pre></div></div><img src ="http://www.blogjava.net/charles/aggbug/284074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-06-25 10:45 <a href="http://www.blogjava.net/charles/archive/2009/06/25/284074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IPMSG协议</title><link>http://www.blogjava.net/charles/archive/2009/05/07/269350.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Thu, 07 May 2009 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/05/07/269350.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/269350.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/05/07/269350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/269350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/269350.html</trackback:ping><description><![CDATA[<p>本文重点在于对飞鸽协议原理及部分网络知识进行普及性的介绍，尽量避免用专业的术语吓跑非计算机专业朋友，如果有介绍的不合理的地方，也欢迎高手出来拍砖。<br>飞鸽概述<br>飞鹆传书作为免费的开源软件，在全世界各国享有声誉，其原作者是H.Shirouzu，其windows平台的C++源码下载地址为<a href="http://www.azhi.net/IPMsg/ipmsg206src.zip">http://www.azhi.net/IPMsg/ipmsg206src.zip</a>。除windows平台的实现以外，还存在大量其它平台的飞鸽实现，如Mac，Linux，甚至还存在平台无关的Java版本。<br>本人开发的飞鸽传书，实际上是在M8平台上实现了该协议子集。从而能够实现局域网内用户发现，接收PC版飞鸽传入的消息、文件、文件夹。<br>本人实现的飞鸽，可参考如下两个帖子：<br>1 <a href="http://bbs.meizu.com/thread-791903-1-1.html">http://bbs.meizu.com/thread-791903-1-1.html</a><br>2 <a href="http://bbs.meizu.com/thread-814371-1-1.html">http://bbs.meizu.com/thread-814371-1-1.html</a><br>飞鸽能够实现这种异构平台之间的通信，在于它的源码和协议是开放的，只要遵守相应的传输协议，就可以实现通信。<br>这里要强调一个概念，网络传输类应用程序，协议是重中之重。那么，协议到底是什么呢？协议可以让运行于两个不同平台的程序之间做到“心有灵犀一点通”，也有点像黑帮内部的切口：A说了天王盖地虎，B就要说宝塔镇荷妖。<br>有点扯远了，计算机网络应用中的协议，是要解决一些很实际的问题，比如，以飞鸽为例，计算机A向计算机B可以发消息，也可以传文件。都是通过网络传递数据，B如何能知道，这些数据中什么是消息，什么是文件呢？这就需要设计通信协议，通过一些命令字描述当前或即将传送的数据是什么内容。从而使得接收方，能够正确理解发送方发出的内容。<br>网络基础，TCP/IP协议简介<br>TCP/IP是很复杂的，要介绍这个已经远远超出我的能力范围，但我仍然可以对它的上层使用做简单的介绍。<br>前面我们花了大量的篇幅加口水强调协议在网络应用中的重要性。那所谓的飞鸽协议，与我们平时常常听到的TCP/IP有什么区别和联系呢？这个问题问的好（我自己问的）！<br>计算机网络的设计有着非常多的成功的可取之处，其中之一就是分层。按照问题所在的领域，将问层划分到不同的层中去解决（读者可自行参考OSI的七层模型以及TCP/IP的五层模型）。TCP/IP协议在传输层提供的UDP和TCP传输协议，成为了我们构建应用层软件（如，聊天，下载，邮件，http等等）的基础。<br>TCP传输协议规定了通信双方需要一个“连接-接受”这样的连接确认过程，既所谓的三次握手过程。一但连接建立成功，双方可以通过该连接，进行可靠的数据通信。<br>UDP传输协议不需要双方进行连接，发送方只需要指定接收方的地址和端口，若接收方此时正在该端口等待接收，那接收方就有可能（网络质量不好的话，可能会丢，不过局域网里通常不会发生这样的情况）收到消息。<br>除此之外，还有一个重要的概念是广播，将数据包发送到广播地址（用UDP协议发送），则该网段的所有用户，都可以收到这条数据。<br>飞鸽协议分析<br>飞鸽的协议也属于应用层协议，它描述了飞鸽程序通信时的语法和语义。<br>其语法定义如下（所有的命令字，都必需符合这样的格式要求）：<br>Ver(1): PacketNo:SenderName:SenderHost:CommandNo:AdditionalSection<br>每部分分别对应为：版本号（现在是1）:数据包编号:发送主机:命令:附加数据<br>其中：<br>数据包编号，一般是取毫秒数。利用这个数据，可以唯一的区别每个数据包；<br>SenderName指的是发送者的昵称（m8飞鸽被我统一的写死为m8，现在知道怎么定制了吧？）；<br>发送主机，指的是发送主机的主机名；<br>命令，指的是飞鸽协议中定义的一系列命令，具体见下文；<br>附加数据，指的是对应不同的具体命令，需要提供的数据，具体见下文。<br>上面介绍了数据包的语法，即格式，这些命令都是通过UDP协议向其它主机发送的。<br>接下来列出协议的命令，包括命令字及附加选项：<br>&nbsp;&nbsp;&nbsp;&nbsp; 1) Command functions (Low 8 bits from command number 32 bits)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_NOOPERATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No Operation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_BR_ENTRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Entry to service (Start-up with a Broadcast command)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_BR_EXIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit from service (End with a Broadcast command)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_ANSENTRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Notify a new entry<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_BR_ABSENCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Change absence mode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_BR_ISGETLIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Search valid sending host members<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_OKGETLIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Host list sending notice<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_GETLIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Host list sending request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_ANSLIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Host list sending <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_SENDMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message transmission<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RECVMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message receiving check<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_READMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message open notice<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_DELMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message discarded notice<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_ANSREADMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message open confirmation notice(added from version-8)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_GETFILEDATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File Transfer request by TCP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RELEASEFILES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Discard attachment file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_GETDIRFILES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attachment hierarchical file request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_GETINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get IPMSG version info.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_SENDINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Send IPMSG version info.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_GETABSENCEINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get absence sentence<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_SENDABSENCEINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Send absence sentence<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_GETPUBKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RSA Public Key Acquisition<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_ANSPUBKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RSA Public Key Response<br>&nbsp;&nbsp;&nbsp;&nbsp; 2) Option flag (High 24 bits from command number 32 bits)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_ABSENCEOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Absence mode(Member recognition command)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_SERVEROPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Server(Reserved)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_DIALUPOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Send individual member recognition command<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_SENDCHECKOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transmission check<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_SECRETOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sealed message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_READCHECKOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sealed message check(added from ver8)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_PASSWORDOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lock<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_BROADCASTOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Broadcast message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_MULTICASTOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Multi-cast(Multiple casts selection)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_NEWMUTIOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; New version multi-cast(reserved)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_AUTORETOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Automatic response(Ping-pong protection)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_NOLOGOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No log files<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_NOADDLISTOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Notice to the members outside of BR_ENTRY<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILEATTACHOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File attachment<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_ENCRYPTOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Code<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_NOPOPUPOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (No longer valid)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RETRYOPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re-send flag(Use when acquiring HOSTLIST)<br>&nbsp;&nbsp;&nbsp;&nbsp; 3) Extended code flag (hex format combination)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RSA_512<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RSA_1024<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RSA_2048<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RC2_40<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RC2_128<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_RC2_256<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_BLOWFISH_128<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_BLOWFISH_256<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_SIGN_MD5<br>&nbsp;&nbsp;&nbsp;&nbsp; 4) Extended files for attachment (fileattr low 8 bits)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_REGULAR<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_DIR<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_RETPARENT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_SYMLINK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_CDEV<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_BDEV<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_FIFO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_RESFORK<br>&nbsp;&nbsp;&nbsp;&nbsp; 5) Attachment file extended attribute(fileattr high 24 bits)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_RONLYOPT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_HIDDENOPT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_EXHIDDENOPT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_ARCHIVEOPT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_SYSTEMOPT<br>&nbsp;&nbsp;&nbsp;&nbsp; 6) Extended file attribute for attachment file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_UID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_USERNAME<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_GID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_GROUPNAME<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_PERM<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_MAJORNO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_MINORNO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_CTIME<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_MTIME<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_ATIME<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_CREATETIME<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_CREATOR<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_FILETYPE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_FINDERINFO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_ACL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_ALIASFNAME<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPMSG_FILE_UNICODEFNAME<br>基于上面介绍的内容，我们可以判断：<br>1:100:shirouzu:jupiter:32:Hello 表示 shirouzu用户发送了 Hello 这条消息（32对应为IPMSG_SEND_MSG这个命令，具体需要看源码中的宏定义）。<br>==========================================<br>以下内容未完待续，困了，明天再写<br>好，接下来我们进入具体场景的分析：<br>登录/离线通知<br>登录过程需要实现向局域网内的用户广播，告诉他们，“我来也！”。收到这条消息的用户则立即回复，“知道了，我在这里”，同时将新登录的用户加入到用户列表中。发送方也可根据收到的回复信息，了解到当前网络中，都有哪些已经登录了的用户。<br>具体的数据包如下：<br>登录方(要发送到广播地址，如255.255.255.255)：<br>1:XXX:m8:&lt;主机名称&gt;:IPMSG_BR_ENTRY:<br>接收方回复(发送到发送方的IP地址)：<br>1:XXX:&lt;接收方主机名&gt;:IPMSG_ANSENTRY:<br>相应的，用户离线时，应向广播地址发送，“我去也！”，收到这条消息的用户，需要将发送方从自己的用户列表中移除，并且不需要回复。<br>具体的数据包如下：<br>即将离线用户：<br>1:XXX:m8:&lt;主机名称&gt;:IPMSG_BR_EXIT:<br>发送/接收消息<br>发送消息是飞鸽协议中最重要的部分，通过和一些命令选项，可以实现复杂的功能：<br>最基本的情况下，发送方通过 IPMSG_SEND_MSG 命令，可以将消息发送到接收方<br>1:12345:m8:&lt;主机名称&gt;:IPMSG_SEND_MSG:你好，飞鸽<br>使用命令时，“附加数据”开使发挥作用了它里面包含了要发送的消息。<br>通常情况下，由于UDP的不可靠性，还需要为 IPMSG_SEND_MSG 命令设定 IPMSG_SENDCHECKOPT选项，也就是要求接收方回复回执信息。<br>1:12345:m8:&lt;主机名称&gt;:IPMSG_SEND_MSG|IPMSG_SENDCHECKOPT:你好，飞鸽<br>接收方收到IPMSG_SEND_MSG时，如果遇到IPMSG_SENDCHECKOPT选项，就要立即回复如下信息：<br>1:XXX:&lt;用户名&gt;:&lt;主机名&gt;:IPMSG_RECVMSG:12345<br>IPMSG_RECVMSG命令通过附加数据段中的数据（12345），告诉发送方，我收到了你的编号为12345的消息包。<br>除了上面介绍的IPMSG_SENDCHECKOPT选项，飞鸽还支持加密得选项，现有的m8版本没有实现该功能，所以暂不对这一块进行介绍。<br>发送/接收文件<br>文件的传输，要稍微复杂一些，它是通过 IPMSG_SEND_MSG 命令与 IPMSG_FILEATTACHOPT选项的组合，通知接收方“现在有文件要发给你了”,同时要将一些描述文件属性的数据（如文件名、大小、创建时间、类别属性如文件夹），发送给接收方，具体格式如下：<br>file1ID:filename:size:mtime:fileattr[:extend-attr=val1[,val2...][:extend-attr2=...]]:\a:file2ID...<br>这里需要注意的有几点，第一，一条文件传送命令，可以携带多条文件信息；第二，多个文件信息之前，要用\a分割；第三，size, mtime和fileattr 是用十六进制数描述的）；第四，如果文件名中包含“:”，则需要将其转义为“::”。<br>相应的，接收方收到文件传送命令后，首先需要从文件属性的数据中解析出要接收的文件的属性。然后向发送方相同的端口进行TCP连接，连接成功后，通过TCP通道向发送方发送IPMSG_GETFILEDATA命令用于接收文件或发送IPMSG_GETDIRFILES命令，用于接收文件夹。具体接收文件的命令如下：<br>1:XXX:m8:&lt;主机名&gt;:IPMSG_GETFILEDATA:packetID:fileID : offset<br>这条命令通过packetID，让发送方明白对方请求的文件是源于哪个命令包；通过fileId让发送方确定要发哪个文件;通过offset；让发送方明白要从哪个字节开始发送。<br>发送方的TCP通道收到上面的命令，就会发送对方请求的文件；而接收方将收到的数据保存到磁盘上即可。</p><img src ="http://www.blogjava.net/charles/aggbug/269350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-05-07 10:30 <a href="http://www.blogjava.net/charles/archive/2009/05/07/269350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Annotation Processing Tool</title><link>http://www.blogjava.net/charles/archive/2009/05/06/269149.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 06 May 2009 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/05/06/269149.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/269149.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/05/06/269149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/269149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/269149.html</trackback:ping><description><![CDATA[<div class="fullPage" twffan="done"> <div class="twikiMiddleContainer" twffan="done"> <div class="twikiMain" twffan="done"> <div class="twikiTopic" twffan="done"> <p>http://www.program-transformation.org/Transform/AnnotationProcessingTool</p> <h1 class="twikiTopicTitle">Annotation Processing Tool</h1> <div class="twikiWebTitle" twffan="done">Program-Transformation.Org: The Program Transformation Wiki</div> <h2><a name="Annotations"></a>Annotations </h2> <p> <h3><a name="Official_Documentation"></a>Official Documentation </h3> <p> <ul> <li>Java Guide: <a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html" target="_top">Annotations</a> </li></ul> <p> <h3><a name="Online_Articles"></a>Online Articles </h3> <p> <ul> <li>JavaWorld: <a href="http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-tiger3.html" target="_top">Taming Tiger, Part 3: Decorate your code with Java annotations</a>  <li>IBM DeveloperWorks: <a href="http://www-128.ibm.com/developerworks/java/library/j-annotate1/" target="_top">Annotations in Tiger, Part 1: Add metadata to Java code</a>  <li>IBM DeveloperWorks: <a href="http://www-128.ibm.com/developerworks/java/library/j-annotate2.html" target="_top">Annotations in Tiger, Part 2: Custom annotations</a>  <li>Oracle Java Developer Center: <a href="http://www.oracle.com/technology/pub/articles/hunter_meta.html" target="_top">Making the Most of Java's Metadata</a> </li></ul> <p>Javalobby:  <ul> <li><a href="http://www.javalobby.org/java/forums/t17297" target="_top">Annotations: Utilizing the Standard Annotations</a>  <li><a href="http://www.javalobby.org/java/forums/t17324" target="_top">Annotations: Evolving an Annotation - Part 1</a>  <li><a href="http://www.javalobby.org/java/forums/t17365" target="_top">Annotations: Evolving an Annotation - Part 2</a>  <li><a href="http://www.javalobby.org/java/forums/t17381" target="_top">Annotations: Finding Annotations at Runtime</a> </li></ul> <p> <h3><a name="Application_of_Annotations_EJB"></a>Application of Annotations: EJB </h3> <p> <ul> <li>JavaWorld: <a href="http://www.javaworld.com/javaworld/jw-08-2005/jw-0815-ejb3_p.html" target="_top">Simplify enterprise Java development with EJB 3.0, Part 1</a>  <li>JavaWorld: <a href="http://www.javaworld.com/javaworld/jw-09-2005/jw-0912-ejb.html" target="_top">Simplify enterprise Java development with EJB 3.0, Part 2</a>  <li>Java.net: <a href="http://today.java.net/pub/a/today/2005/08/18/ejb3.html" target="_top">What's New in EJB 3.0</a> </li></ul> <p> <h2><a name="Annotation_Processing"></a>Annotation Processing </h2> <p> <h3><a name="Official_Documentation"></a>Official Documentation </h3> <p> <ul> <li>Java Guide: <a href="http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html" target="_top">Getting Started with the Annotation Processing Tool</a>  <li><a href="http://jcp.org/en/jsr/detail?id=269" target="_top">JSR 269: Pluggable Annotation Processing API</a>  <li><a href="http://jcp.org/en/jsr/detail?id=199" target="_top">JSR 199: Java Compiler API</a> </li></ul> <p> <h3><a name="Online_Articles"></a>Online Articles </h3> <p>JavaLobby:  <ul> <li><a href="http://www.javalobby.org/java/forums/t17876" target="_top">APT: Compile-Time Annotation Processing with Java</a>  <li><a href="http://www.javalobby.org/java/forums/t17931" target="_top">APT: More Compile-Time Annotation Processing with Java</a>  <li><a href="http://www.javalobby.org/java/forums/t17961" target="_top">APT: Even More Compile-Time Annotation Processing with Java</a> </li></ul> <p> <h3><a name="Presentations"></a>Presentations </h3> <p>JavaOne 2005:  <ul> <li>Sun Microsystems. <a href="http://developers.sun.com/learning/javaoneonline/2005/coreplatform/TS-7425.html" target="_top">Annotation Processing for the Java Programming Language</a>  <li>Chariot Solutions. <a href="http://www.chariotsolutions.com/slides/apt_uses.pdf" target="_top">Usage of apt : How and When To Use the Annotation Processing Tool</a> </li></ul> <p> <h3><a name="Blog_Entries"></a>Blog Entries </h3> <p> <ul> <li>Josep D. Darcy. <a href="http://blogs.sun.com/roller/page/darcy/20051021" target="_top">Writing your first annotation processor</a> </li></ul> <p> <h3><a name="Discussions"></a>Discussions </h3> <p> <ul> <li>Lambda the Ultimate: <a href="http://lambda-the-ultimate.org/node/view/318" target="_top">Sun ships "extensible" Java compiler?</a>  <li>Sun Forums: <a href="http://forums.java.net/jive/thread.jspa?threadID=82" target="_top">Deprecate Javac</a>  <li>The Serverside: <a href="http://www.theserverside.com/news/thread.tss?thread_id=31587" target="_top">New JSR 269: Pluggable Annotation Processing API</a> </li></ul></div></div></div></div><img src ="http://www.blogjava.net/charles/aggbug/269149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-05-06 09:08 <a href="http://www.blogjava.net/charles/archive/2009/05/06/269149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 用户界面指南(cn)</title><link>http://www.blogjava.net/charles/archive/2009/05/05/268991.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Tue, 05 May 2009 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/05/05/268991.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/268991.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/05/05/268991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/268991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/268991.html</trackback:ping><description><![CDATA[<p><a title="http://www.eclipse.org/articles/Article-UI-Guidelines/index_cn.html" href="http://www.eclipse.org/articles/Article-UI-Guidelines/index_cn.html">http://www.eclipse.org/articles/Article-UI-Guidelines/index_cn.html</a></p><img src ="http://www.blogjava.net/charles/aggbug/268991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-05-05 15:20 <a href="http://www.blogjava.net/charles/archive/2009/05/05/268991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Platform UI dialogs and JFace dialogs图示及用法</title><link>http://www.blogjava.net/charles/archive/2009/04/29/268256.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 29 Apr 2009 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/04/29/268256.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/268256.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/04/29/268256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/268256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/268256.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/charles/aggbug/268256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-04-29 23:10 <a href="http://www.blogjava.net/charles/archive/2009/04/29/268256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TitleAreaDialog/TrayDialog</title><link>http://www.blogjava.net/charles/archive/2009/04/29/268255.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 29 Apr 2009 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/04/29/268255.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/268255.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/04/29/268255.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/268255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/268255.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS">Dialog是SWT和JFace的一个重要的组成部分，我们在开发Plug-in或RCP的时候也经常会用到它们。这篇随笔不会介绍 SWT的Dialog，因为我想很多人都已经非常熟悉它了。在这里，我要讨论的是JFace的Dialog，或者更进一步说是JFace的 TitleAreaDialog。什么是TitleAreaDialog呢？想想我们常常用到的New XX Wizard就知道了。在我们创建一个Java Project或Class的时候，我们所使用的Wizard其实就是由TitleAreaDialog构成的。这种Dialog有如下所示的 TitleArea和一个标准的Button Bar：<br />
<br />
<img height="66" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/TitleArea.png" width="487" />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <img height="66" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/TitleAreaWithErrorMessage.png" width="487" /><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-weight: bold">正常的TitleArea</span>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;<span style="font-weight: bold"> 带有错误信息的TitleArea</span><br />
<br />
<img height="45" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/ButtonBar.png" width="487" /><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-weight: bold">标准的Button Bar</span><br />
<br />
这种GUI的表现力要比SWT的Dialog强很多，而且JFace为该 Dialog封装了很多东西，这也使开发工作变得更加简单，所以我极力推荐使用TitleAreaDialog。那么让我们来看一个最基本的 TitleAreaDialog：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.jface.dialogs.IDialogConstants;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.SWT;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.graphics.Point;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.layout.GridData;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.widgets.Composite;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.widgets.Control;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.widgets.Shell;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.jthin.jpssp.ide.configuration.Activator;</span><span style="color: #000000; font-family: Courier"><br />
<br />
</span><span style="color: #0000ff; font-family: Courier">public</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">class</span><span style="color: #000000; font-family: Courier">&nbsp;MyTitleAreaDialog&nbsp;</span><span style="color: #0000ff; font-family: Courier">extends</span><span style="color: #000000; font-family: Courier">&nbsp;TitleAreaDialog&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;the&nbsp;dialog<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; font-family: Courier">@param</span><span style="color: #008000; font-family: Courier">&nbsp;parentShell<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">public</span><span style="color: #000000; font-family: Courier">&nbsp;MyTitleAreaDialog(Shell&nbsp;parentShell)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">super</span><span style="color: #000000; font-family: Courier">(parentShell);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;Control&nbsp;createDialogArea(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;area&nbsp;=&nbsp;(Composite)&nbsp;</span><span style="color: #0000ff; font-family: Courier">super</span><span style="color: #000000; font-family: Courier">.createDialogArea(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;container&nbsp;=&nbsp;</span><span style="color: #0000ff; font-family: Courier">new</span><span style="color: #000000; font-family: Courier">&nbsp;Composite(area,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayoutData(</span><span style="color: #0000ff; font-family: Courier">new</span><span style="color: #000000; font-family: Courier">&nbsp;GridData(GridData.FILL_BOTH));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;TitleArea中的Title<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTitle("My&nbsp;TitleAreaDialog");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;TitleArea中的Message<br />
</span><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; setMessage("This&nbsp;is&nbsp;a&nbsp;simple&nbsp;TitleAreaDialog&nbsp;example.");</span><br style="font-family: Courier" />
<br style="font-family: Courier" />
<span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000; font-family: Courier">//&nbsp;TitleArea中的Image<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTitleImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/Neptune.png"));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">return</span><span style="color: #000000; font-family: Courier"><span style="font-family: Courier">&nbsp;area;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">void</span><span style="color: #000000; font-family: Courier">&nbsp;createButtonsForButtonBar(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createButton(parent,&nbsp;IDialogConstants.OK_ID,&nbsp;IDialogConstants.OK_LABEL, </span><span style="color: #0000ff; font-family: Courier">true</span><span style="color: #000000; font-family: Courier">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createButton(parent,&nbsp;IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL,&nbsp;</span><span style="color: #0000ff; font-family: Courier">false</span><span style="color: #000000; font-family: Courier">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;Point&nbsp;getInitialSize()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">return</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">new</span><span style="color: #000000; font-family: Courier">&nbsp;Point(500,&nbsp;375);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">void</span><span style="color: #000000; font-family: Courier">&nbsp;configureShell(Shell&nbsp;newShell)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">super</span><span style="color: #000000; font-family: Courier">.configureShell(newShell);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;Dialog&nbsp;Title<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newShell.setText("Test&nbsp;TitleAreaDialog&nbsp;Title");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;Dialog&nbsp;Icon<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newShell.setImage(ResourceManager.getPluginImage(Activator.getDefault(),&nbsp;"icons/Neptune.png"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
这段代码非常容易理解，从方法签名中可以看出每个方法做了什么事情。注意createButtonsForButtonBar方法，其中用createButton方法创建了OK和Cancel这两个Button，并且把Button的默认点击事件也写好了，就是关闭该 Dialog。ResourceManager.getPluginImage是我自己编写的获得图片的helper method，这里就不讨论其实现了。这段代码会产生如下的Dialog：<br />
<br />
<img height="375" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/BasicTitleAreaDialog.png" width="500" /><br />
<br />
有趣的是，我在这里故意使用了一个128&#215;128的大图标， TitleAreaDialog不会自动缩小或裁减Image，而是调整TitleArea的大小来适应Image。<br />
<br />
接下来我们要为OK Button编写我们自己的事件，例如把用户在Dialog中的输入保存到某处。有人可能会想到为OK Button添加SelectionListener，但实际上这样做是不对的，因为OK Button是JFace为Dialog封装好了的，同时JFace也提供了响应的callback：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.Dialog#okPressed()<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;okPressed()&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;implement&nbsp;your&nbsp;own&nbsp;function&nbsp;here</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; super</span><span style="color: #000000">.okPressed();<br />
}</span></div>
<br />
我们可以在这里实现我们自己的事件，不过最后一定要调用super.okPressed方法，否则Dialog就不会关闭了。 <br />
<br />
OK，以上就是TitleAreaDialog的基本Framework，非常容易理解，下面我们就来在 TitleArea中动态设置一些信息。你可以把这个scenario想象成在用户输入的同时提示用户输入的合法性。TitleAreaDialog提供了好3个方法可以动态设置TitleArea信息，具体如下：<br />
</span>
<ul>
    <li><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">public void setErrorMessage(String newErrorMessage)：显示传入的错误信息。（我们把用这个方法设置的信息叫做error message。）当前显示的信息会被保存起来，等到error message清空之后会再次显示，而清空error message要传入null，而不是传入空字符串。<br />
    </span></span>
    <li><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">setMessage(String newMessage)：显示传入的信息，等同于setMessage(String newMessage, IMessageProvider.NONE)。如果当前显示的是error message，那么newMessage会被保存起来，等到error message清空后再显示。<br />
    </span></span>
    <li><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">setMessage(String newMessage, int newType)：显示传入的信息，并显示指定的信息类型。可用的类型有NONE、INFORMATION、WARNING和ERROR。需要注意的是， setMessage(String newMessage, int </span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">IMessageProvider.ERROR</span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">)和setErrorMessage</span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">(String newErrorMessage)并不相同。后者会覆盖当前的任何信息，而前者只会覆盖当前的非error message，不会影响到error message（也就是说当error message清空后才会显示）。<br />
    </span></span></li>
</ul>
<span style="font-size: 10pt"><span style="font-family: Comic Sans MS">这样，我们就可以为一些文本框添加ModifyListener，然后在其中设置TitleArea的信息了。<br />
<br />
接着，再让我们来看看Button Bar。有些时候，我们希望把OK和Cancel这种默认的Button放置在Button Bar的右侧，而把其他Button放置在Button Bar的左侧，如下图中的Customize... Button：<br />
<br />
<img height="45" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/ButtonBarWithLeftSideButton.png" width="486" /><br />
<br />
这又如何实现呢？有人可能想到在 createButtonsForButtonBar方法中做一些手脚，但是遗憾的是这行不通，我们真正要覆写的是createButtonBar方法，下面是一个简单的例子：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Control&nbsp;createButtonBar(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; Composite&nbsp;composite&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Composite(parent,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp; GridLayout&nbsp;layout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridLayout();<br />
&nbsp;&nbsp;&nbsp; layout.numColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp; layout.marginHeight&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);<br />
&nbsp;&nbsp;&nbsp; layout.marginWidth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);<br />
&nbsp;&nbsp;&nbsp; layout.verticalSpacing&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);<br />
&nbsp;&nbsp;&nbsp; layout.horizontalSpacing&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);<br />
<br />
&nbsp;&nbsp;&nbsp; composite.setLayout(layout);<br />
&nbsp;&nbsp;&nbsp; composite.setLayoutData(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridData(GridData.FILL_HORIZONTAL));<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(isHelpAvailable())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createHelpControl(composite);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; createButton(composite, MyConstants.IMPORT_BUTTON_ID,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Import</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff"> false</span><span style="color: #000000">).addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;widgetSelected(SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MessageDialog.openInformation(MaintainModuleDialog.</span><span style="color: #0000ff">this</span><span style="color: #000000">.getShell(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Information</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">Import\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;button&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
<br />
&nbsp;&nbsp;&nbsp; createButton(composite, MyConstants.EXPORT_BUTTON_ID,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Export</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">false</span><span style="color: #000000">).addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;widgetSelected(SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MessageDialog.openInformation(MaintainModuleDialog.</span><span style="color: #0000ff">this</span><span style="color: #000000">.getShell(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Information</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">Export\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;button&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
<br />
&nbsp;&nbsp;&nbsp; createButton(composite, MyConstants.OTHER_BUTTON_ID,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Other</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">).addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;widgetSelected(SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MessageDialog.openInformation(MaintainModuleDialog.</span><span style="color: #0000ff">this</span><span style="color: #000000">.getShell(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Information</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">Other\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;button&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
<br />
&nbsp;&nbsp;&nbsp; Label&nbsp;filler&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Label(composite,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp; filler.setLayoutData(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridData(GridData.FILL_HORIZONTAL</span><span style="color: #000000"> |</span><span style="color: #000000">&nbsp;GridData.GRAB_HORIZONTAL));<br />
&nbsp;&nbsp;&nbsp; layout.numColumns</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">super</span><span style="color: #000000">.createButtonsForButtonBar(composite);<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;composite;<br />
}</span></div>
<br />
正如你所见，我们实际上创建了自己的Button Bar，然后在上面添加了3个Button：Import、Export和Other，最后 super.createButtonsForButtonBar会创建OK和Cancel Button。filler是用来在两组Button见占位的。代码中用到的两个convert方法来自 org.eclipse.jface.dialogs.Dialog类，你还可以在这个类中找到一个getButton(int)方法，它可以根据传入的 ID返回用createButton创建的Button。这些都是非常实用的方法。<br />
<br />
回头看一下上面那个完整的 TitleAreaDialog图片，你会看到在Dialog左下角有一个问号符号，这其实是一个Button，点击它可以显示帮助信息，当然帮助信息是由你来创建的。让我们看看Eclipse Search的TitleAreaDialog中的帮助信息吧：<br />
<br />
<img height="450" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/EclipseSearchHelpControl.png" width="728" /><br />
<br />
如果我们也想实现这种帮助机制，那么就要实现如下方法：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TrayDialog#createHelpControl(org.eclipse.swt.widgets.Composite)<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Control&nbsp;createHelpControl(Composite&nbsp;parent)&nbsp;{<br />
</span><span style="color: #008000">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.createHelpControl(parent);<br />
}</span></div>
<br />
如果不想实现帮助机制，那么最好不要在Dialog中显示出那个问号符号，你可以覆写如下方法并永远返回false，这样就不会显示问号符号了。<br />
<br style="font-family: Courier" />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-size: 10pt; font-family: Courier"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TrayDialog#isHelpAvailable()<br />
&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isHelpAvailable()&nbsp;{</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
}</span></div>
<br />
那么这个酷酷的帮助机制到底是个什么东西呢？实际上，它的学名叫做DialogTray。TitleAreaDialog继承了 </span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">org.eclipse.jface.dialogs.TrayDialog类，而TrayDialog就可以显示这种 DialogTray，是不是有点儿拗口呢？实际上，我们不仅仅可以添加帮助信息这一种DialogTray，还可以添加任意的DialogTray，现在就让我们动手实现一个最简单的吧。代码很简单，最主要的就是要实现一个DialogTray，代码如下：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.jface.dialogs.DialogTray;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.SWT;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.layout.GridData;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.layout.GridLayout;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Composite;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Control;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Label;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Text;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyDialogTray&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;DialogTray&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.DialogTray#createContents(org.eclipse.swt.widgets.Composite)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Control&nbsp;createContents(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;container&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Composite(parent,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;GridLayout&nbsp;gridLayout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridLayout();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gridLayout.numColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayout(gridLayout);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Label&nbsp;label&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Label(container,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Name:</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Text&nbsp;text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Text(container,&nbsp;SWT.BORDER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.setLayoutData(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridData(SWT.FILL,&nbsp;SWT.CENTER,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;container;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<br />
我们只在其中创建了一个Label和一个Text，这就足够了。最后，我们为MyTitleAreaDialog添加两个Button，用来打开和关闭MyDialogTray，代码如下：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Button&nbsp;openTrayButton&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Button(container,&nbsp;SWT.NONE);<br />
openTrayButton.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Open&nbsp;Tray</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Button&nbsp;closeTrayButton&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Button(container,&nbsp;SWT.NONE);<br />
closeTrayButton.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Close&nbsp;Tray</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
closeTrayButton.setEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
<br />
openTrayButton.addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;widgetSelected(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;SelectionEvent&nbsp;e)&nbsp;{<br />
</span><span style="color: #008000">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //</span><span style="color: #008000">&nbsp;this&nbsp;method&nbsp;is&nbsp;from&nbsp;TrayDialog</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; openTray(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyDialogTray());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openTrayButton.setEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closeTrayButton.setEnabled(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; }<br />
});<br />
<br />
closeTrayButton.addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;widgetSelected(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;this&nbsp;method&nbsp;is&nbsp;from&nbsp;TrayDialog</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closeTray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openTrayButton.setEnabled(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closeTrayButton.setEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; }<br />
});</span></div>
<br />
最后我们会得到如下对话框：<br />
<br />
<img height="375" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/OpenTray.png" width="624" /><br />
<br />
好了，就讲这么多吧。如果能把这些东东适当地用在你的Application中，那么效果一定非常棒。</span></span>
 <img src ="http://www.blogjava.net/charles/aggbug/268255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-04-29 23:09 <a href="http://www.blogjava.net/charles/archive/2009/04/29/268255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Defensive programming VS Design by contract</title><link>http://www.blogjava.net/charles/archive/2009/04/29/268236.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 29 Apr 2009 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/04/29/268236.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/268236.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/04/29/268236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/268236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/268236.html</trackback:ping><description><![CDATA[<a title="Permanent link to Art of Defensive programming" href="http://anirudhvyas.com/root/2008/10/20/art-of-defensive-programming/" rel="bookmark">Art of Defensive programming</a>
<img src ="http://www.blogjava.net/charles/aggbug/268236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-04-29 21:31 <a href="http://www.blogjava.net/charles/archive/2009/04/29/268236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>