﻿<?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-Jiangshachina-随笔分类-Java</title><link>http://blogjava.net/jiangshachina/category/23789.html</link><description>同是Java爱好者，相逢何必曾相识！&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;a cup of Java, cheers!</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 15:45:25 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 15:45:25 GMT</pubDate><ttl>60</ttl><item><title>说地道的Java语言(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2010/02/09/312439.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 09 Feb 2010 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2010/02/09/312439.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/312439.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2010/02/09/312439.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/312439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/312439.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 说地道的Java语言&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;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiangshachina/archive/2010/02/09/312439.html'>阅读全文</a><img src ="http://www.blogjava.net/jiangshachina/aggbug/312439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2010-02-09 21:54 <a href="http://www.blogjava.net/jiangshachina/archive/2010/02/09/312439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优秀的Java开发者应得更好的薪酬(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2010/01/11/308867.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 11 Jan 2010 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2010/01/11/308867.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/308867.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2010/01/11/308867.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/308867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/308867.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">优秀的Java开发者应得更好的薪酬</span></strong></span><br />
</div>
<span style="font-size: 10pt;">来年春暖花开之时，又是许多公司调整薪资的时候了。<a href="http://www.java.net/">java.net</a>中的一篇<a href="http://weblogs.java.net/blog/felipegaucho/archive/2010/01/05/good-java-developers-deserve-better-salaries">博文</a>道出了我们的心声--优秀的Java开发者应得更好的薪酬$_$(2010.01.11最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 我的邮箱聚集了几个Java用户组和其它的一些关于Java世界的特别信息源，其中就有像CEJUG和Java EE社区这样的特殊客人。很多关于Java社区的信息资源被用于咨询公司去雇佣聪明人了，从去年开始，我一直对技能丰富的Java开发员保持着极大的兴趣。另外，多日之前，我正与一些同事喝咖啡，一位经理就承认他正为到哪儿雇到所需人力资源而发愁，这些人员是要被分配的工作是为2010年所签订的合约。<br />
&nbsp;&nbsp;&nbsp; 听着这样的谈话，并看着邮件列表中不断增长的录用通知，我只有一种结论：Java市场已萎缩，技艺精湛的Java开发者则变得稀少。原因何在？不知道，但有一些关于我们这个时期的明显观察结果：<br />
&nbsp;&nbsp;&nbsp; 大肆宣传的语言和技术，如Scala，Ruby，Grails等等，并未如我们所期望的那样占领市场。那Android呢？如你所知，那可能要等到明年了。在过去两三年中，这些语言对它们的解决方案广而告之，推销出了许多书及会议演讲，但现在并不能轻易地为这些技术找到好的工作(薪资)。当然，某些地方也会有好工作，但已与三年前<em>Java已死</em>言论所处时期不可比拟。简单的事实是：Java仍然在IT市场中<a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">位居高位</a>，而所有那些被大肆宣传的解决方案仍然被大肆宣传着它们的承诺。那么，年轻的开发者们是否会跟随这样的宣传呢？是的，现在他们将要接受Java工作，至少受到挫败的人们多数都不能提供高质量的服务。<br />
&nbsp;&nbsp;&nbsp; 人们正变得懒惰和鲁钝，而且一日更甚一日。观看电影《<a href="http://en.wikipedia.org/wiki/Idiocracy">蠢蛋进化论</a>》后，你就知道这一点儿。如果你还不相信，看半个小时的MTV，你就能体验到一个鲜活的例子了:)。iPhone用户不可能在任何一个GUI中处理多个按钮，而类型不安全的语言认为"任何需要类型声明的语言都过于复杂，以至于无法使用"。说得多好啊，让开发者相信数学和域模型是过时的技术，那会怎样呢？<br />
那Java开发者的薪资又如何呢？Java平台创建了数量巨大的能运行在全球IT市场中的软件，所支持的商业规模每年数以十亿计。没有比希望这些技术背后的人们能过上优质生活--至少是有益的生活--更自然的事情了。看吧，现实却是对烦人的管理模型的过高评价，开发者花费额外的时间，<a href="http://en.wikipedia.org/wiki/Tendinitis">肌腱炎</a>，以及更陡峭的学习曲线。<br />
<br />
<strong><span style="font-size: 12pt;">如何雇佣到优秀的Java开发者呢？</span></strong><br />
为防你会急于寻找优秀的Java开发者，这儿有一些提示：<br />
1. 提高工资(没任何借口)<br />
2. 提供学习机会，以作为工作福利的一部分(会议，书籍，课程等等)。<br />
3. 允许开发者作出项目决策。<br />
4. 使用现代的Java技术(还在使用Java 1.4？)<br />
5. 给予开发者一些稳定性和载体观点，而不要使用官僚方式。<br />
6. 弹性工作时间，远程办公也应能做到。<br />
7. 给予开发者们更多的水和咖啡...水果又当如何？可乐或其它的饮料呢？为每位开发员每天买一瓶可乐会花多少钱？如果你认为那太贵了，请离开这个市场:)<br />
8. 不要呆板地复制Google和IBM的思路，这些公司都比你们的公司富有。让你的开发者们富于创意，对你的开发者们诚实。<br />
祝好运:) Java市场已萎缩，技艺精湛的开发者则变得稀少。聪明的经理是时候提高薪酬了，这样才能逮到好的Java开发员，剩下的就由阅读Scrum和Kanban手册的人们去分享吧。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/308867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2010-01-11 09:01 <a href="http://www.blogjava.net/jiangshachina/archive/2010/01/11/308867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Google Collections的理由(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2010/01/08/308638.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 08 Jan 2010 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2010/01/08/308638.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/308638.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2010/01/08/308638.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/308638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/308638.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">使用Google Collections的理由</span></strong></span><br />
</div>
<span style="font-size: 10pt;"><a href="http://code.google.com/p/google-collections/">Google Collections</a>终于发布了1.0版，本文是<a href="http://java.dzone.com">JavaLobby</a>上的一篇<a href="http://java.dzone.com/articles/introduction-google">博文</a>，作者讲述了应该使用Google Collections的若干理由，大家有兴趣的话也可以体验一下。(2010.01.08最后更新)<br />
<br />
在去年底看到<a href="http://code.google.com/p/google-collections/">Google Collections</a>发布了它的1.0版之后，我想我应该看看与JDK默认提供的集合框架相比，使用Google Collections类库会有什么好处。Google Collections的发行包是一个<a href="http://google-collections.googlecode.com/files/google-collect-1.0.zip">zip文件</a>，包含了一个jar文件，源文件和Javadoc文件。<br />
Java Collections API就是被用来扩展的，而Google Collections则扩展的很好。很快，我就发现该类库最好的特性之一是它包含了<a href="http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html">MultiMap</a>类。<br />
为了证明这一点，让我们使用一个电话薄的例子，在这个例子中每个人都可一个或多个电话号码。事先，我已将电话号码存入每个人的一个单独的List中，如下所示：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Person,&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PhoneNumber</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;phoneBook&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Person,&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PhoneNumber</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">();</span></div>
<br />
<span style="font-size: 10pt;">
使用MultiMap，将变得十分简洁：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Multimap&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Person,&nbsp;PhoneNumber</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;newPhoneBook&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ArrayListMultimap.create();</span></div>
<br />
<span style="font-size: 10pt;">
且在使用MultiMap时，就没必要管理每个人的电话号码列表了。当我要加一个新的电话号码时，只需这么做：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Person&nbsp;me&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Person(</span><span style="color: #000000;">"</span><span style="color: #000000;">James</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
newPhoneBook.put(me,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PhoneNumber(</span><span style="color: #000000;">111</span><span style="color: #000000;">));<br />
newPhoneBook.put(me,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PhoneNumber(</span><span style="color: #000000;">201</span><span style="color: #000000;">));</span></div>
<span style="font-size: 10pt;"><br />
而不是使用以前的繁冗方法去管理ArrayList：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Person&nbsp;me&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Person(</span><span style="color: #000000;">"</span><span style="color: #000000;">James</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(phoneBook.get(me)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
{<br />
&nbsp;&nbsp;&nbsp;phoneBook.put(me,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PhoneNumber</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">());<br />
}</span></div>
<span style="font-size: 10pt;"><br />
phoneBook.get(me).add(new PhoneNumber(111));<br />
对需要处理的数据进行管理这个话题，<a href="http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/base/Preconditions.html">Precondition</a>允许你对传入的参数进行校验。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Preconditions.checkNotNull(me);</span></div>
<br />
<span style="font-size: 10pt;">
我知道在Java中达到上述效果也可使用断言，但上述方法可使你的校验总是有效。你能方便地进行校验，通过判定一个表达式，也可为特定的参数抛出IllegalArgumentException。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Preconditions.checkArgument((i&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">The&nbsp;value&nbsp;i&nbsp;has&nbsp;to&nbsp;be&nbsp;greater&nbsp;than&nbsp;zero</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
<span style="font-size: 10pt;">
还有许多其它有用的特性，例如快速创建不可变集合的能力：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">ImmutableList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;numbers&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ImmutableList.of(</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">21</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">34</span><span style="color: #000000;">);</span></div>
<br />
<span style="font-size: 10pt;">以前，你需要创建一个普通的List，然后再调用Collections.unmodifiableList()方法。<br />
为了对该类库有一个很好的概览，查看由Kevin Bourrillion在2008年给出的一段<a href="http://www.youtube.com/v/ZeO_J2OcHYM&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;">视频</a>。<br />
总之，该类库使你能以更优雅的方法来处理集合对象，并使你的代码更具可读性且更扼要。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/308638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2010-01-08 09:55 <a href="http://www.blogjava.net/jiangshachina/archive/2010/01/08/308638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奇客的2010年预言(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2010/01/07/308504.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 07 Jan 2010 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2010/01/07/308504.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/308504.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2010/01/07/308504.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/308504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/308504.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">奇客的2010年预言</span></strong></span><br />
</div>
<span style="font-size: 10pt;">新年伊始，<a href="http://www.java.net">java.net</a>的著名博客<a href="http://www.java.net/blogs/joconner/">John O'Conner</a>道出了他对可能发生在今年的一些事件的<a href="http://weblogs.java.net/blog/joconner/archive/2010/01/03/geeky-predictions-2010">预测</a>，大家也可以评判一二。(2010.01.07最后更新)<br />
<br />
每个人都能对过去说些什么，但很少人能看到未来。此处是我对2010年的预言！<br />
1. <strong>Oracle将更喜爱Eclipse，而会废弃NetBeans</strong>。我不会比你更讨厌这一点了，但他们为什么要支持两个(算上JDeveloper就是三个)相互竞争的IDE呢？Oracle现有的员工都知道也都喜爱Eclipse，他们的工具都是围绕着Eclipse而构建的，他们的插件也都是为 Eclipse而开发的。如果没必要，为什么要作出改变呢？我唯一的问题是谁将支持NetBeans，这是一个伟大的产品，绝对值得继续保有它...只是对于Oracle，这是不值得的。<br />
2. <strong>Chrome OS和Andriod OS将会合并</strong>。这个世界将不需要两个新的来自于Google的操作系统，而不仅仅是针对Web应用。我知道这两个OS来自于Web应用的两个不领域：桌面 /便携式/笔记本机器；移动电话。然而，API也应该最大限度的被社区接受，这就意味着它们俩将成为一体。关于该预言你可以在<a href="http://weblogs.java.net/blog/2009/07/09/speculations-regarding-google-chrome-os">我之前的一篇Blog</a>中读到更多。<br />
3. <strong>Google将收购LinkedIn</strong>。虽然LinkedIn仍是一个有用且很好的站点，但它仍需更稳定一点儿。Google将注入新的思想以创建一个好的产品，甚至还能做得更好。<br />
4. <strong>Oracle将出售Sun的硬件业务</strong>。拥有硬件的Oracle？我无法相信。与他们的软件业务相离甚远。我认为Oracle将把硬件业务推给HP。<br />
5. <strong>在今年的JavaOne之前，Adobe会抢走JavaFX的风头。Adobe将发布它自己的改进了的Flex设计器工具</strong>，并且该工具在他们宣布的时候即可使用。Sun的JavaFX设计器工具将会踉踉跄跄地出现在JavaOne 2010上，而且每个人都会忘了Sun承诺过该工具会出现在2009年底。<br />
作出了你自己的预言吗？让我们知道你的预测吧。 </span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/308504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2010-01-07 09:14 <a href="http://www.blogjava.net/jiangshachina/archive/2010/01/07/308504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高效调试：条件化断点(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/12/31/307852.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 31 Dec 2009 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/12/31/307852.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/307852.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/12/31/307852.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/307852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/307852.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">高效调试：条件化断点</span></strong></span><br />
</div>
<span style="font-size: 10pt;">本文是<a href="http://java.dzone.com/">JavaLobby</a>上的一篇<a href="http://java.dzone.com/tips/effective-debugging">博文</a>，介绍了一个使用Eclipse和NetBeans进行调试的小窍门，我受益良多，也希望对大家有所助益。(2009.12.31最后更新)<br />
<br />
最重要的开发者工作之一就是调试。在我的大学时代，我们被迫使用简单的文本编辑器开发软件，所以开始时，我使用打印语句来观察程序在什么地方出错了。现在，IDE使我们能很便捷地完成这一工作。...<br />
我在Eclipse和NetBeans中见过的最佳特性就是条件化断点思想。这个想法很简单，打上断点，然后输入使调试线程能够停在该断点处的条件。例如，若有如下代码：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(Employee&nbsp;emp:&nbsp;employees)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(emp.getType()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Employee.MANAGER)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addToManagers(emp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;"><br />
假设，当雇员的getType方法的值为Employee.DEVELOPER时，我想察看所有变量的值，并在单步调试时能确保不会进入IF语句块。<br />
在Eclipse中，你可一如往常那样在IF语句中设置断点，右键点击断点，你将看到如下菜单：<br />
<img src="http://java.dzone.com/sites/all/files/eclipse_breakpoint.PNG" alt="" /><br />
<br />
通过勾选Enable Condition复选框，你可以在结果对话框中为该断点设置一个条件：<br />
<img src="http://java.dzone.com/sites/all/files/eclipse_dialog.PNG" alt="" /><br />
<br />
当你键入条件时，你能获得完全的内容提示。你也能改变条件的意义--当该条件为真时，或者当在最近一次遍历之后值被改变时，是否需要停止。<br />
对于NetBeans，也十分的相似。你仍要右键点击断点以获得属性菜单：<br />
<img src="http://java.dzone.com/sites/all/files/netbeans_breakpoint.PNG" alt="" /><br />
<br />
该对话框也有熟悉的条件，命中次数和内容提示：<br />
<img src="http://java.dzone.com/sites/all/files/netbeans_dialog.PNG" alt="" /><br />
<br />
像这样的特性才能真正地帮助你提升调试的效率--当你知道某个特定的值导致了程序失败时，你就能直捣问题的核心了。<br />
<br />
<strong><span style="color: red;"><span style="font-size: 12pt;">祝大家新年愉快 :-D</span></span></strong><br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/307852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-12-31 10:49 <a href="http://www.blogjava.net/jiangshachina/archive/2009/12/31/307852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在泛型中使用通配符和继承(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/12/28/307495.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 28 Dec 2009 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/12/28/307495.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/307495.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/12/28/307495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/307495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/307495.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">在泛型中使用通配符和继承</span></strong></span><br />
</div>
&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt;">本文是Sun官方以Blog形式发布的Java核心技术窍门(<a href="http://blogs.sun.com/CoreJavaTechTips/">JavaCoreTechTip</a>)中的<a href="http://blogs.sun.com/CoreJavaTechTips/entry/using_generics_with_wildcards_and">一篇</a>，它以非常简洁的示例展示了泛型通配符的使用，初学Java泛型的朋友可以看看。(2009.12.30最后更新)<br />
&nbsp;&nbsp;&nbsp; Java2平台，标准版5.0(J2SE 5.0)为Java程序设计语言及其平台引入了泛型。在最简单的案例和典型的应用中，泛型能够识别集合容器中所存储的是否是你所期望的对象。所以，你可以特别说你有一个String或其它类型对象的List，而不是声称你的程序有一个Object的List。所以，如果你不小心向该List中加入了错误类型的对象，编译器会告之你这个错误。该错误将在编译时进行修复，而不用等到你运行该程序，且在程序运行到该处代码时，在获取对象的操作中产生一个运行时的强制类型转换异常。<br />
这就提出了泛型的第二个好处。迭代器将变得类型安全了。Iterator接口中的next()方法将会返回集合中下一个元素的类型安全版本。<br />
&nbsp;&nbsp;&nbsp; 但这并不是本文要介绍的泛型应用的窍门，那些窍门已由<a href="http://java.sun.com/developer/JDCTechTips/2005/tt0315.html#1">2005 Core Java Technologies Tip</a>描述过了。在使用泛型时，大多数人都不能很好地理解对extends关键字的使用。一个典型的描述如何使用<span style="font-family: Courier;">extends</span>关键字的示例与绘制图形有关。与其不同的是，此处窍门所用的示例将使用Swing组件，以便你不必创建额外的新类。在一个非常有限的例子中，Swing按钮组件的类层次结构如下所示，当然，Object是实际上的根。<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">Component<br />
</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;Container<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JComponent<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;AbstractButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JMenuItem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JCheckBoxMenuItem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JMenu<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JRadioButtonMenuItem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JToggleButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JCheckBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">&nbsp;JRadioButton</span></div>
<span style="font-size: 10pt;"><br />
&nbsp;&nbsp;&nbsp; 所有AbstractButton的子类都共同享有的一个东西就是方法getText。这就是泛型的精髓，你能定义一个方法去处理以AbstractButton为元素的List，并返回这些按钮的String类型的标签的List。下面是该方法的第一个版本：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;getLabels(List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">AbstractButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;list)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;labelList&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">(list.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(AbstractButton&nbsp;button:&nbsp;list)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelList.add(button.getText());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;labelList;<br />
}</span></div>
<span style="font-size: 10pt;"><br />
&nbsp;&nbsp;&nbsp; 下面就是如何使用该方法。首先，定义一个AbstractButton类型的List，然后向其中填充值，并调用该方法：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">AbstractButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;buttonList&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">AbstractButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />
buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JButton(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JCheckBox(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">World</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JRadioButton(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hola</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JMenuItem(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Mundo</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
<br />
List&nbsp;labels&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;getLabels(buttonList);<br />
System.out.println(labels);</span></div>
<span style="font-size: 10pt;"><br />
&nbsp;&nbsp;&nbsp; 根据Google，"Hola, Mundo"是"Hello, World"的西班牙译文。调用println()方法的结果如下所示： <br />
[Hello, World, Hola, Mundo]<br />
<br />
&nbsp;&nbsp;&nbsp; 对于<span style="font-family: Courier;">AbstractButton</span>的<span style="font-family: Courier;">List</span>对象，一切都能正常运行，但当是其它类型，特别是AbstractButton子类型的List时，就不能正常工作了。从逻辑上，有人可能认为对于以JButton为元素的List，一切仍能正常工作。因为JButton是AbstractButton的子类。难道不能对AbstractButton子类型的List调用方法<span style="font-family: 宋体;">getLabels(List&lt;AbstractButton&gt;)</span>？<br />
然而，事实并非如此。因为这是一个编译时检查，同时也因为getLabels方法被定义为只接受AbstractButton的List，你不能向该方法中传入任何其它类型的List。<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">GetList.java:</span><span style="color: rgb(0, 0, 0);">13</span><span style="color: rgb(0, 0, 0);">:&nbsp;getLabels(java.util.List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">javax.swing.AbstractButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;in&nbsp;GetList&nbsp;cannot&nbsp;be&nbsp;applied&nbsp;to&nbsp;(java.util.List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">javax.swing.JButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;labels&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;getLabels(buttonList);<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;</span><span style="color: rgb(0, 0, 0);">^</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;error</span></div>
<span style="font-size: 10pt;"><br />
这也就是extends关键字发挥作用的地方了。不将<span style="font-family: Courier;">getLabes</span>方法定义为仅仅接受<span style="font-family: Courier;">AbstractButton</span> <span style="font-family: Courier;">List</span>，而是将它定义为接受<span style="font-family: Courier;">AbstractButton</span>子类的<span style="font-family: Courier;">List</span>：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;getLabels(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;?</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;AbstractButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;list)</span></div>
<span style="font-size: 10pt;"><br />
此处的通配符?表明该方法并不关心确切的类型是什么，只要它是AbstractButton的子类型即可。下面是综合了前述所有代码片断的完整示例程序：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;javax.swing.</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;GetList&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String&nbsp;args[])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">JButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;buttonList&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">JButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JButton(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JButton(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">World</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JButton(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hola</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonList.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JButton(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Mundo</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;labels&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;getLabels(buttonList);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(labels);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;getLabels(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;?</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;AbstractButton</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;list)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;labelList&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">(list.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(AbstractButton&nbsp;button:&nbsp;list)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelList.add(button.getText());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;labelList;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;"><br />
现在，当你要用泛型来定义你自己的类和方法时，就要考虑接受作为泛型参数的抽象类，或它的任一超类，记得使用通配符以便相同的方法对于子类也能很好地工作。<br />
更多关于泛型的信息，请见两篇较早前由Gilad Bracha撰写的教程：一篇是<a href="http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf">2004年的教程(PDF)</a>，另一篇是在线的<a href="http://java.sun.com/docs/books/tutorial/extra/generics/">Java Tutorial</a>中的泛型章节。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/307495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-12-28 13:44 <a href="http://www.blogjava.net/jiangshachina/archive/2009/12/28/307495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据加载模糊进度指示面板的实现与应用(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/11/29/304120.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 29 Nov 2009 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/11/29/304120.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/304120.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/11/29/304120.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/304120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/304120.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">数据加载模糊进度指示面板的实现与应用</span></span></strong><br />
</div>
<span style="font-size: 10pt;">
当在加载数据(或其它耗时工作)时，需要显示一个进度指示面板，本文介绍了一种简易的实现方式。(2009.11.30最后更新)<br />
<br />
对于许多Swing应用，在与用户的交互过程中可能需要与数据库进行通信(如，加载数据)。而这个过程往往比较耗时，为了不造成"假死"现象，一般都会显示一个模糊进度指示器(不一定使用<a href="http://java.sun.com/javase/7/docs/api/javax/swing/JScrollBar.html">JProgressBar</a>，简单地用一个图片代替即可)，当数据加载完毕后，该进度指示器自动消失。<br />
&nbsp;&nbsp;&nbsp; 一般地，该模糊进度指示器不会展示在一个弹出的对话框中(因为这样不美观)，而是直接显示在需要展示被加载数据的面板中，并且对该面板进行模糊处理。实现这一功能的关键就在于，在屏幕的同一区域内展示两层面板：一层是展示数据的面板；另一层是展示进度指示器的面板。当加载数据时，显示进度指示器面板，并模糊数据面板；当数据加载完毕后，隐藏进度指示器面板，并使数据面板清晰显示。下面将使用<a href="http://swinglabs.org/hudson/job/SwingX%20Weekly%20Build/javadoc/org/jdesktop/swingx/StackLayout.html">org.jdesktop.swingx.StackLayout</a>方式来实现上述功能。<br />
<br />
</span><span style="font-size: 10pt;"><strong><span style="font-size: 12pt;">1. LoadingPanel--加载指示器面板</span></strong><br />
&nbsp;&nbsp;&nbsp; 首先创建一个加载指示器面板。如前所述，我们不必使用真正的进度条作为进度指示器，仅需要使用一张动态图片来代替即可。LoadingPanel的完整代码如下所示，</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LoadingPanel&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JPanel&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1962748329465603630L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;mesg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LoadingPanel(String&nbsp;mesg)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mesg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mesg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initUI();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interceptInput();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setOpaque(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setVisible(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initUI()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JLabel&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;JLabel(mesg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setHorizontalAlignment(JLabel.CENTER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setIcon(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ImageIcon(getClass().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/path/to/spinner.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setLayout(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(label,&nbsp;BorderLayout.CENTER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> interceptInput()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MouseAdapter()&nbsp;{});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseMotionListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MouseMotionAdapter()&nbsp;{});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addKeyListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;KeyAdapter()&nbsp;{});<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addComponentListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ComponentAdapter()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;componentShown(ComponentEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestFocusInWindow();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFocusTraversalKeysEnabled(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;">
上述代码很容易理解，LoadingPanel中仅有一个JLabel，它会展示一张图片(spinner.gif)及一段信息。但有两段代码需要特别说明：<br />
[1]构造器中的两行代码</span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">setVisible(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
setOpaque(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);</span><br />
</div>
<span style="font-size: 10pt;">
LoadingPanel只在加载数据时才显示，其它时候是不显示的，所以它默认不可见。另外，在显示LoadingPanel的同时，我们仍然希望能看到数据面板，所以LoadingPanel应该是透明的。<br />
[2]interceptInput方法<br />
当LoadingPanel显示之后，我们不希望用户还能够操作数据面板，那么就需要屏蔽掉用户(鼠标，键盘)输入。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">addMouseListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MouseAdapter()&nbsp;{});<br />
addMouseMotionListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MouseMotionAdapter()&nbsp;{});<br />
addKeyListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;KeyAdapter()&nbsp;{});</span></div>
<span style="font-size: 10pt;">上述三行代码就使得LoadingPanel能捕获所有的鼠标与键盘事件，并忽略掉它们。但仅仅如此还不够，在展示LoadingPanel时，数据面板中的某个UI组件很可能已经获得焦点了，那么用户仍然可以通过键盘操控数据面板中的组件(因为系统会把键盘事件发送给当前获取焦点的组件)。而且，即使数据面板中没有任何组件获得焦点，用户仍然可以通过Tab键把焦点转移到数据面板中的组件上。为了阻止这一操作，还需要加上如下几行代码，<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">addComponentListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ComponentAdapter()&nbsp;{&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;一旦LoadingPanel可见，即获取焦点</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&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;componentShown(ComponentEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestFocusInWindow();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
});<br />
setFocusTraversalKeysEnabled(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;阻止用户转移焦点</span></div>
<span style="font-size: 10pt;"><strong><span style="font-size: 12pt;"><br />
2. 示例程序</span></strong><br />
&nbsp;&nbsp;&nbsp; 在此处的示例程序中，数据面板(dataPanel)中仅有一个按钮，当点击该按钮时会显示loadingPanel，且模糊掉dataPanel，并会启动一个新的线程，该线程会在睡眠大约3秒(模拟耗时的数据加载工作)之后隐藏loadingPanel，且使dataPanel重新清晰可见。<br />
&nbsp;&nbsp;&nbsp; 值得注意的是，该示例程序使用了<a href="https://swingx.dev.java.net/">SwingX</a>中的两个组件：<a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXPanel.html">JXPanel</a>和<a href="http://swinglabs.org/hudson/job/SwingX%20Weekly%20Build/javadoc/org/jdesktop/swingx/StackLayout.html">StackLayout</a>。JXPanel提供了一个方法(setAlpha)以方便地设置Panel的透明度(Alpha值)；而StackLayout允许在同一块区域内添加多层组件，并能同时展示所有层的组件(而，<a href="http://java.sun.com/javase/7/docs/api/java/awt/GridLayout.html">CardLayout</a>一次只能显示某一层的组件)。完整的示例程序如下所示，<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LoadDataDemo&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JFrame&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5927602404779391420L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JXPanel&nbsp;dataPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使用org.jdesktop.swingx.JXPanel，以方便设置清晰度</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;LoadingPanel&nbsp;loadingPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LoadDataDemo()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">LoadData&nbsp;Demo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initUI();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initUI()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JButton&nbsp;button&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">Load&nbsp;Data</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button.addActionListener(handler);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JXPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FlowLayout(FlowLayout.CENTER));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataPanel.add(button);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadingPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;LoadingPanel(</span><span style="color: #000000;">"</span><span style="color: #000000;">Loading<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使用org.jdesktop.swingx.StackLayout，将loadingPanel置于dataPanel的上方</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JPanel&nbsp;centerPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JXPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StackLayout());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;centerPanel.add(dataPanel,&nbsp;StackLayout.TOP);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;centerPanel.add(loadingPanel,&nbsp;StackLayout.TOP);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;container&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayout(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(centerPanel,&nbsp;BorderLayout.CENTER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">transient</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;ActionListener&nbsp;handler&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActionListener()&nbsp;{<br />
<br />
&nbsp;&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;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将dataPanel及其子组件的清晰度设置为50%；并显示loadingPanel</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataPanel.setAlpha(</span><span style="color: #000000;">0.5F</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadingPanel.setVisible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Thread()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<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;Thread.sleep(</span><span style="color: #000000;">3000L</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;睡眠约3秒钟，以模拟加载数据的过程</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<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;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;数据加载完毕后，重新隐藏loadingPanel；并使dataPanel及其子组件重新清晰可见</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadingPanel.setVisible(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataPanel.setAlpha(1F);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadDataDemo&nbsp;demo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;LoadDataDemo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;demo.setSize(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dimension(</span><span style="color: #000000;">400</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">300</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;demo.setVisible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;"><strong><span style="font-size: 12pt;"><br />
3. 不使用SwingX</span></strong><br />
&nbsp;&nbsp;&nbsp; SwingX为我们提供了一系列功能强大，使用简易的Swing扩展组件，我强烈建议你去使用它。但若因故，你不准备使用它时，我们仍然有替代的解决方案，但此处仅简述一二。<br />
[1]对于设置Alpha值，需要创建一个继承自<a href="http://java.sun.com/javase/7/docs/api/javax/swing/JPanel.html">JPanel</a>的DataPanel类，覆写paintComponent方法，在其中使用Alpha合成，<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,&nbsp;alpha));</span></div>
<span style="font-size: 10pt;">[2]对于StackLayout，我们可以使用GlassPane(玻璃窗格)或LayeredPane(分层窗格)进行替换，将LoadingPanel设置为GlassPane或LayeredPanel中的一层。由于一个JFrame只有一个GlassPane，为了程序的灵活性，一般首选使用LayeredPane。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/304120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-11-29 20:33 <a href="http://www.blogjava.net/jiangshachina/archive/2009/11/29/304120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NO Sun Tech Days 2009(China)!!!(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/10/22/299328.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 22 Oct 2009 04:20:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/10/22/299328.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/299328.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/10/22/299328.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/299328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/299328.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">NO Sun Tech Days 2009(China)!!!</span></span></strong><br />
</div>
<span style="font-size: 10pt;">今年的Sun科技日(中国站)将无法举办，<a href="http://developers.sun.com/events/techdays/locations.jsp">最新一届Sun科技日</a>将在2010年4月29-30日举行。(2009.10.23最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 在每年的下半年，都会举办Sun科技日(中国站)，但今年的Sun科技日却迟迟没有任何消息。由于Sun被Oracle收购的原故，一直担心以后再也不会有Sun科技日了(JavaOne正处于这样的猜测与争论之中)。幸运地是，Sun科技日还将举办下去；不幸地是，我今天上午刚刚确认了，今年中国站的Sun科技日将会缺失，最新的一次的Sun科技日将会在2010年4月29-30日举行。我猜想，这应该是由于Sun被收购造成了Sun科技日的不确定性，而当决定仍然举办时，已经无法在今年年内安排好会议了。从<a href="http://developers.sun.com/events/techdays/locations.jsp">最新日程表</a>来看，受影响的国家和地区不仅仅是中国，实际上2009年下半年只有巴西的圣保罗能举办Sun科技日。<br />
&nbsp;&nbsp;&nbsp; 一心等着今年的Sun科技日，看到这样的结果，只能说是悲喜参半。这其中掺杂着我对Sun科技日，Java，甚至是Sun Microsystems的一些私人情感，究其原因，无非我是一名Java开发者，特别是一位真心想学好Java，用好Java的开发者罢了。Sun Microsystems已经有了新的归宿，现在只希望Java的明天仍能美好，这也算是我的一点点私心吧。
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/299328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-10-22 12:20 <a href="http://www.blogjava.net/jiangshachina/archive/2009/10/22/299328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用SwingX与TimingFramework实现淡入淡出(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 28 Sep 2009 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/296709.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/296709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/296709.html</trackback:ping><description><![CDATA[<div align="center"><strong style="font-size: 14pt;">利用SwingX与TimingFramework实现淡入淡出</strong><br />
</div>
<span style="font-size: 10pt;">本文使用<a href="https://swingx.dev.java.net">SwingX</a>与<a href="https://timingframework.dev.java.net">TimingFramework</a>展示了如何实现淡入淡出效果，程序简洁实用，希望对大家能有所助益。(2009.09.28最后更新)<br />
<br />
在Swing中使用<a href="http://java.sun.com/javase/6/docs/api/java/awt/AlphaComposite.html">AlphaComposite</a>设置界面的半透明度，再配合<a href="http://java.sun.com/javase/6/docs/api/javax/swing/Timer.html">javax.swing.Timer</a>可以比较容易地实现淡入淡出效果。但需要我们继承具体的UI组件，并重写它的paintComponent方法，同时还要为Timer提供一个ActionListener的实现。这些对于程序员来说，显得有些乏味。<br />
&nbsp;&nbsp;&nbsp; 幸运地是，SwingX中的JXPanel(JPanel的子类)通过setAlpha方法来设置半透明度，JXPanel中的所有UI组件都可随之半透明化。TimingFramework提供的Animator可以帮助我们非线性地设置JXPanel中的alpha值。故，我们在实现淡入淡出时，可以使用JXPanel来替代JPanel，用Animator来替代Timer。<br />
<img src="http://farm3.static.flickr.com/2567/3969155982_d8c1118b6c_o.png" alt="" /><br />
<img src="http://farm4.static.flickr.com/3452/3968381881_250129774e_o.png" alt="" /> <img src="http://farm3.static.flickr.com/2518/3969156126_0dbc8a627c_o.png" alt="" />
<br />
&nbsp;&nbsp;&nbsp; 下面是一个非常简单的示例，该示例在一个使用CardLayout的JPanel--cardPanel，中另包含了两个JXPanel--panelA和panelB，这两个子容器中又分别有一个JButton--buttonA和buttonB。当点击buttonA时，将淡入显示panelB；当点击buttonB时，将淡入显示panelA。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;FadingCardDemo&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JFrame&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">8005909309849021746L</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;CARD_A&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CARD_A</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;CARD_B&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CARD_B</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JPanel&nbsp;cardPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JXPanel&nbsp;panelA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JXPanel&nbsp;panelB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JButton&nbsp;buttonA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JButton&nbsp;buttonB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;FadingCardDemo()&nbsp;{<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">FadingButton&nbsp;Demo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initUI();<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initUI()&nbsp;{<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cardPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CardLayout());<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">Button&nbsp;A</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonA.addActionListener(actionHandler);<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JXPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelA.add(buttonA,&nbsp;BorderLayout.CENTER);<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cardPanel.add(panelA,&nbsp;CARD_A);<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">Button&nbsp;B</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonB.addActionListener(actionHandler);<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JXPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelB.add(buttonB,&nbsp;BorderLayout.CENTER);<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cardPanel.add(panelB,&nbsp;CARD_B);<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;container&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getContentPane();<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayout(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(cardPanel,&nbsp;BorderLayout.CENTER);<br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;ActionListener&nbsp;actionHandler&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActionListener()&nbsp;{<br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Animator&nbsp;animator&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&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;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(animator&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Animator(</span><span style="color: #000000;">2000</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.setDeceleration(</span><span style="color: #000000;">0.2F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.setAcceleration(</span><span style="color: #000000;">0.4F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"> if (animator.isRunning()) {<br />
</span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.stop();<br />
</span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JButton&nbsp;button&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(JButton)&nbsp;e.getSource();<br />
</span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(button&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;buttonA)&nbsp;{<br />
</span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.addTarget(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PropertySetter(panelB,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">alpha</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0F</span><span style="color: #000000;">));<br />
</span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelB.setAlpha(</span><span style="color: #000000;">0.1F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((CardLayout)&nbsp;cardPanel.getLayout()).show(cardPanel,&nbsp;CARD_B);<br />
</span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(button&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;buttonB)&nbsp;{<br />
</span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.addTarget(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PropertySetter(panelA,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">alpha</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0F</span><span style="color: #000000;">));<br />
</span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelA.setAlpha(</span><span style="color: #000000;">0.1F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((CardLayout)&nbsp;cardPanel.getLayout()).show(cardPanel,&nbsp;CARD_A);<br />
</span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.start();<br />
</span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</span><span style="color: #008080;">66</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwingUtilities.invokeLater(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Runnable()&nbsp;{<br />
</span><span style="color: #008080;">69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;run()&nbsp;{<br />
</span><span style="color: #008080;">70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FadingCardDemo&nbsp;demo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FadingCardDemo();<br />
</span><span style="color: #008080;">71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;demo.setSize(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dimension(</span><span style="color: #000000;">400</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">300</span><span style="color: #000000;">));<br />
</span><span style="color: #008080;">72</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;demo.setVisible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
</span><span style="color: #008080;">75</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">76</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<img src ="http://www.blogjava.net/jiangshachina/aggbug/296709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-09-28 09:46 <a href="http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最大限度利用Maven settings.xml文件(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 14 Aug 2009 11:13:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/291103.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/291103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/291103.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">最大限度利用Maven settings.xml文件</span></strong></span><br />
</div>
<span style="font-size: 10pt;">
<a href="http://weblogs.java.net/blog/johnsmart/">John Ferguson</a>在他的<a href="http://weblogs.java.net/blog/johnsmart/archive/2009/08/getting_the_mos.html">最新Blog</a>中，介绍了使用<a href="http://maven.apache.org/">Maven</a> <a href="http://maven.apache.org/settings.html">settings.xml</a>文件的一些鲜为人知的技巧，希望对大家也有所助益。(2009.08.14最后更新)<br />
<br />
<span style="font-size: 10pt;">
</span></span><span style="font-size: 10pt;">如果你在任何程度中使用过Maven，你应该知道settings.xml文件。<a href="http://maven.apache.org/settings.html">settings.xml</a>文件包含有与系统环境相关的配置细节，例如代理配置，仓库，服务器的用户名和密码，等等。<br />
下面是一个典型的settings.xml文件的示例：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">settings&nbsp;</span><span style="color: rgb(255, 0, 0);">xmlns</span><span style="color: rgb(0, 0, 255);">="http://maven.apache.org/SETTINGS/1.0.0"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;xmlns:xsi</span><span style="color: rgb(0, 0, 255);">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: rgb(0, 0, 255);">="http://maven.apache.org/SETTINGS/1.0.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">localRepository</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">C:/maven/repository</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">localRepository</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">proxies</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">proxy</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">localproxy</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">active</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">active</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">protocol</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">http</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">protocol</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">host</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">proxy.acme.com</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">host</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">port</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">8080</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">port</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">scott</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">t0ps3cr3t</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">nonProxyHosts</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">*.acme.com</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">nonProxyHosts</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">proxy</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">proxies</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servers</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">server</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">dbserver</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">scott</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">tiger</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">server</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servers</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">settings</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<span style="font-size: 10pt;">例如，若你使用公司的环境，在该环境中，你的Maven主目录是每天早晨当你登录时由网络传输的，<strong>localRepository</strong>元素就会非常有用。在这种情况 下，将本地仓库置于你本地磁盘的不同目录中，将会节约大量的带宽。<br />
你也可以在settings.xml文件中定义仓库，镜像，概述和属性。在此处，我不想涉及上述内容，因为在其它地方已经有关于它们的很好的文档了。<br />
很少为人所知，或至少是很少被使用的功能是，</span>在你的pom.xml文件中使用定义在settings.xml文件中的数据。<span style="font-size: 10pt;">事实上，你能使用settings.xml中的任一元素，然而其中的一些则更为有用。<br />
一个普遍且方便的例子就是使用<strong>localRepository</strong>变量。你可能需要将该变量置于一个脚本中，或使用它来引用仓库中的某个特定的JAR文件(尽管通常有更优雅的方案来解决这一问题)。你可以通过简单地引用<strong>${settings.localRepository}</strong>来使用<strong>localRepository</strong>属性。例如，在下面的代码中，我们调用一个Ant脚本，并通过名为"localRepository"的属性传给它一个本地仓库路径：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.apache.maven.plugins</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">maven-antrun-plugin</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">generate-stuff</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">pre-comile</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">run</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">tasks</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ant&nbsp;</span><span style="color: rgb(255, 0, 0);">target</span><span style="color: rgb(0, 0, 255);">="generate"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="localRepository"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;value</span><span style="color: rgb(0, 0, 255);">="${settings.localRepository}"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">ant</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">tasks</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<span style="font-size: 10pt;">做更多有趣的事情，特别是当你也在构建中集成了<a href="http://groovy.codehaus.org/GMaven">Groovy</a>时。例如，假设在集成测试阶段期间，我们需要确保特定的SQL脚本已在数据库中执行过了。我们有一个名为update-scripts.groovy的Groovy脚本来做这件事情，但它需要以命令行参数的形式提供用户名和密码。在集成测试阶段之前，你应如何使用定义在settings.xml中的用户名和密码呢？是的，只需一点儿Groovy魔术，没有比这儿更简单的了。<strong>settings</strong>对象可用于任何集成到pom.xml中的Groovy脚本，所以你可像使用一个普通对象那样方便地使用它，如下示例：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.codehaus.groovy.maven</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">gmaven-plugin</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">1.0-rc-5</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">process-db-scripts</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">pre-integration-test</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">execute</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">source</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;server&nbsp;=&nbsp;settings.servers.find{&nbsp;it.id.equals('dbserver')&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""groovy&nbsp;update-scripts.groovy&nbsp;-Ddb.username=${server.username}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Ddb.password=${server.password}""".execute()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">source</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<span style="font-size: 10pt;">简单！</span><span style="font-size: 10pt;">事实上，一旦你既知道如何访问顶级变量，又知道如何访问settings.xml中的各个元素，那么其功效将不可限量！只需记住一定要使你的构建保持弹性--例如，不要在settings.xml文件中定义那些在pom.xml文件中无有效默认值的属性。<br />
如果你想学习更多关于应用Maven的酷炫方法，查看最新的<a href="http://www.sonatype.com/solutions/training">来自于Sonatype的在线课程</a>。或者，为了有一个更具全景的视角，可以参加<a href="http://www.wakaleo.com/training/java-power-tools-bootcamp">Java Power Tools bootcamp</a>会议--很快在堪培拉，悉尼，布里斯班和惠灵顿就有研讨会了。 <br />
</span><br />
<img src ="http://www.blogjava.net/jiangshachina/aggbug/291103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-08-14 19:13 <a href="http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的CheckBox Tree实现(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Wed, 05 Aug 2009 13:10:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/289996.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/289996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/289996.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">一个简单的CheckBox Tree实现</span></span></strong><br />
</div>
<span style="font-size: 10pt;">CheckBox Tree是一个十分常用的UI组件，它能使用户方便地按特定规则勾选树中的节点。</span><span style="font-size: 10pt;">本文实现了一种简单的Checking规则：当勾选了某节点后，该节点的所有下级节点全部被勾选；当取消勾选某节点后，该节点的所有下级节点全部被取消勾选。(2009.08.05最后更新)<br />
<br />
</span><span style="font-size: 10pt;">实现CheckBox Tree的常用方法，就是使用JCheckBox作为JTree的TreeCellRendrer，并且需要实现特定的Checking规则来勾选/取消勾选CheckBox。<br />
<br />
<strong><span style="font-size: 12pt;">1. 树节点</span></strong><br />
DefaultMutableTreeNode是最常用的TreeNode实现，此处我们将扩展这一实现--CheckBoxTreeNode，增加一个属性<span style="color: #2000ff;">isChecked</span>，用于标识该节点是否要被勾选上。该类的完整代码如下所示：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CheckBoxTreeNode&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;DefaultMutableTreeNode&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3195314943599939279L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isChecked&nbsp;</span><span style="color: #000000;">=</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;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CheckBoxTreeNode(Object&nbsp;userObject)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(userObject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<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;">boolean</span><span style="color: #000000;">&nbsp;isChecked()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;isChecked;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<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;setChecked(</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isChecked)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isChecked&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;isChecked;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;"><br />
<strong><span style="font-size: 12pt;">2. 渲染器</span></strong><br />
如本文开头所述，我们将使用JCheckBox作为树节点展现形式的渲染器，同时确定对节点进行勾选或取消勾选的规则。CheckBoxTreeCellRenderer本身即是一个JCheckBox，那么在实现<span style="color: #2000ff;">getTreeCellRendererComponent</span>方法时，只简单地返回它自己的实例即可，而对于勾选或取消勾选的条件，则由CheckBoxTreeNode中的<span style="color: #2000ff;">isChecked</span>属性来确定，完整的代码如下所示：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CheckBoxTreeCellRenderer&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JCheckBox&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;TreeCellRenderer&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">6432020851855339311L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CheckBoxTreeCellRenderer()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setOpaque(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Component&nbsp;getTreeCellRendererComponent(JTree&nbsp;tree,&nbsp;Object&nbsp;value,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;selected,&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;expanded,&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;leaf,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;row,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;hasFocus)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckBoxTreeNode&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((CheckBoxTreeNode)&nbsp;value);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取树节点对象。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setText(node.toString());&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置CheckBox所展示的文本。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;当树节点被设置为勾选时，则该节点对应的CheckBox被勾选上；否则，取消勾选。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node.isChecked())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSelected(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setForeground(Color.BLUE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSelected(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setForeground(tree.getForeground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;"><br />
<strong><span style="font-size: 12pt;">3. 树</span></strong><br />
此处对JTree进行扩展，创建CheckBoxTree，该类只是为JTree添加了一个MouseListener，以侦听鼠标选中树节点后，如何设置勾选标记，并重绘树。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CheckBoxTree&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JTree&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">217950037507321241L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CheckBoxTree(TreeModel&nbsp;newModel)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(newModel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addCheckingListener();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addCheckingListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MouseAdapter()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;mousePressed(MouseEvent&nbsp;e)&nbsp;{<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;row&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getRowForLocation(e.getX(),&nbsp;e.getY());<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;&nbsp;&nbsp;&nbsp;&nbsp;TreePath&nbsp;treePath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getPathForRow(row);<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(treePath&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<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;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<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;&nbsp;&nbsp;&nbsp;&nbsp;CheckBoxTreeNode&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((CheckBoxTreeNode)&nbsp;treePath.getLastPathComponent());<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;checking&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">node.isChecked();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果该节点已被勾选上，则此次将取消勾选；反之，亦反。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&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;checkNode(node,&nbsp;checking);<br />
<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;&nbsp;&nbsp;&nbsp;&nbsp;repaint();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;重绘整棵树。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;递归地勾选或取消勾选指定节点及其所有下级节点的CheckBox。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;checkNode(CheckBoxTreeNode&nbsp;node,&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;checking)&nbsp;{<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;&nbsp;&nbsp;&nbsp;&nbsp;node.setChecked(checking);<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">node.isLeaf())&nbsp;{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CheckBoxTreeNode</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;children&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.children();<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(children.hasMoreElements())&nbsp;{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkNode(children.nextElement(),&nbsp;checking);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;">上述程序有两个关键点：1. 设置当前节点及其子节点的勾选标记--<span style="color: #5000ff;">checkNode</span>；2. 重绘树--<span style="color: #2000ff;">repaint</span>。调用repaint方法对树进行绘制时，方法<span style="color: #2000ff;">TreeCellRenderer.getTreeCellRendererComponent</span>就会被调用，此时程序就会根据<span style="color: #2000ff;">checkNode</span>方法设定的<span style="color: #2000ff;">isChecked</span>来勾选或取消勾选对应的树节点CheckBox。简言之，就是先设置树型数据中的勾选标记，然后渲染器再根据这些标记来渲染CheckBox。<br />
</span><br />
<img src ="http://www.blogjava.net/jiangshachina/aggbug/289996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-08-05 21:10 <a href="http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Store, Q&amp;A(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 05 Jul 2009 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/285528.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/285528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/285528.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;"><a href="http://weblogs.java.net/blog/joshy/archive/2009/06/the_java_store.html">Java Store, Q&amp;A</a></span></strong></span><br />
</div>
<span style="font-size: 10pt;">在今年的JavaOne中，比较重要的议题之一就是Java应用商店。目前还没机会亲身体会一下这个商店，但我至少认为Java应用商店为广大Java程序员提供了一个新的展示自我的平台。Please show yourself! (2009.07.05最后更新)<br />
<br />
Java Store是JavaOne中最重大的消息之一。我格外为之骄傲，因为在过去的几个月中我一直秘密地为其工作。由于这一消息，我收到了一大堆关于该商店的问题，以及如何将它与Java生态系统中的其它部分相关联。出于对已极佳的<a href="http://java.sun.com/warehouse/reference/faq/">FAQ</a>的补充，我想应该再回答一些问题。<br />
<strong><br />
简约概括一下你所宣布的消息</strong><br />
我们已经发布了Java Store的私有Beta版，是一个桌面的客户端应用，它允许大家浏览并购买桌面Java应用；还有一个Java仓库的开放Beta版，为了分发应用程序，开发者们可将这些应用程序上传到这个仓库中。现在你就可以登录并浓度一下这个<a href="http://www.java.com/en/store/index.jsp">商店</a>和<a href="http://java.sun.com/warehouse/">仓库</a>。目前，这个商店和仓库只针对美国用户，很快将有更多的国家能够使用。<br />
<br />
<strong>我可以使用除JavaFX之外的其它语言来做用于Java Store的程序吗？</strong><br />
是的！不仅仅是Java和JavaFX，所有基于JVM的语言都是允许的。记住，最终用户并不关心你的应用是用什么语言写的。他们只关心你所做的应用是有用的，看起来和用起来都很好。<br />
<br />
<strong>商店中的应用程序有哪些限制？</strong><br />
查看<a href="http://java.sun.com/warehouse/reference/faq/">FAQ</a>，可以得到全部的细节，但简要的回答是：任何的JVM语句；必须面向消费者；(目前)小于50M；必须是未签名，或使用有效认证的签名。在该商店商用之前，所有的应用都是免费的，商用之后你就需要付费。此处包含的细节很少，但这些都是基本的。<br />
<br />
<strong>何时才允许我贩卖应用程序？</strong><br />
我们将尽快。商店还未开张。但最终，你不会拥有一个货架空空如也的商店。这就是为什么我们要给你们，开发者，时间去准备好你们的应用。当我们向商用开放这个商店时，你就能够标上价格并开始售卖了。<br />
<br />
<strong>顾客将如何找到我的应用程序？</strong><br />
你在JavaOne大会上看到的桌面客户端只是第一个版本。我们已在努力工作，向商店加上新的特性，这将使得顾客们找到你的应用。将有诸如查找，过滤，排序和评论之类的新特性。最后，Java Store将会随Java发布，这就使得你的应用能被近百万人发现。<br />
<br />
<strong>移动和TV应用将会怎样？</strong><br />
Java Store实际包含两个方面。店面是一个桌面客户端程序，它使你能够购买桌面应用。还有一个Java Warehouse，这是你，即开发者，存放待售应用程序的地方。在未来，还会增加针对电视和移动应用的店面，可能会carrier branded。你所存放应用程序的Java Warehouse将为所有的这些店面提供服务。桌面应用只是令人激动的第一步罢了。<br />
<br />
<strong>现在商店里都哪些应用了？他们来自于何处？</strong><br />
我们与许多伙伴公司一同工作为这个商店构建新的应用，以及修改已有的应用程序。我个人的最爱是Astronomy Picture of the Day，由位于俄勒冈州Eugene的一个名为<a href="http://www.concentricsky.com/">Concentric Sky</a>的公司创建的。这个程序与NASA的太空图片相连接，能使你浏览以前的图片，阅读图片说明，甚至还能使用Google Translate将文本翻译成其它语言。请看Concentric Sky的CEO在他们的博客中<a href="http://www.concentricsky.com/">对Java Store和JavaFX的描述</a>。<br />
<br />
<strong>为什么开发者们不能在其它国家登录？什么时候才能允许我们在其它国家贩卖应用程序？</strong><br />
我们将尽可能快的在其它国家开放这个商店。国际贸易要比你所想象的还要复杂的多(作为一个工程师，我感到十分的吃惊)。每个国家在税率，私有权和商业方面都有不同的法规。现在我们有法律和商业方面的伙记们在这些问题而工作。当前，我们计划在2010年的早些时候实现这一目标，但是如果我们能做得更快些，那一定会告诉你。<br />
<br />
为了使消息更清晰，我们让Jeet Kaul，Java的高管之一，作一些解释：(点击观看) <br />
<a href="http://blogs.sun.com/webmink/entry/tweetswoop_us_only_java_store"><img src="http://weblogs.java.net/blog/joshy/javastore/SafariScreenSnapz024.png" alt="SafariScreenSnapz024.png" border="0" width="418" height="239" /></a><br />
如果你有任何关于Java Store的问题，请发邮件给我，或者在我们的反馈页面中提交你的评论。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/285528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-07-05 09:48 <a href="http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树的汇总(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/06/26/283467.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 25 Jun 2009 23:11:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/06/26/283467.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/283467.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/06/26/283467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/283467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/283467.html</trackback:ping><description><![CDATA[<div align="center">
<strong><font size="-1"><span style="font-size: 14pt;">树的汇总</span></font></strong><br />
</div>
<font size="-1">继上次浅谈了<a href="http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html">树的遍历</a>之后，这次再浅谈一下树的汇总。<wbr>此处的汇总是指将树中某个节点的数据按指定的规则汇集到它的父节点中。<wbr>例如，可以将树节点中的数值累加到它的父节点中。<wbr>仍如<a href="http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html">树的遍历</a>一文，我将使用两种简单的算法，递归与和迭代，<wbr>来实现这一功能。(2009.08.09最后更新)<br />
<br />
<strong><span style="font-size: 12pt;">1. 树节点</span></strong><br />
仍然沿用树的遍历一文中的TreeNode/<wbr>GenericTreeNode，为便于阅读，<wbr>将GenericTreeNode中的若干关键属性展示如下，<br />
</font>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;T&nbsp;userObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;children&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
}</span></div>
<font size="-1"><br />
<strong><span style="font-size: 12pt;">2. 递归法</span></strong><br />
仍然先从最简单的递归法开始，<br />
</font>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Double&nbsp;recursiveGatherValue(GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;sumValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node.isLeaf())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;node.getUserObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.getUserObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;children&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.getChildren();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;children.size();&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;bufGatherValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;recursiveGatherValue(children.get(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumValue&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;bufGatherValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;node.setUserObject(sumValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;sumValue;<br />
}</span></div>
<font size="-1">递归法还是一如既往的简单易懂。与递归遍历树相比，<wbr>递归汇总树的程序基本上没大的变化，我就不赘述了...<br />
<br />
<strong><span style="font-size: 12pt;">3. 迭代法</span></strong><br />
与迭代遍历树相比，迭代汇总树的程序有一些明显的变化。<wbr>当初在思考迭代法时，有个问题一直困绕着我：<wbr>如何将下级节点的值赋给它的父节点，并且父节点的值要不断的进行累加。在<a href="http://www.javaworld.com.tw/jute/index.html">JavaWorld@TW</a>中提出这个问题之后<wbr>，很快就得到了<a href="http://www.javaworld.com.tw/jute/post/view?bid=29&amp;id=253828&amp;sty=1">清晰的解答</a>(真的很感谢社区里的大大们)。<wbr>毫无疑问，用迭代法遍历一棵树时需要使用一个栈，但同时，为了维护节点与汇总值之间的关系，<wbr>还需要另一个栈进行辅助。具体程序如下所示，<br />
</font>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;iterativeGatherValue(GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">NodeValueTuple</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;nodeValueStack&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">NodeValueTuple</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;nodeStack&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodeStack.push(node);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;sumValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Double(</span><span style="color: #000000;">0.0D</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">nodeStack.isEmpty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;bufNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nodeStack.pop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bufNode&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NodeValueTuple</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;bufNodeValueTuple&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nodeValueStack.pop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bufNodeValueTuple.node.setUserObject(sumValue);<br />
<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sumValue&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">bufNodeValueTuple.value</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bufNode.isLeaf())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumValue&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;bufNode.getUserObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodeValueStack.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;NodeValueTuple</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(bufNode,&nbsp;sumValue));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Double(</span><span style="color: #000000;">0.0D</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodeStack.push(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodeStack.addAll(bufNode.getChildren());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<font size="-1">在遍历树的过程中，会将某节点N与它的汇总值一同置入一个栈(<wbr>nodeValueStack)中，当节点N有子节点时，<wbr>则将它的子节点及其汇总值也置入栈中，节点N与它的子节点之间使用一个NULL值进行分隔；<wbr>如果节点N是叶节点则累加汇总值；如果节点N为NULL，<wbr>则表示子节点们的汇总已结束。<br />
NodeValueTuple是一个二元组，<wbr>用于维护节点与它的汇总值之间的关系，代码如下所示，<br />
</font>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;NodeValueTuple</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;V&nbsp;value;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;NodeValueTuple(GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node,&nbsp;V&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<font size="-1">在上述的汇总中，均只累加了叶节点中的数值，<wbr>而不管分枝节点和根节点本身所拥有的数值。<wbr>如果要累加这些节点本身的数值，应该如何做呢？<wbr>大家自己做做看吧，肯定非常简单 ^_^<br />
<br />
<strong><span style="font-size: 12pt;">4. 小结</span></strong><br />
树的汇总肯定是一个十分常见的应用，除了汇总数据之外，<wbr>我们还可以汇集节点中的对象，<wbr>如汇总挂载在节点上的集合对象中的元素，<wbr>使得父节点能够拥有所有子节点所拥有的元素。上述方法的效率应该不算低，<wbr>主要是因为所有的树节点只需要访问一次。<br />
<br />
</font>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/283467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-06-26 07:11 <a href="http://www.blogjava.net/jiangshachina/archive/2009/06/26/283467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Duke's Choice Award 2009(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/06/04/280026.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 04 Jun 2009 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/06/04/280026.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/280026.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/06/04/280026.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/280026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/280026.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">Duke's Choice Award 2009</span></span></strong><br />
</div>
<span style="font-size: 10pt;">在一年一度的JavaOne中，总会选出几个当年度最具代表性、创造性的Java应用，今年当然也不能例外。就在昨天，2009年度的<a href="http://java.sun.com/javaone/2009/articles/2009dukeschoiceawards.jsp">Duke's Choice Award</a>新鲜出炉了，我相信其中的一些应用大家也会很感兴趣的。(2009.06.08最后更新)<br />
<br />
每年，Duke's Choice Award委员会将邀请Java社区的成员提名得到认可的最好且最具创新性的<a href="http://java.sun.com/">Java</a>应用。委员会的领导小组--包括James Gosling，为人熟知的Java技术之父--会根据这些基于Java的应用和服务的创造性来选出其中的优胜者。现在在它的第七个年头里，委员会认可了2009年度Duke's Choice Award的胜出者们，由于他们酷炫的工具，技术和产品。<br />
今年，该委员会在如下领域中给出了10项大奖：<br />
# 终身成就奖：金Duke奖<br />
# 最佳桌面游戏<br />
# Java无处不在!<br />
# Java技术在开发者解决方案中<br />
# Java技术在教育领域中<br />
# Java技术在环境领域中<br />
# Java技术在网络解决方案中<br />
# Java技术工具<br />
<strong><br />
终身成就奖：金Duke奖<br />
<a href="http://www.lincvolt.com/">LincVolt, Perrone Robotics</a></strong>
<br />
使用新方法来添加燃料，19.5英尺长，2.5吨重的1959款林肯大陆敞篷汽车已处于创新的领导地位了。LincVolt轿车寻找清洁的汽车动力技术，并完全不需要在路边加油。这项令人鼓舞的项目由一些最受人尊敬的技术，包括Java技术，所支撑。Perrone Robotics是这项空前构想背后的助力，该公司致力于利用开源技术创建跨越平台和软件的机器人技术。可在JavaOne的<a href="http://java.sun.com/javaone/2009/activities.jsp#Playground">Change (Y)our World Playground</a>中观看LincVolt。<br />
<br />
<strong>最佳桌面游戏</strong><br />
<strong><a href="http://www.jagex.com/">Runescape, Jagex, Ltd.</a></strong><br />
Jagex, Ldt.已成为在线视频游戏行业中的领导者，它创建了世界上最大的大型多人在线游戏(MMOG)之一，Runescape。从2001该项目启动开始，Runescape已成为全球最大的MMOG之一，并完成了一个支持高清游戏的引擎。同时，Jagex, Ltd.还启动了游戏门户网站<a href="http://www.funorb.com/">FunOrb.com</a>，该站点为所有类型的客户提供奇妙的基于Java技术的游戏。<br />
<br />
<strong>Java无处不在!<br />
</strong>
<a href="http://www.terracotta.org/web/display/orgsite/Whats+New+Terracotta+3.0"><strong>Terracotta 3.0</strong> </a><br />
Terracotta 3.0为将基于Java的应用程序部署到所需众多的计算机中提供了一种廉价且方便的方法，该方法同时确保了高可用性和高扩展性。由于减少了部署时间，Terracotta极大地减少了支撑Web应用所需要的运营和资金成本。Terracotta 3.0已应用众多跨行业领域，例如旅游，游戏，金融服务，通信，健康服务和社会化网络。因为Terracotta使用Java技术，如果你知道Java，你就知道Terracotta。<br />
<br />
<strong>Java技术在开发者解决方案中<br />
<a href="http://www.reportmill.com/">DataBox, ReportMill Software, Inc.</a></strong>
<br />
来自于ReportMill的软件，DataBox，是一个即时的Java应用程序构建工具，它提供你所需的一切以便捷地创建及部署基于Java技术的应用。从创建数据库表到设置应用程序表单和报表，DataBox能够在任一浏览器中部署Applet应用。原本常常需要多种工具，广博技术和大量时间的程序部署，在使用DataBox后将会很快完成。<br />
<br />
<strong>Java技术在教育领域中<br />
<a href="http://www.alice.org/">Alice 3, Carnegie Mellon University</a></strong>
<br />
由卡内基-梅隆大学的学生们创建的Alice是一个one-of-a-kind项目，它帮助孩子们学习复杂的Java程序设计语言及其语法，并能带来无穷乐趣。3D动画提供可视化的自然的程序，以帮助学生们理解程序的执行，并捕捉由程序产生的逻辑错误。由Electronic Arts捐赠的，来自于Sims 2.0的成果为学生们提供了许多角色，场景和高水平的动画，以创建电影和游戏，这些将成为富有刺激的环境和充满活力的体验。可在JaveOne的<a href="http://java.sun.com/javaone/2009/activities.jsp#Playground">Change (Y)our World Playground</a>中访问到卡内基-梅隆大学的该团队。<br />
<br />
<strong>Java技术在教育领域中<br />
<a href="http://www.wpi.edu/">Worcester Polytechnic Institute</a></strong>
<br />
伍斯特理工学院(WPI)，美国最历史最悠久、最具领导性的理工学院之一，寻找一种方法来应用在教室中所学到的知识以去影响社会，并改善其他人的生活。这就是WPI全体教师的一项使命，他们教育具有天赋的学生们为每个人去创造，发现和传播知识，并展示知识如何用于日常生活中。使用像Java和 NetBeans这样的开源软件，WPI发起了<a href="http://first.wpi.edu/FRC/index.html">FIRST Robotics竞赛</a>，该竞赛旨在于帮助高中年龄段的年轻人们发现工程化生活是如何的有趣、有益。<br />
<strong><br />
Java技术在环境领域中<br />
<a href="http://www.sealite.com.au/">Unique GSM Modules With Java Technology, Sealite Company</a></strong>
<br />
Sealite公司创建的产品只需要很低的电能，使用的是太阳能，并通常只需要很少甚至不需要任何维护。Sealite最负盛名的创新就是一种独一无二的使用Java技术的基于GSM移动电话的监控与报警系统。该系统允许用户监控一种适用于特制SIM卡的航标灯，每个SIM卡都有一个特定的编号，无需离开海岸就能检查这些航标灯。该GSM监控与报警系统能从全球任何地方提供实时的信息。这种低成本和高度集成的系统降低了维护与运营成本，并提高了航行的安全性。<br />
<br />
<strong>Java技术在网络解决方案中<br />
<a href="http://www.ndsatcom.com/en/">
The NetBeans Satellite Tracking System, ND SatCom Network Management Systems</a></strong>
<br />
在卫星网络与系统行业有着超过25年经验的ND SatCom公司已成长为该领域的领导性公司之一。ND SatCom公司针对国防网络的网络管理系统，由1116个NetBeans平台模块组成，它基于一个符合国际标准的、开放的，层次化的架构。系统管理模块作用于系统层次的网络计划，资源管理和配置管理，同时该系统可由多个网络组成。NetBeans卫星跟踪系统由大约一百万行手写代码，三百五十万行生成的代码，超过十万行用于元器件通信的C++代码和超过1000个NetBeans模块组成。<br />
<br />
<strong>Java技术在开源社区中<br />
<a href="http://www.mifos.org/">
Mifos</a></strong>
<br />
基于Wbs的管理信息系统Mifos利用一个中央化的开源技术平台去帮助小额金融机构(MFI)高效地为穷人提供金融服务，并对抗全球性的贫困。为了满足数百万人对金融服务的需要，MFI需要一个可靠且可扩展的系统--<a href="http://java.sun.com/javase/">Java SE 6平台</a>。作为一个健壮而成熟的程序设计语言，它还拥有着世界范围的忠实且睿智的开发者社区，Java SE 6帮助Mifos构建一个社区驱动的平台，使技术赋予穷人力量，以使他们自己摆脱贫穷。由于这个由相关个体参与，协作，创造和采用的社区，Mifos选择了开源技术，同时也为透明性，高品质性，弹性和长效性提供了空间。<br />
<br />
<strong>Java技术工具<br />
<a href="http://www.atlassian.com/software/clover/">Clover, Atlassian</a></strong>
<br />
Clover是一个Java代码覆盖工具，它拥有测试级别的洞察力，即时IDE反馈，交互式报表和测试优化。除了覆盖率之外，Clover通过识别项目风险及速效来深入到用户的测试中。Clover可识别特定的测试以覆盖代码中的不同行，也能识别执行哪些测试去覆盖所作的特定改变。由于可集成到IDE中，你不废吹灰之力就能利用Clover洞察测试的能力了。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/280026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-06-04 16:42 <a href="http://www.blogjava.net/jiangshachina/archive/2009/06/04/280026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无人使用的Java语言特性(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/04/28/267990.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 28 Apr 2009 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/04/28/267990.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/267990.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/04/28/267990.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/267990.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/267990.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">无人使用的Java语言特性</span></strong></span><br />
</div>
<span style="font-size: 10pt;">JavaLobby上的一位读者兼作者读了<a href="http://java.dzone.com/articles/top-10-unused-features-java">Java十大最无用特性</a>之后，也列出了自己心中<a href="http://java.dzone.com/articles/java-language-features-nobody">无人使用的Java语言特性</a>，大家也可以过来评评...(2009.04.28最后更新)<br />
<br />
之前，我在JavaLobby上读了Anthony Goubard的"<a href="http://java.dzone.com/articles/top-10-unused-features-java">Java10大最无用的特性</a>"。我同意他的一些选择，但我认为他忽略了一些无人使用的关键特性。我仅将自己限制在语言级特性上(API 太庞大了)，下面是另外4个未被使用的Java特性。<br />
4. short数据类型<br />
你在使用它？我不相信。每个人当他想使用整型时，都会使用int，即便他们并不需要32位的范围。<br />
<br />
3. 八进制字面量<br />
现在谁会使用八进制数？对于二进制数值，十六进制会更加方便。更糟糕的是，以0开头的八进制字面量会令人困惑：<br />
int a = 60;<br />
int b = 060;<br />
System.out.println(a + b); // Prints 108.<br />
<br />
2. 局部类<br />
Java有4种内部类，其中的3种被广泛使用。如同静态内部类，命名的内部类，以及匿名内部类，你也可以在方法内部定义命名的类，尽管在现实中很少看到这一情况。<br />
public class TopLevelClass<br />
{<br />
&nbsp;&nbsp;&nbsp; public void someMethod()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class LocalClass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Some fields and methods here.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LocalClass forLocalPeople = new LocalClass();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
1. 严格的浮点数<br />
也许在某个地方，Java的strictfp关键字对某个程序员十分重要，但我还没遇到过他/她。如果你知道如何使用strictfp，你可能就是前5% 的Java程序员了。如果你还不知道strictfp，你该看看<a href="http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#249198">这儿</a>，欢迎进入前5%的行列。但基本上有必要先确定你的计算在所有平台下都是错误的。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/267990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-04-28 22:24 <a href="http://www.blogjava.net/jiangshachina/archive/2009/04/28/267990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java十大最无用特性(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/04/17/266233.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 17 Apr 2009 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/04/17/266233.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/266233.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/04/17/266233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/266233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/266233.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">Java十大最无用特性</span></strong></span><br />
</div>
<span style="font-size: 10pt;"><span style="font-size: 10pt;">Java已经很庞大了，其中确实充斥了很多不常用的功能，<a href="http://java.dzone.com">JavaLobby</a>中的一篇文章评出了<a href="http://java.dzone.com/articles/top-10-unused-features-java">十大最无用特性</a>。但我并不完全认同作者的观点，大家也可以过来点评一二...(2009.04.18最后更新)<br />
<br />
10) const，goto<br />
什么？没错，它们都是Java的关键字，但它们什么也不干。<br />
<br />
9) Java的些许趣味<br />
像<a href="http://java.sun.com/products/personaljava/">Personal Java</a>，<a href="http://en.wikipedia.org/wiki/JavaOS">JavaOS</a>。<br />
<br />
8) 索引化的Jar<br />
索引化的Jar是指这样的Jar文件中包含有一个特殊的索引文件(META-INF/INDEX.LIST)，该文件用于指定该Jar中有哪些包。在Ant中，可用index="true"。它的目的是为了Applet和Webstart应用能够延迟加载Jar文件，并提高类加载的速度。<br />
<br />
7) bin目录中的多数exe文件<br />
例如，javah.exe，javadoc.exe，jdb.exe，jar.exe。它们已被<a href="http://ant.apache.org/">Ant</a>，<a href="http://maven.apache.org/">Maven</a>和IDE取代了。<br />
<em>译者：虽然较少直接使用这些工具，但学会使用它们还是很有好处的。比如，在某时，我们手边并没有Ant，Maven或Eclipse之类的工具，特别当只是出于简单的应用，直接使用命令会更加便捷。</em><br />
<br />
6) Applet<br />
它在10年前很流行，从那开始，它的流行度就一直在下降。但Applet将会在Java SE 6 update 10中卷土重来。<br />
<em>译者：Applet还是有它的空间。如果一定要说有问题，那就是整个Java桌面应用的问题。</em><br />
<br />
5) CORBA<br />
该API可能会从开发者的"你最想从Java中删除的API"竟选中胜出。<br />
<br />
4) javax.accessibility和accessibility<br />
<a href="http://java.sun.com/javase/6/docs/api/javax/accessibility/package-summary.html">这个包</a>始于Java 1.2，但就没怎么被用过。一方面，Swing确实能为你做很多事，但另一方面，它不能为你做每一件事。特别是，空的文本框和文本域需被说明。<br />
<br />
3) MIDI库<br />
是的，Java有内建的MIDI API。所以，从1.1开始，Java就能够播放音乐。当时，他们加入了一个音源库，音质听起来比较好。而现在，音源库就没声卡听起来那么好了。<br />
在谈到模块化JRE时，多数时候，CORBA被认为是不需要被下载的，而音源库API则可能是最不需要的。<br />
<br />
2) Java 6 API<br />
这是Apple最需被责备之处，因为他们决定不在32位平台中支持Java 6，那么就会有许多API和程序被阻止在Java 5处。<br />
<br />
1) 断言<br />
在Java1.4中，Sun加入了<a href="http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html">断言</a>。我记得在那时有一些评论谈到Java缺少断言/前置/后置条件，所以就加了这一特性。<br />
但让我们直面它，断言确实很少使用。<br />
<em>译者：断言是一个很基本的语言级特性，但我真的从未使用过它，因为断言在默认情况下是被关闭的</em> :-)<br />
</span></span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/266233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-04-17 22:42 <a href="http://www.blogjava.net/jiangshachina/archive/2009/04/17/266233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注册JavaOne(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/04/15/265870.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Wed, 15 Apr 2009 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/04/15/265870.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/265870.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/04/15/265870.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/265870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/265870.html</trackback:ping><description><![CDATA[<p align="center"><strong style="font-size: 14pt;">注册JavaOne</strong><br />
</p>
<span style="font-size: 10pt;">今年的<a href="http://java.sun.com/javaone/">JavaOne</a>已经开始接受注册了，<a href="http://blogs.sun.com/jag/">Games Gosling</a>向大家发出了<a href="http://blogs.sun.com/jag/entry/sign_up_for_javaone">邀请</a>... (2009.04.16最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; Sun的Java同仁们为今年的<a href="http://java.sun.com/javaone/">JavaOne</a>大会再次做好了充分的准备。提交的论文很惊人：它们将会贡献内容格为丰富的技术议程。Java EE 6将是企业级方面的主要看点。Swing和JavaFX则将无处不在。嵌入式领域会继续更有趣的事情：<a href="http://www.lincvolt.com/">LincVolt</a>将会出现在一堆酷炫的电子器件中。<br />
&nbsp;&nbsp;&nbsp; 我知道经济处于混乱，好像世界正在溶化，但JavaOne是一个很好的机会，使你能够置身其外，过一个奇客的假期。来加入我们吧！<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/265870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-04-15 22:43 <a href="http://www.blogjava.net/jiangshachina/archive/2009/04/15/265870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树的遍历(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Wed, 01 Apr 2009 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/263241.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/263241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/263241.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;">
<div align="center"><strong><span style="font-size: 14pt;"><strong>树的遍历</strong></span><br />
</strong></div>
之前的工作都没有接触到树，也就很少研究它。幸运地的是，在目前的工作中多次遇到树型结构的数据，那么访问树节点中的数据就是必然的了，而且还需要按照指定规则对节点中的数据进行额外处理。经过学习之后，对与树相关的基本算法有了一些认知，就计划写几篇小文。其实这样的文章早已是汗牛充栋，而我只是把它当作我的学习总结罢了，以加深记忆与理解，如能对其他朋友有所助益，则更感愉悦了 :-) (2009.04.03最后更新)<br />
<br />
这次先从最基础的开始--树的遍历。本文使用了两种极常用的方法来遍历树中的所有节点--递归；迭代，但它们实现的都是深度优先(Depth-First)算法。<br />
<br />
<strong style="font-size: 12pt;">1. 树节点与数据</strong><br />
先定义树节点及数据(用户对象)，并创建测试用的数据。<br />
TreeNode是树节点的定义。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; 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;树节点的定义。<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取指定下标处的子节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;index<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下标。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;子节点。<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;">public</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;getChildAt(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回指定子节点的下标。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;index<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下标。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;子节点。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getChildIndex(TreeNode&nbsp;index);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取子节点的数量。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;子节点的数量。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getChildCount();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回父节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;父节点。<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;">public</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;getParent();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;设置父节点。注：此处不需要改变父节点中的子节点元素。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;parent<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;父节点。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setParent(TreeNode&nbsp;parent);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取所有的子节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;子节点的集合。<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;">public</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;getChildren();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;是否为叶节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;是叶节点，返回true；否则，返回false。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isLeaf();<br />
}<br />
</span></div>
<span style="font-size: 10pt;"><br />
GenericTreeNode是一个通用的树节点实现。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;T&nbsp;userObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;children&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;GenericTreeNode(T&nbsp;userObject)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.userObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;userObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;GenericTreeNode()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;添加子节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;child<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addChild(GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;child)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.add(child);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child.setParent(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;删除指定的子节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;child<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;子节点。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;removeChild(TreeNode&nbsp;child)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeChildAt(getChildIndex(child));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;删除指定下标处的子节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;index<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下标。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;removeChildAt(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;child&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getChildAt(index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.remove(index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child.setParent(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;getChildAt(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;children.get(index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getChildCount()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;children.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getChildIndex(TreeNode&nbsp;child)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;children.indexOf(child);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;getChildren()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Collections.unmodifiableList(children);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setParent(TreeNode&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;parent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TreeNode&nbsp;getParent()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;parent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;是否为根节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;是根节点，返回true；否则，返回false。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isRoot()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;getParent()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isLeaf()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;getChildCount()&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;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;判断指定的节点是否为当前节点的子节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;node<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;节点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;是当前节点的子节点，返回true；否则，返回false。<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isChild(TreeNode&nbsp;node)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(getChildCount()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(node.getParent()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T&nbsp;getUserObject()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;userObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setUserObject(T&nbsp;userObject)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.userObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;userObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;toString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;userObject&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">&nbsp;:&nbsp;userObject.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<span style="font-size: 10pt;">UserObject是节点上的用户对象，相当于是数据。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;UserObject&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Integer.valueOf(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;UserObject()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;UserObject(String&nbsp;code,&nbsp;Integer&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;code;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;code)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;code;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getValue()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setValue(Integer&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;toString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append(</span><span style="color: #000000;">"</span><span style="color: #000000;">[name=</span><span style="color: #000000;">"</span><span style="color: #000000;">).append(name).append(</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;value=</span><span style="color: #000000;">"</span><span style="color: #000000;">).append(value).append(</span><span style="color: #000000;">"</span><span style="color: #000000;">]</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<span style="font-size: 10pt;">TreeUtils是用于创建树的工具类。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TreeUtils&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;buildTree()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">ROOT</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">0</span><span style="color: #000000;">)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node1.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">0</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node2.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">0</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node3.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">3</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">5</span><span style="color: #000000;">)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.addChild(node1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.addChild(node2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.addChild(node3);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node11&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node11.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">11</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">0</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node21&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node21.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">21</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">0</span><span style="color: #000000;">)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node1.addChild(node11);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node2.addChild(node21);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node111&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node111.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">111</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">3</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node112&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node112.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">112</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">9</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node211&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node211.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">211</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">6</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node212&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node212.setUserObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">212</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Integer.valueOf(</span><span style="color: #000000;">3</span><span style="color: #000000;">)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node11.addChild(node111);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node11.addChild(node112);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node21.addChild(node211);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node21.addChild(node212);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;root;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 10pt;"><br />
<strong style="font-size: 12pt;">2. 递归法</strong><br />
使用递归法的最大好处就是--简单，但一般地，我们都认为递归的效率不高。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;recursiveTravel(GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;travelNode(node);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;访问节点，仅仅只是打印该节点罢了。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;children&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.getChildren();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;children.size();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recursiveTravel(children.get(i));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;递归地访问当前节点的所有子节点。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;">大家肯定知道，系统在执行递归方法(对于其它方法也是如此)时是使用运行时栈。对方法的每一次调用，在栈中都会创建一份此次调用的活动记录--包括方法的参数，局部变量，返回地址，动态链接库，返回值等。<br />
既然系统能够隐式地使用栈去执行递归方法，那么我们就可以显式地使用栈来执行上述递归程序，这也是将递归程序转化为迭代程序的常用思想。下面的iterativeTravel方法就运用了这一思想。<br />
<br />
<strong style="font-size: 12pt;">3. 迭代法</strong><br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;iterativeTravel(GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;node)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;nodes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodes.push(node);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将当前节点压入栈中。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">nodes.isEmpty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericTreeNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UserObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;bufNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nodes.pop();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;从栈中取出一个节点。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;travelNode(bufNode);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;访问节点。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">bufNode.isLeaf())&nbsp;{&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果该节点为分枝节点，则将它的子节点全部加入栈中。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodes.addAll(bufNode.getChildren());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;">与递归法相比，迭代法的代码略多了几行，但仍然很简单。<br />
<strong><br />
<span style="font-size: 12pt;"><strong>4. 小结</strong><br />
</span></strong>由于上述两种方法均(隐式或显式地)使用了运行栈，所以此处的迭代法并不能提高整个程序的效率。相反地，由于在应用程序中显式地使用栈(java.util.Stack)，iterativeTravel方法的效率可能反而更低。但iterativeTravel的最大好处是，能够有效地避免运行时栈溢出(java.lang.StackOverflowError)。<br />
如果树的层次不太深，每层的子节点数不太多，那么使用递归法应该是没有问题的。毕竟，简洁地程序会提供更多的好处。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/263241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-04-01 20:40 <a href="http://www.blogjava.net/jiangshachina/archive/2009/04/01/263241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sun Tech Days 2008 -- Photos(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/11/23/242122.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 23 Nov 2008 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/11/23/242122.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/242122.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/11/23/242122.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/242122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/242122.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 14pt;"><strong>Sun Tech Days 2008 -- Photos</strong></span><br />
</strong></div>
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 今年Sun科技日会场的一些照片，大家可以浏览一下。(2008.11.23最后更新)<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 虽然报名参加了今年的Sun科技日，但由于工作的原因，实际上没有亲临现场，所以这次就不能把自己的所见，所闻，所思，所感呈现给大家了:-(<br />
&nbsp;&nbsp;&nbsp; 当得知周六也无法参会时，就让一位朋友拿着我的门票去参加了最后一天的会程，拍了一些照片，算是弥补了一点儿小小的遗憾吧。大家有兴趣的话，可以看看...噢，请关注可爱的小Duke(这是我亲手拍的*_*</span>)<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3160/3049660317_4a2822e107.jpg?v=0" /><br />
<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3150/3049660347_4305f86246.jpg?v=0" /><br />
<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3073/3049660285_a27561d653.jpg?v=0" /><br />
<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3247/3049660271_f8bfe0f0bb.jpg?v=0" /><br />
<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3247/3049660235_b8195c9772.jpg?v=0" /><br />
<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3247/3049660209_d8cac8e88d.jpg?v=0" /><br />
<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3008/3051696767_e025713b1a.jpg?v=0" /><br />
<br />
<img alt="STD 2008" src="http://farm4.static.flickr.com/3276/3051696773_7f5bd0c815.jpg?v=0" /><br />
<br />
<img alt="STD 2008 - Duke" src="http://farm4.static.flickr.com/3022/3051775669_6351f096fd.jpg?v=0" /><br />
<br />
<img alt="STD 2008 - Duke" src="http://farm4.static.flickr.com/3152/3051775683_de998c9a6d.jpg?v=0" /><br />
<br />
<span style="font-size: 12pt;"><strong>&nbsp;&nbsp;&nbsp; 也请关注我的系列博文--</strong><a href="http://www.blogjava.net/jiangshachina/category/27188.html"><strong>Sun Tech Days</strong></a><strong>。</strong></span><br />
<img src ="http://www.blogjava.net/jiangshachina/aggbug/242122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-11-23 22:37 <a href="http://www.blogjava.net/jiangshachina/archive/2008/11/23/242122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sun Tech Days 2008 -- Preview(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/11/16/240784.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 16 Nov 2008 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/11/16/240784.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/240784.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/11/16/240784.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/240784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/240784.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong style="font-size: 14pt;">Sun Tech Days 2008 -- Preview</strong></span><br />
</div>
<span style="font-size: 10pt;"><strong style="font-size: 14pt;">
</strong>&nbsp;&nbsp;&nbsp; 一年一度的<a href="http://www.suntechdays.cn/">Sun Tech Days</a>(STD)又将开幕了，本文简介了本届STD中我所期待的若干主题，有兴趣的朋友可以浏览一下。(2008.11.16最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 虽然已经报名了(前几天刚拿到门票)，但今年最终是否能够参会，还要看是否有时间(刚换了新工作，任务比较重，还要学习很多新知识)。如果能够如愿参加，那么这将是我连续第四年参加STD了(也很不容易啊^_^)，关于以前的参会情况，大家可以看看我的系列博文<a href="../../jiangshachina/category/27188.html">Sun Tech Days</a>。<br />
&nbsp;&nbsp;&nbsp; 世界在不断地变化，...，说到这里，先插几句题外话。在刚开始动笔写这篇文章的时候，从<a href="http://www.theserverside.com/">TSS</a>上看到<a href="http://www.theserverside.com/news/thread.tss?thread_id=51863">Sun裁员6000人</a>的消息，这也算是一种变化吧。不过也没什么特别的，很正常的商业行为(特别是在当前经济气候下)。言归正传，Java在过去的一年中也有了新的进展，但我学识浅薄，不可能对其进行深入地分析与总结，不过对于自己感兴趣的几个方面还是有些了解的，每年STD的主题自然也与这些新技术或新进展密不可分。<br />
&nbsp;&nbsp;&nbsp; <strong>Java SE 6 Update 10</strong><br />
&nbsp;&nbsp;&nbsp; 在经过了"漫长"地等待之后，就在前不久，<a href="http://java.sun.com/javase/downloads/?intcmp=1281">Java SE 6 Update 10</a>(曾名Consumer JRE，Java SE 6 Update N)终于正式发布了。对于新鲜出炉的Update 10，STD自然不会放过，今年就有一个名为"Java SE 6 Update 10和配置"的技术session。我一直在关注Update 10，也在关注桌面应用，希望这次能好好听听。之前也写有两篇相关的文章--<a href="../../jiangshachina/archive/2008/10/17/234849.html">Java SE 6 Update 10发布了</a>和<a href="../../jiangshachina/archive/2008/07/14/214703.html">下一代Java Applet插件技术</a>，大家也可以看看。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>JavaFX</strong><br />
&nbsp;&nbsp;&nbsp; 由于十分喜欢Java桌面开发，所以对JavaFX也有几分兴趣，但一直没有体验过。JavaFX的发展似乎并不如人意，较为缓慢，与其它的主流RIA技术相比，真不知道它最终会有多少市场份额。这次会有一个"<em>RIA使用JavaFX</em>"的主题，正好该时段也没有其它中意的session，那就听听它好了。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>MySQL</strong><br />
&nbsp;&nbsp;&nbsp; 数据库永远都是我最关注的领域之一，而且<a href="http://www.mysql.com/">MySQL</a>正是我最喜欢、最擅长的数据库。Sun在今年年初收购了MySQL(还好年初就收购了，如果到了下半年，Sun肯定就没那么多钱了，世界真是瞬息万变啊)，虽然这与Java没有直接的关系，但仍然值得Java人兴奋一下。"<em>MySQL: Web 2.0数据库</em>"，这个主题应该是吸引人的。另，今年没有<a href="http://developers.sun.com/javadb/">Java DB</a>的主题，略感遗憾。不过，如果仍然像前两年那样，只是简介一下Java DB，而且内容基本相同，那确实也没必要再要这个主题了。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>Comet</strong><br />
&nbsp;&nbsp;&nbsp; 之前对Comet知之甚少，但经常看到这个名词。有人说它是下一代Ajax技术...，但我是不懂了，那就去听听吧。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>Java性能</strong><br />
&nbsp;&nbsp;&nbsp; 程序的性能总是大家最关心的问题之一，我也不例外。希望这次能在"<em>提高Java性能</em>"这个session中学习到一些窍门 *_*<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/240784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-11-16 11:06 <a href="http://www.blogjava.net/jiangshachina/archive/2008/11/16/240784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更好的Applet体验：海报帧(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 02 Nov 2008 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/237466.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/237466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/237466.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong style="font-size: 14pt;">更好的Applet体验：海报帧</strong></span><br />
</div>
<span style="font-size: 10pt;">
本文是</span><a href="http://weblogs.java.net/blog/joshy"><span style="font-size: 10pt;">Joshua Marinacci</span></a><span style="font-size: 10pt;">的系列博客<em>A Better Applet Experience</em>中的</span><a href="http://weblogs.java.net/blog/joshy/archive/2008/08/a_better_applet_1.html"><span style="font-size: 10pt;">第二篇</span></a><span style="font-size: 10pt;">，介绍了如何使用海报帧去加快页面的加载。(2008.11.02最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 在本系列文章的第一部分中，我向你展示了如何使用设置加载时图片，包括动态的GIF自旋体图片。这次，我将向展示如何使用屏幕截图或海报帧去加快页面的加载。<br />
&nbsp;&nbsp;&nbsp; Quicktime电影就有海报帧的思想。电影中的一帧(经常就是其中的第一帧)将会放到该电影出现的地方。当用户点击海报帧时，实现的电影才会通过网络被加载进来。这就能极大地加快该电影所在Web页面的加载速度。使用少许JavaScript，完全可以为Java Applet实现相同的功能。<br />
<br />
<strong><span style="font-size: 12pt;"><strong>Applet的海报帧</strong><br />
</span></strong>&nbsp;&nbsp;&nbsp; <strong>在研究这个Demo之前，我必须要提到，我个人尚未在IE浏览器中测试过这个Demo。如果你发现这个Demo不能在某个浏览器中运行，请向错误信息发送给我，以便我能更新这个JavaScript。</strong><br />
&nbsp;&nbsp;&nbsp; 基本思想非常的简单，创建一个div，它包含一个链接和一张屏幕截图。当用户点击该链接时，我们使用一个新的<code>applet</code>元素去替换页面中的<code>a</code>和<code>img</code>元素。一旦浏览器察觉到了这个新的<code>applet</code>元素，它将下载Java插件并启动这个Applet。<br />
&nbsp;&nbsp;&nbsp; 这就有一个例子：如果你点击了这张图片，一个Applet就会被加载到该图片所在的位置，并会说"applet loaded"。<br />
<br />
<strong style="font-size: 12pt;">JavaScript</strong><br />
&nbsp;&nbsp;&nbsp; 如下就是这个JavaScript脚本：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 10pt;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">script</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;"><span style="font-size: 10pt;">function</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;generateInlineAppletTag(appletID,&nbsp;screenshotID)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;attributes&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code:'animatedstartup.MainApplet',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:</span><span style="color: #000000;">100</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height:</span><span style="color: #000000;">100</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;archive:'http:</span><span style="color: #008000;">//</span><span style="color: #008000;">projects.joshy.org/demos/AnimatedStartup/AnimatedStartup.jar',</span></span><span style="color: #008000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:'fooApplet'<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;parameters&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image:'http:</span><span style="color: #008000;">//</span><span style="color: #008000;">projects.joshy.org/demos/AnimatedStartup.gif',</span></span><span style="color: #008000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;centerImage:'</span><span style="color: #0000ff;">true</span></span><span style="font-size: 10pt;"><span style="color: #000000;">'<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;appletTag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.createElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">applet</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;attribute&nbsp;</span><span style="color: #0000ff;">in</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;attributes)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appletTag.setAttribute(attribute,attributes[attribute]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(parameters&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;'#ff0000'&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;parameters&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span></span><span style="font-size: 10pt;"><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;parameter&nbsp;</span><span style="color: #0000ff;">in</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;parameters)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;param&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.createElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">PARAM</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,parameter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,parameters[parameter]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appletTag.appendChild(param);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;bodyRef&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;document.getElementById(appletID);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;screenshot&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;document.getElementById(screenshotID);<br />
&nbsp;&nbsp;&nbsp;&nbsp;bodyRef.removeChild(screenshot);<br />
&nbsp;&nbsp;&nbsp;&nbsp;bodyRef.appendChild(appletTag);<br />
}<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">script</span><span style="color: #000000;">&gt;</span></span></div>
<span style="font-size: 10pt;">该脚本的第一部分初始化了两个哈希表，它们包含了<code>applet</code>元素的属性与嵌套的param标签。然后，它会使用<code>document.createElement()</code>方法去创建这个applet，并配置其中的属性与<code>PARAM</code>元素。到目前为止，还很直接。真正地奇妙之事发生在<code>generateInlineAppletTag</code>函数的最后四行。它使用传入的<code>appletID</code>参数与包含着上述链接与图片的<code>div</code>元素相联在一起，然后它会找到并删除该链接，而用新的applet元素去替代这个链接。<br />
<br />
<strong style="font-size: 12pt;">HTML</strong><br />
要使用上述javascript函数，你只需将它放到页面的顶部，并通过那张屏幕截图链接的href去调用它。在本例中，我使用了：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="appletDiv"</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="screenshot1"</span><span style="color: #ff0000;">&nbsp;href</span><span style="color: #0000ff;">="javascript:generateInlineAppletTag('appletDiv','screenshot1');"</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">="http://projects.joshy.org/demos/AnimatedStartup/applet_screenshot.png"</span><span style="color: #ff0000;">&nbsp;border</span><span style="color: #0000ff;">="0"</span></span><span style="color: #ff0000;"><br />
</span><span style="color: #0000ff;"><span style="font-size: 10pt;">/&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></span></div>
<span style="font-size: 10pt;">这个div被命名为<code>appletDiv</code>，链接被命名为<code>screenshot1</code>。该链接的<code>href</code>会调用上述javascript函数，并传入div与链接的名称。最后该图片就只是显示将要运行的Applet的一张屏幕截图，该图被一个播放按钮覆盖着。就这么简单，在</span><a href="http://projects.joshy.org/demos/AppletOverlay/image_replace.html"><span style="font-size: 10pt;">这里</span></a><span style="font-size: 10pt;">你可以看到完整的javascript和HTML语句。<br />
<br />
<strong style="font-size: 12pt;">结论</strong><br />
这个javascript只是一个开始。你还能很容易的扩展它，使图片上能展现关于这个Applet的更多信息。你也可以把这个javascript重写为一个更加可重用的形式，使它能够被你的整个站点所共享。<br />
下次我将向你展示如何使用新的发布工具包去侦测当前已安装的Java版本，并启动更新程序。<br />
<strong>重复一遍，如果你在某个平台或浏览器中发现了任何错误，请让我知道，以便更新这个脚本。</strong><br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/237466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-11-02 10:57 <a href="http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>出错时的软件开发(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/10/27/236562.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 27 Oct 2008 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/10/27/236562.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/236562.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/10/27/236562.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/236562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/236562.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong style="font-size: 14pt;">出错时的软件开发</strong></span><br />
</div>
<span style="font-size: 10pt;">
在开发的过程中有错误发生了，此时你该如何应对呢？<a href="http://weblogs.java.net/blog/johnsmart/">John Ferguson Smart</a>在他的<a href="http://weblogs.java.net/blog/johnsmart/archive/2008/10/software_develo.html">最新博客</a>中提出了一些想法，大家可以参考一下(2008.10.27最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 现今比以后任何时候，都需要开发者更加高效。极度高效。组织需要提高从它们的开发项目中得到的附加值，并且它们也乐于寻找实现这一目标的方法。<br />
当然，你可以采用传统的方法--努力工作。为了消除项目中不可预见的症状，每天工作16个小时，还没有周末。但做的更聪明一点儿，会不会更好些？<br />
在引进新的实践方法及改进现有方法方面投入的相对多一些，以使组织能努力获得更多回报，这就是开发的过程。一般而言，事物中有许多方面都可以被改进，但此处有一些小窍门能使你的开发流程更加合理，只是为你开个头罢了。<br />
<br />
<strong style="font-size: 12pt;">持续集成(CI)通知策略的再思考<br />
</strong>&nbsp;&nbsp;&nbsp; 到目前为止，最通用的CI通知机制就是陈旧的邮件服务器。然而，你能肯定在你手边能完成这项任务的最合适系统就是电子邮件吗？尝试不使用电子邮件，而使用即时消息去完成你的CI通知。记住，电子邮件易成为一种干扰--如果你仅仅大约每两小时才查阅一次邮件，你就会变得十分高效。电子邮件只是，或至少是，用于构建失败--人们需要<em>快速</em>地知晓失败任务。<br />
<br />
<strong style="font-size: 12pt;">积极地优化构建过程</strong><br />
&nbsp;&nbsp;&nbsp; 构建度量(Build Metrics)是一种监控构建过程健康状况的极好方法。为什么过去3周中，代码覆盖率一直在下降？为什么单元测试的数量并未呈有规律的增长？为什么要花费很长的时间去修复这样的构建？运行单元测试需要多长时间--是否有一些测试需要执行过分长的时间？这些信息并非华而不实的东西--在不断改进构建过程的工作中，它们都扮演着关键的角色。现代CI工具，如Hudson，Bamboo和TeamCity，能为构建展示丰富的统计。Bamboo在这方面做的尤佳。无论你正使用何种CI工具，都要学习如何最大限度地使用它的报表特性，并使用这些特性去定位及修复开发过程中讨厌污点。如果你的CI工具不能给你所需要的全部信息，那就找一个能做到的。<br />
<br />
<strong style="font-size: 12pt;">合理化发布过程</strong><br />
&nbsp;&nbsp;&nbsp; 在发布过程中有许多必做的工作，如准备发行说明，确定该版本中哪些问题已被解决了，标记版本，等等。这些都是软件生命周期的重要部分，如果你忽略了它们，QA们和最终用户可能会很生气。但要尽量自动地去做这些工作。许多CI工具能很好地与问题追踪系统(如JIRA和Trac)进行集成，以便你能基于版本控制日志看到某个问题是在哪次特定的构建中被解决的。如果你在使用Eclipse，Mylyn能帮你将处理过的问题归总成逻辑变化组，并使用标准的模板列出在某项工作中已被解决的(或仅是影响到的)问题。或者你可使用Subversion的hook脚本去确保每次向Subversion做的提交都能对应到一个有效的问题编号。<br />
&nbsp;&nbsp;&nbsp; 这只是一些想法罢了--还有更多。底线就是--你不需要忍耐一个次理想的开发过程--相反，要进入其中，并做些能改进它的事情。祝好运! <br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/236562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-10-27 08:44 <a href="http://www.blogjava.net/jiangshachina/archive/2008/10/27/236562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 6 Update 10发布了!(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 17 Oct 2008 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/234849.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/234849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/234849.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong style="font-size: 14pt;">Java SE 6 Update 10发布了!</strong></span><br />
</div>
<span style="font-size: 10pt;">
&nbsp;&nbsp;&nbsp; 在经过了漫长的期待之后，<a href="http://java.sun.com/javase/downloads/index.jsp">Java SE 6 Update 10</a>终于正式发布了。本文主要简介了该版本在客户端应用方面的改进。(2008.10.18最后更新)<br />
<br />
Java SE 6本就加入了许多关于客户端应用的新特性，在<a href="http://blogs.sun.com/dannycoward/entry/java_se_6_top_ten">Java SE 6的十大新特性</a>中，直接关于客户端/桌面领域的新特性就有两处。此次Update 10更是集中地在该领域内做出了重大改进。此处，主要基于<a href="http://java.sun.com/javase/6/webnotes/6u10.html">Java SE 6 Update 10 Release Notes</a>的说明，简介了该版本在客户端应用方面的改进。<br />
<br />
<strong style="font-size: 12pt;">下一代Java Plug-in</strong><br />
&nbsp;&nbsp;&nbsp; 下一代Java插件包含了Applet和Java Web Start技术的最佳架构特性。它为在Web浏览器中发布Java和Java FX内容提供了健壮的平台。下一代Java插件为高级用户内容和企业级应用提供了许多强大的特性。<br />
&nbsp;&nbsp;&nbsp; * 允许为Applet申请更多的内存；可为每个Applet应用指定不同的命令行参数。<br />
&nbsp;&nbsp;&nbsp; * 为每个Applet应用选择不同的JRE。<br />
&nbsp;&nbsp;&nbsp; * 提高了可靠性。<br />
&nbsp;&nbsp;&nbsp; * 能在Java和JavaScript程序设计语言之间进行更好、更便捷的整合。<br />
&nbsp;&nbsp;&nbsp; * 增强了对访问Web页面中DOM的支持。<br />
&nbsp;&nbsp;&nbsp; * 增加了对Web Services的支持。<br />
内建支持JNLP，使得Applet应用可立即复用之前由Java Web Start应用使用的JNLP扩展，例如JavaFX运行时组件，对基于硬件加速的3D图形，视频回放等等。<br />
&nbsp;&nbsp;&nbsp; P.S. 在我较早前的一篇译文<strong><a href="http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html">下一代Java Applet插件技术</a></strong>中，对这个新的插件有较详尽的描述。<br />
<br />
<strong style="font-size: 12pt;">Java Quick Starter</strong><br />
&nbsp;&nbsp;&nbsp; Java Quick Starter(JQS)为了提高Applet程序和Java应用程序的初始启动速度，会周期性预加载一些常用的JRE文件到内存(占用不多于20M的内存)。之后，当Java程序启动时，磁盘I/O将会显著减少，那么启动速度也就大大加快了。JQS会作为一个Windows服务启动，在任务管理器中会看到一个名为jqs.exe的进程。<br />
&nbsp;&nbsp;&nbsp; 注：JQS仅能用于x86架构下的Windows 2000和Windows XP系统；由于Windows Vista系统有其自己的预加载机制，JQS将不能使用。<br />
<br />
<strong style="font-size: 12pt;">Deployment Toolkit</strong><br />
&nbsp;&nbsp;&nbsp; 为了避免浏览器的兼容性问题，Deployment Toolkit提供了一组JavaScript方法，能够自动生成部署Applet和Java Web Start程序时所使用的HTML语句。<br />
<br />
<strong style="font-size: 12pt;">Nimbus</strong><br />
&nbsp;&nbsp;&nbsp; Nimbus是一个新的Java跨平台外观。在JDK 6 Update 10自带的demo中新加了一个SwingSet3应用，但与其它的demo应用(如SwingSet2)不同，这个demo应用没有包含源代码和可执行的jar文件，而需要通过Java Web Start运行(我猜想SwingSet3应该还处于开发阶段)。官方的介绍中有一张图片，大家可以看看，确实漂亮多了(此前，默认的Metal外观已经多年未更新了)。<br />
<img alt="" src="http://java.sun.com/javase/6/docs/technotes/guides/jweb/images/NimbusLAF.png" />&nbsp;<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/234849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-10-17 21:37 <a href="http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans vs. Eclipse RCP: 插件机制比较(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/10/15/234341.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Wed, 15 Oct 2008 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/10/15/234341.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/234341.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/10/15/234341.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/234341.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/234341.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><span style="font-size: 14pt;"><strong>NetBeans vs. Eclipse RCP: 插件机制比较</strong></span></span><br />
<span style="font-size: 10pt;"><strong></strong></span></div>
<span><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 本文是<a href="http://java.dzone.com/">JavaLobby</a>上的<a href="http://java.dzone.com/articles/netbeans-vs-eclipse-rcp-plugin">一篇小文</a>，作者对NetBeans和Eclipse的插件机制进行了一些比较，如有兴趣，可以看看。(2008.10.15最后更新)<br />
<br />
NetBeans与Eclipse处理扩展点及扩展的方式是不同的。让我们看看这些不同之处。请注意，本文仅针对那些对这两个平台的插件机制都具备相当知识的人。</span><br />
<br />
<strong style="font-size: 10pt;">NetBeans Platform:</strong><br />
</span>
<table bgcolor="#000000" border="0" cellpadding="1" cellspacing="1" width="686" height="56">
    <tbody>
        <tr style="background-color: #ffffff;">
            <td style="width: 100px; height: 15px;"><span style="font-size: 10pt;">定义扩展点</span></td>
            <td><span style="font-size: 10pt;">创建一个接口，并将它置入一个公共模块包中。</span></td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><span style="font-size: 10pt;">创建扩展</span></td>
            <td style="width: 573px; height: 21px;"  &="" gt;=""><span style="font-size: 10pt;">创建上述接口的实现，并通过layer.xml文件将它注册到虚拟文件系统中。</span></td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><span style="font-size: 10pt;">读取可用的扩展 </span></td>
            <td><span><span style="font-size: 10pt;">使用<a href="http://bits.netbeans.org/dev/javadoc/org- openide-util/org/openide/util /Lookup.html">org.openide.util.Lookup</a>类去获取上述接口实现的实例。</span><br />
            </span></td>
        </tr>
    </tbody>
</table>
<br />
<span style="font-size: 10pt;"><strong style="font-size: 12pt;"><span style="font-size: 10pt;"><strong>Eclipse RCP:</strong></span><br />
</strong></span>
<table bgcolor="#000000" border="0" cellpadding="2" cellspacing="1" width="876" height="129">
    <tbody>
        <tr style="background-color: #ffffff;">
            <td style="width: 100px; height: 15px;"><span style="font-size: 10pt;">定义扩展点</span></td>
            <td><span style="font-size: 10pt;">创建一个扩展点的描述符方案，该方案定义了扩展点的元素与属性，以及这些元素之间的关系。<br />
            可用的属性类型为：boolean，string，java，resource和identifer。可向该方案的任何部分添加文档。<br />
            最后，向plugin.xml文件 注册你的扩展点。</span></td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><span style="font-size: 10pt;">创建扩展</span></td>
            <td><span><span style="font-size: 10pt;">根据上述方案，在plugin.xml文件中创建一个子部分，在此处向属性赋予值。如果属性类型为java，则也要创建被引用的Java类。</span></span></td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><span style="font-size: 10pt;">读取可用的扩展</span></td>
            <td><span><span style="font-size: 10pt;">使用<a href="http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/runtime_registry.htm">org.eclipse.core.runtime.IExtensionPoint</a>获取扩展的列表。从每个<em><a href="http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/runtime/IExtension.html">扩展</a></em>中获取<a href="http: //help.eclipse.org/ganymede/index.jsp?topic= /org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/runtime /IConfigurationElement.html">IConfigurationElement</a>的列表：<br />
            每个IConfigurationElement对应于plugin.xml文件中的一个XML标签。</span></span></td>
        </tr>
    </tbody>
</table>
<br />
<table style="width: 1019px; height: 186px;" bgcolor="#000000" border="0" cellpadding="2" cellspacing="1" width="1019" height="186">
    <tbody>
        <tr style="background-color: #ffffff;">
            <td colspan="2" style="width: 100px; height: 15px;"><span style="font-size: 10pt;"><strong>NetBeans平台</strong></span></td>
            <td colspan="2"><span style="font-size: 10pt;"><strong>Eclipse RCP</strong></span></td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><span style="font-size: 10pt;">优点</span></td>
            <td><span style="font-size: 10pt;">缺点</span></td>
            <td><span style="font-size: 10pt;">优点</span></td>
            <td><span style="font-size: 10pt;">缺点</span></td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><span style="font-size: 10pt;">非常简单，易于学习</span></td>
            <td><span style="font-size: 10pt;">扩展点没有定义它自己：没有关于是哪个公共模块接口作为扩展点使用的信息。</span></td>
            <td><span><span style="font-size: 10pt;">扩展点清晰地定义了它自己：快速查看jar文件，你就能立即知道该插件提供了哪些扩展点，以及它们是由哪些元素组成的。</span></span></td>
            <td><span style="font-size: 10pt;">比较复杂，需要更多时间去学习</span></td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><br />
            </td>
            <td><span style="font-size: 10pt;">使用的查找名也未作定义</span></td>
            <td><span style="font-size: 10pt;">有许多属性类型：可以在XML文件中描述特定的结果。</span></td>
            <td><br />
            </td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><br />
            </td>
            <td><span style="font-size: 10pt;">扩展和其它的内容都混写在layer.xml文件中：难以确定该模块用于哪些扩展。</span></td>
            <td><span style="font-size: 10pt;">可生成扩展的多数组成部分，见PDE。</span></td>
            <td><br />
            </td>
        </tr>
        <tr style="background-color: #ffffff;">
            <td><br />
            </td>
            <td><br />
            </td>
            <td><span style="font-size: 10pt;">定义好了文档的位置。</span></td>
            <td><br />
            </td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/jiangshachina/aggbug/234341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-10-15 14:40 <a href="http://www.blogjava.net/jiangshachina/archive/2008/10/15/234341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>支持Unicode并不意味着应用是国际化的(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/10/14/234177.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 14 Oct 2008 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/10/14/234177.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/234177.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/10/14/234177.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/234177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/234177.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">支持Unicode并不意味着应用是国际化的</span></span></strong><br />
</div>
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; <a href="http://joconner.com">John O'Conner</a>在他的<a href="http://joconner.com/unicode/unicode-support">最新Blog</a>中介绍了在使用Unicode<sup>[1]</sup>进行软件国际化的过程中普遍存在的一种误解，希望大家对有些启示。(2008.10.14最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 多年以来，我已经帮助了许多组织去国际化它们的软件产品。最普遍的误解之一就是Unicode会如何帮助它们的产品。有时候，客户会错误地相信，支持Unicode对于国际化他们的产品是足够的了。有时，他们相信"支持"Unicode只是一个单纯的是或不是，行或不行的能力问题，而不认为是在不同的场合和层次中去实现对Unicode的支持。<br />
&nbsp;&nbsp;&nbsp; Unicode是一个字符编码标准。它是一个很大的标准，有着许多的细微差别。你的产品可使用许多不同的方法去实现"Unicode支持"。其结果就是，那些产品将能以不同，但通常不会是所有的方式去操纵，处理，存储，甚至可能是展示世界上的文本。你的产品支持Unicode的能力并不是二元(是或不是)的；相反，你要理解到，产品是在各种不同层次上实现"Unicode支持"的。在多数简单的情况下，你的产品只需正确地存储并获取Unicode字符。在一种更复杂的层次下，你的产品可能要能够存储，查询或展示Unicode字符。再说一次，产品"支持"Unicode的能力并不能由一个单纯的是或不是的答案去评判。一般来说，产品会以某些方式，而不是别的什么方式，去支持Unicode。<br />
&nbsp;&nbsp;&nbsp; 哪怕是在最复杂的层次中实现了Unicode支持，也不意味着你的产品是<strong>国际化的</strong>。国际化是使一个软件代码库易于本地化的过程。国际化过程会创建一个产品，该产品没有针对某个单一文化或语言的特殊偏见。该产品可对特定文化进行本地化。支持Unicode是国际化工作的一个关键组成部分，但它也仅仅只是一个组成部分罢了。与支持Unicode一样，你的国际化支持也有着在不同层次上的复杂度与能力。<br />
&nbsp;&nbsp;&nbsp; 概述之，产品可用不同的方式去支持Unicode。支持Unicode通常并不表示你的产品有能力去完成各种可能的针对Unicode的功能。相反，"支持"常意味着你可以使用Unicode，而不是别的什么东西，去做某些事情。另外，对Unicode的支持并不是国际化你的产品的唯一步骤。 Unicode只是其中的一个步骤，重要的一步罢了。国际化是创建一个易于进行本地化的产品的过程，这样的产品消除了文化偏见，以便在对其进行了本地化之后仍能够很容易地去支持另一种文化或地域。你可将Unicode作为国际化工作的一个步骤，但Unicode本身并不能创建一个国际化产品。<br />
&nbsp;&nbsp;&nbsp; 如果你有问题关于Unicode如何才能帮助你的产品，请联系我或留下评论。如果我能帮忙，就会回复。如果<em>我</em>不能，我也知道谁能。 <br />
<br />
<strong>
译注</strong><br />
[1]Unicode是一个字符集标准。该标准为全球书面和口头语言，计算机平台，或应用程序所使用的每个字符分配了一个独一无二的数值。Unicode包含了其它有限字符集所使用的全部字符。在Unicode之前，小字符集彼此之间分配的字符数值是不同的。Unicode统一了所有的其它字符集；每个字符拥有它自己的，唯一的数值。<br />
P.S. 这段Unicode的简介也出自于Conner的一篇Blog--<a href="http://joconner.com/unicode/what-is-unicode">What is Unicode</a>。
</span><br />
<span style="font-size: 10pt;"><br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/234177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-10-14 10:51 <a href="http://www.blogjava.net/jiangshachina/archive/2008/10/14/234177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写好的面向对象代码(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/10/07/232942.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 07 Oct 2008 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/10/07/232942.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/232942.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/10/07/232942.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/232942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/232942.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong style="font-size: 14pt;">编写好的面向对象代码</strong></span><br />
</div>
<p align="left"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 本文是<a href="http://www.java.net">java.net</a>上的一篇<a href="http://weblogs.java.net/blog/thedarksavant/archive/2008/10/writing_great_o_1.html">博客</a>，作者<a href="http://weblogs.java.net/blog/thedarksavant/">Curtis Cooley</a>对编写好的面向对象代码有些建议，希望对大家都有所帮助。(2008.10.08最后更新)<br />
</span><span style="font-size: 10pt;"><br />
获取经验没有捷径。编写好的面向对象代码需要经验，但这儿有三种做法能帮你在一开始就很顺利，即便你是老顽固：<br />
&nbsp;&nbsp;&nbsp; 1. 使用测试驱动开发(TDD)编写你所有的代码<br />
&nbsp;&nbsp;&nbsp; 2. 遵循<a href="http://xp.c2.com/XpSimplicityRules.html">简单法则</a><br />
&nbsp;&nbsp;&nbsp; 3. 告之而非问之<br />
<br />
</span><span style="font-size: 10pt;"><strong style="font-size: 12pt;">使用TDD编写所有代码</strong><br />
&nbsp;&nbsp;&nbsp; 按<a href="http://ponderingobjectorienteddesign.blogspot.com/2008/09/tdd-is-design-activity.html">测试先行</a>编写的代码与按测试后行编写的代码是极为不同的代码。按测试先行编写的代码是松耦合与高聚合的。当某个属性或私有方法需要暴露给测试程序时，按测试后行编写的代码常会打破封装，因为该类并不是为了测试而设计的。如果你首先编写测试代码，你的依赖将会更好，你的代码将是松耦合与高聚合的。后面会有更多关于测试能帮助你设计更佳代码的内容。<br />
<br />
<strong style="font-size: 12pt;">遵循简单法则</strong><br />
&nbsp;&nbsp;&nbsp; 代码是简单的，只要当它：<br />
&nbsp;&nbsp;&nbsp; 1. 执行了所有的测试<br />
&nbsp;&nbsp;&nbsp; 2. 不包含重复<br />
&nbsp;&nbsp;&nbsp; 3. 表达了所有的意图<br />
&nbsp;&nbsp;&nbsp; 4. 使用最少的类和方法<br />
注意到我用的是个被排序了的列表是很重要的。顺序是重要的。只有一个main()方法的的GodClass<sup>[1]</sup>不会是简单的。这个类可能执行了所有的测试，但在任何比"Hello, world!"更复杂的程序中，它肯定包含了重复，并且也没有表达出全部的意图。<br />
我努力使用简单法则去关注<a href="http://ponderingobjectorienteddesign.blogspot.com/2008/09/if-bugs.html">If问题</a>。我不知道如何使用简单法则去阻止某人编写重量级的If代码。有人可能会提出不同意见，我也尝试过，但这样的重量级If代码确实无法表达意图。但当你阅读如下代码时</span></p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 10pt; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(mobile.getType()&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;MobileTypes.STANDARD)&nbsp;{<br />
&nbsp;&nbsp;alert();<br />
}</span></div>
<span style="font-size: 10pt;">确实难以看出其中的意图。这些代码无论处于哪个方法的上下文环境中，我们都能知道，如果mobile是STANDARD类型的话，那么就报警。而你所需要的更多意图呢？<br />
我还有一点儿灵感显现。如果有那样的代码，那么在其它地方肯定还会有更多那样的代码。这些代码可能就像：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(mobile.getType()&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;MobileTypes.GAS)&nbsp;{<br />
&nbsp;&nbsp;registerGasReading();<br />
}</span></div>
<span style="font-size: 10pt;">和</span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 10pt; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(mobile.getType()&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;MobileTypes.TEXT)&nbsp;{<br />
&nbsp;&nbsp;sendTextMessage();<br />
}</span></div>
<span style="font-size: 10pt;">和</span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 10pt; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(mobile.getType()&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;MobileTypes.LOCATION)&nbsp;{<br />
&nbsp;&nbsp;notifyLocation();<br />
}</span></div>
<span style="font-size: 10pt;">你看出来了吗？我是看出来了。它违反了规则2，有很多地方都违反了规则2，并且是一种最坏的情形。这段代码有多处重复。重复将极难发现。所以，请帮助防止这种情形的发生，我已包含其中了。<br />
<br />
<strong style="font-size: 12pt;">告之而非问之</strong><br />
简言之，<a href="http://www.pragmaticprogrammer.com/articles/tell-dont-ask">告之而非问之</a>意指不要先问一个对象的状态，然后才让它去工作。而应该告之对象如何去工作。这就意味着之前所有的那些If例子应该变为：</span> <br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">mobile.alert();</span></div>
<span style="font-size: 10pt;">和</span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 10pt; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">mobile.registerGasReading();</span></div>
<span style="font-size: 10pt;">和</span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">mobile.sendTextMessage();</span></div>
<span style="font-size: 10pt;">和</span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">mobile.notifyLocation();</span></div>
<span style="font-size: 10pt;">现假设遍布该程序中的一些If语句块有重复的实现。在"重量级If"版本的程序中，可能很难发现它们；但在"告之而非问之"版本的程序中，所有的实现都在Mobile中。所有的实现都在一处，这就便于察觉并根除问题。<br />
&nbsp;&nbsp;&nbsp; 倾听你的测试程序也能帮助你保持代码的简洁。</span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;Alarm&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;alert(Mobile&nbsp;mobile);<br />
}<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Siren&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Alarm&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;alert(Mobile&nbsp;mobile)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(mobile.getType&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;MobileTypes.STANDARD)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soundSiren();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;TestSiren&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;TestCase&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;test_alert()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LocationMobile&nbsp;mobile&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;LocationMobile();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Siren&nbsp;siren&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Siren();<br />
&nbsp;&nbsp;&nbsp;&nbsp;siren.alert(mobile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">(sirenSounded());<br />
&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;">如果你密切地倾听测试程序，它可能会问你，"为什么你需要一个LocationMobile去测试Siren呢？"的确，为什么呢？看起来，Siren应该还不知道LocationMobile吧。</span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;LocationMobile&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;Alarm&nbsp;alarm;<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;LocationMobile(Alarm&nbsp;alarm)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.alarm&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;alarm;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;alert()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;alarm.alert();&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;alert&nbsp;on&nbsp;Alarm&nbsp;no&nbsp;longer&nbsp;needs&nbsp;a&nbsp;mobile</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;TestLocationMobile()&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;TestCase&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;test_alert()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Alarm&nbsp;alarm&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;EasyMock.createMock(Alarm.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;alarm.alert();<br />
&nbsp;&nbsp;&nbsp;&nbsp;EasyMock.replay(alarm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mobile&nbsp;mobile&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;LocationMobile(alarm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;mobile.alert();<br />
&nbsp;&nbsp;&nbsp;&nbsp;EasyMock.verify(alarm);<br />
}</span></div>
<span style="font-size: 10pt;">好像我只是交换了依赖关系。Alarm不再依赖Mobile，现在是Mobile依赖Alarm。但如果你仔细地观察这个测试程序，你会发现真正的依赖关系是，Siren知晓了LocationMobile。一个具体类依赖另一个具体类，这违反了<a href="http://c2.com/cgi/wiki?DependencyInversionPrinciple">依赖反转原则</a>(DIP)。第二个例子就让LocationMobile依赖Alarm接口。具体类依赖抽象，这就满足DIP了。<br />
&nbsp;&nbsp;&nbsp; 如果你使用TDD，并遵循简单法则和告之而非问之原则去编写所有的代码，你就处于成为一个更好的面向对象程序员的道路上了。好的面向对象代码易于阅读和维护，但难以编写，至少，在开始时是这样的。你写的越多，你就会变得越好，也会获得更多的经验。同时，这些实践经验也会使你在自己的道路上受益匪浅。<br />
<br />
<strong>译注</strong><br />
[1]GodClass(上帝类)指包含了太多内容的类。<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/232942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-10-07 17:06 <a href="http://www.blogjava.net/jiangshachina/archive/2008/10/07/232942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JStockChart -- Getting Started(Timeseries)(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/09/08/227555.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 08 Sep 2008 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/09/08/227555.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/227555.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/09/08/227555.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/227555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/227555.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 14pt;">JStockChart -- Getting Started(Timeseries)</span></strong><br />
</div>
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp; 本文以一个示例介绍了如何利用</span><span style="font-size: 10pt;"><a href="http://code.google.com/p/jstockchart/">JStockChart</a>生成金融时序图。(2009.11.23最后更新)<br />
<br />
<strong style="font-size: 12pt;">1. 环境要求</strong><br />
&nbsp;&nbsp;&nbsp; 需要JDK 1.5或更高版本。<br />
<br />
<strong style="font-size: 12pt;">2. 下载与安装<br />
</strong>&nbsp;&nbsp;&nbsp; 从<a href="http://code.google.com/p/jstockchart">JStockChart</a>的站点中<a href="http://code.google.com/p/jstockchart/downloads/list">下载</a>它的最新版本，当前版本是0.4.2。<br />
&nbsp;&nbsp;&nbsp; 解压JStockChart的zip文件(jstockchart-0.4.2.zip)后，将jstockchart目录中的jstockchart-0.4.2.jar和jstockchart/lib目录中的jcommon-1.0.16.jar和jfreechart-1.0.13.jar加到classpath中。<br />
<br />
<span style="font-size: 12pt;"><strong>3. 示例</strong></span><br />
&nbsp;&nbsp;&nbsp; 在JStockChart的发行包中，有一个demo目录。该目录包含了一个简单的例子，展示了如何利用JStockChart去生成时序图。demo目录中有一个Ant脚本build.xml，在该目录下执行命令ant即可运行该示例程序。下面是该示例的关键代码及其说明。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TimeseriesChartDemo&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建一个包含TimeseriesItem的List实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 在此处，通过查询<a href="http://www.db4o.com">db4o</a>的数据库文件，直接获得该List．<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;注意：所有的数据，都必须在"同一天"内。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建SegmentedTimeline实例，表示时间区间"00:00-11:30，13:00-24:00"(即24小时中空缺了"11:31-12:59"这段时间)。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SegmentedTimeline&nbsp;timeline&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SegmentedTimeline(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SegmentedTimeline.MINUTE_SEGMENT_SIZE,&nbsp;</span><span style="color: #000000;">1351</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">89</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeline.setStartTime(SegmentedTimeline.firstMondayAfter1900()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">780</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;SegmentedTimeline.MINUTE_SEGMENT_SIZE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建TimeseriesDataset实例，时间间隔为1分钟。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeseriesDataset&nbsp;dataset&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TimeseriesDataset(Minute.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;timeline,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;向dataset中加入TimeseriesItem的List。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.addDataItems(data);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建逻辑价格坐标轴。指定中间价为21，显示9个坐标值，坐标值的格式为".00"。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CentralValueAxis&nbsp;fixedPriceAxis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CentralValueAxis(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Double(</span><span style="color: #000000;">"</span><span style="color: #000000;">21</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Range(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.getMinPrice().doubleValue(),&nbsp;dataset.getMaxPrice().doubleValue()),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DecimalFormat(</span><span style="color: #000000;">"</span><span style="color: #000000;">.00</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建价格区域</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PriceArea&nbsp;priceArea&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PriceArea(fixedPriceAxis);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建逻辑量坐标轴。显示5个坐标值，坐标值的格式为"0"。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FixedNumberAxis&nbsp;fixedVolumeAxis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FixedNumberAxis(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Range(dataset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getMinVolume().doubleValue(),&nbsp;dataset.getMaxVolume()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.doubleValue()),&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DecimalFormat(</span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建量区域</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VolumeArea&nbsp;volumeArea&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;VolumeArea(fixedVolumeAxis);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建时序图区域</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeseriesArea&nbsp;timeseriesArea&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TimeseriesArea(priceArea,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volumeArea,&nbsp;createFixedDateAxis(DateUtils.createDate(</span><span style="color: #000000;">2008</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;通过JStockChartFactory的工厂方法生成JFreeChart实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;指定了该图的标题为"Timeseries&nbsp;Chart&nbsp;Demo"，并且不生成图例(legend)。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;jfreechart&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;JStockChartFactory.createTimeseriesChart(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Timeseries&nbsp;Chart&nbsp;Demo</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;dataset,&nbsp;timeline,&nbsp;timeseriesArea,&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建图像文件。图像格式为PNG，长为545，宽为300。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChartUtilities.saveChartAsPNG(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(imageFile),&nbsp;jfreechart,&nbsp;</span><span style="color: #000000;">545</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">300</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;指定时期坐标轴中的逻辑坐标。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;FixedDateAxis&nbsp;createFixedDateAxis(Date&nbsp;baseDate)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FixedDateAxis&nbsp;fixedDateAxis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FixedDateAxis(baseDate,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleDateFormat(</span><span style="color: #000000;">"</span><span style="color: #000000;">HH:mm</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">09:30</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;TickAlignment.START);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">10:00</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">10:30</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">11:00</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">11:30</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;TickAlignment.END);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">13:00</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;TickAlignment.START);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">13:30</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">14:00</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">14:30</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedDateAxis.addDateTick(</span><span style="color: #000000;">"</span><span style="color: #000000;">15:00</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;TickAlignment.END);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fixedDateAxis;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;">运行该示例程序后，可以生成如下图片：<br />
<img alt="jstockchart-timeseries" src="http://farm4.static.flickr.com/3168/2834979157_8d4d2d05da_o.png" width="545" height="300" /><br />
<br />
<strong style="font-size: 12pt;">4. 定制图表<br />
</strong>&nbsp;&nbsp;&nbsp; 由于JFreeChart具有高度的可定制性，所以当生成了JFreeChart实例后，你可以从中获取图表中的各个元素，如Plot，然后再定制它们的属性。详细信息请参见JFreeChart的站点和论坛。<br />
&nbsp;&nbsp;&nbsp; 另外，在创建JStockChart的XXXArea对象时，也可以直接定制若干属性。如，通过PriceArea类，可以设置价格线的颜色(PriceArea.setPriceColor)，均线的颜色(PriceArea.setAverageColor)；是否显示均线(PriceArea.setAverageVisible)；是否显示涨跌幅(PriceArea.setRateVisible)；...。详细信息请参见JStockChart的API文档。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/227555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-09-08 16:12 <a href="http://www.blogjava.net/jiangshachina/archive/2008/09/08/227555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JStockChart -- Preview(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/08/28/225345.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 28 Aug 2008 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/08/28/225345.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/225345.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/08/28/225345.html#Feedback</comments><slash:comments>49</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/225345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/225345.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 14pt;">JStockChart -- Preview</span></strong></div>
<span style="font-size: 10pt;"><a href="http://code.google.com/p/jstockchart/">JStockChart</a>是一款简单但实用的开源图表工具，是对<a href="http://www.jfree.org/jfreechart/">JFreeChart</a>的扩展，仅关注于金融时序图与K线图。(2008.08.29最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; <a href="http://code.google.com/p/jstockchart/">JStockChart</a>对利用<a href="http://www.jfree.org/jfreechart/">JFreeChart</a>生成金融时序图与K线图进行了简化。目前，JStockChart已实现了时序图部分，包括价格线，均线，量图，中间价和涨跌幅。用户仅需传入指定格式的数据，JStockChart即可生成期望的图片。<br />
&nbsp;&nbsp;&nbsp; 对于时序图，如果提供的数据不是"连续"的，JStockChart能够自动补全缺失的数据--被补数据的价格与最近一笔数据的价格相同，而量为0；价格图的纵坐标以指定的"中间价"为中心均匀分布，可重点突出中间价。<br />
&nbsp;&nbsp;&nbsp; 该项目的源文件会在晚些时候上传到<a href="http://code.google.com/">Google Code</a>中，但可以通过下面一组图片先预览一下JStockChart生成的金融时序图。<br />
<img src="http://farm4.static.flickr.com/3249/2804806291_bc6f603b5c_o.png" alt="JStockChart Demo" width="545" height="300" /><br />
允许指定中间价(20.88)，以中间价为基准向上和向下均匀地分布坐标点；允许自由地指定单个坐标点标签的对齐方式--左对齐，右对齐，居中(对于时间坐标，这尤其有用)。<br />
<br />
<img src="http://farm4.static.flickr.com/3245/2807604255_d04635f488_o.png" alt="JStockChart Demo" width="545" height="300" /><br />
自动补全缺失的数据(黑色方框指示的区域)。<br />
<br />
<img src="http://farm4.static.flickr.com/3053/2804806293_a5338c9ff7_o.png" alt="JStockChart Demo" width="545" height="300" /><br />
允许指定各个坐标轴显示的坐标点的个数。<br />
<br />
<img src="http://farm4.static.flickr.com/3166/2804806297_f063a36a70_o.png" alt="JStockChart Demo" width="545" height="300" /><br />
允许指定是否显示某些图线元素(中间价，均线，涨跌幅，...)。<br />
<br />
<img src="http://farm4.static.flickr.com/3057/2804806301_845ed541f3_o.png" alt="JStockChart Demo" width="545" height="300" /><br />
允许只显示价格线图。<br />
<br />
<img src="http://farm4.static.flickr.com/3277/2804806303_b5c2848e93_o.png" alt="JStockChart Demo" width="545" height="300" /><br />
允许只显示量图。<br />
<span style="font-size: 10pt;"><span style="font-size: 10pt;"><br />
</span>对于时序线图，目前我认为JStockChart的三个功能比较重要：<br />
(a)自动补全非连续数据序列中的"缺失"数据。<br />
(b)以"中间价"为中心，价格坐标均匀分布。<br />
(c)"自由"地定制每个坐标的对齐方式，这对于时间坐标尤为重要。<br />
目前JFreeChart就没有提供上述功能，而<br />
[1]JStockChart扩展了JFreeChart中的DateAxis和NumberAxis，根据用户指定的数据与坐标对齐方式，重新计算并生成了DateTick和NumberTick。<br />
[2]JStockChart对JFreeChart中的TimeSeries进行了修饰，结合SegmentedTimeline，新创建了SegmentedTimeSeries，使得能够自动补全缺失的数据。</span></span><br />
<span style="font-size: 10pt;"><br />
P.S.<br />
由于近期赋闲在家，在欣赏奥运比赛之余，就将自己早前的一些想法付诸实现，并发起了这个开源项目。<br />
虽然JStockChart关注的功能点有限，在设计方面肯定也有不如人意之处，但我仍然认为这是一次很有益的尝试。</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/225345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-08-28 17:11 <a href="http://www.blogjava.net/jiangshachina/archive/2008/08/28/225345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判定一个点是否在三角形内(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 24 Jul 2008 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/217214.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/217214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/217214.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">判定一个点是否在三角形内</span></span></strong><br />
</div>
<span style="font-size: 10pt;">如何判定一个点P是否存在于指定的三角形ABC内，这肯定是一个简单的问题，本文仅用一个图形界面程序展示了该问题，有兴趣的朋友可以看看。(2008.07.24最后更新)<br />
<br />
在此处使用一种常见且简便的方法：<strong>如果三角形PAB，PAC和PBC的面积之和与三角形ABC的面积相等，即可判定点P在三角形ABC内(包括在三条边上)</strong>。<br />
可知，该方法的关键在于如何计算三角形的面积。幸运地是，当知道三角形顶点(A，B和C)的坐标((Ax, Ay)，(Bx, By)和(Cx, Cy))之后，即可计算出其面积：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">S&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> |(Ax&nbsp;*&nbsp;By&nbsp;+&nbsp;Bx&nbsp;*&nbsp;Cy&nbsp;+&nbsp;Cx&nbsp;*&nbsp;Zy&nbsp;-&nbsp;Ay&nbsp;*&nbsp;Bx&nbsp;-&nbsp;By&nbsp;*&nbsp;Cx&nbsp;-&nbsp;Cy&nbsp;*&nbsp;Ax)&nbsp;/&nbsp;</span><span style="color: rgb(0, 0, 0);">2|</span></div>
<span style="font-size: 10pt;"><br />
关键的代码如下，<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;由给定的三个顶点的坐标，计算三角形面积。<br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Point(java.awt.Point)代表点的坐标。</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(Point&nbsp;pos1,&nbsp;Point&nbsp;pos2,&nbsp;Point&nbsp;pos3)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;result&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Math.abs((pos1.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.y&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.y&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos1.y<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos1.y&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.y&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;pos1.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.y)&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2.0D</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;result;<br />
}</span></div>
<span style="font-size: 10pt;"><br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;判断点pos是否在指定的三角形内。</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;inTriangle(Point&nbsp;pos,&nbsp;Point&nbsp;posA,&nbsp;Point&nbsp;posB,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;posC)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(posA,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;area&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posB);<br />
&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(pos,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;epsilon&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0.0001</span><span style="color: rgb(0, 0, 0);">;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;由于浮点数的计算存在着误差，故指定一个足够小的数，用于判定两个面积是否(近似)相等。</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(Math.abs(triangleArea&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;area)&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;epsilon)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />
}</span></div>
<span style="font-size: 10pt;"><br />
执行该应用程序，用鼠标在其中点击三次，即可绘制一个三角形，如下组图所示：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t01.PNG" width="300" height="200" /> <img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t02.PNG" width="300" height="200" /><br />
然后仅需移动鼠标，就会出现一个空心圆圈。如果圆圈的中心在三角内(包含在三条边上)，则圆圈显示为红色；否则，显示为蓝色。如下组图所示：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t03.PNG" width="300" height="200" /> <img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t04.PNG" width="300" height="200" /> <img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t05.PNG" width="300" height="200" /><br />
<br />
完整代码如下：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;CanvasPanel&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;JPanel&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;serialVersionUID&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">6665936180725885346L</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;Point&nbsp;firstPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;Point&nbsp;secondPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;Point&nbsp;thirdPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;CanvasPanel()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setBackground(Color.WHITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseListener(mouseAdapter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseMotionListener(mouseAdapter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;paintComponent(Graphics&nbsp;g)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.paintComponent(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawTriangel(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;drawTriangel(Graphics&nbsp;g)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(firstPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;secondPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;secondPoint.x, secondPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(thirdPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(secondPoint.x,&nbsp;secondPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;inTriangle(Point&nbsp;pos,&nbsp;Point&nbsp;posA,&nbsp;Point&nbsp;posB,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;posC)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;triangeArea&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(posA,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;area&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posB);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(pos,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;epsilon&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0.0001</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(Math.abs(triangeArea&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;area)&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;epsilon)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;triangleArea(Point&nbsp;pos1,&nbsp;Point&nbsp;pos2,&nbsp;Point&nbsp;pos3)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;result&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Math.abs((pos1.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.y&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.y&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos1.y<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><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos1.y&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos2.y&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;pos1.x&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;pos3.y)&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2.0D</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;MouseInputAdapter&nbsp;mouseAdapter&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;MouseInputAdapter()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;mouseReleased(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;pos&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e.getPoint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(firstPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(secondPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;secondPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics&nbsp;g&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;CanvasPanel.</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.getGraphics();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanvasPanel.</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.paintComponent(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;secondPoint.x, secondPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(thirdPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thirdPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics&nbsp;g&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;CanvasPanel.</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.getGraphics();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanvasPanel.</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.paintComponent(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;secondPoint.x, secondPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(secondPoint.x,&nbsp;secondPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;mouseMoved(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;pos&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e.getPoint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(Graphics2D)&nbsp;CanvasPanel.</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.getGraphics();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanvasPanel.</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.paintComponent(g2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(firstPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;secondPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;pos.x,&nbsp;pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(firstPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;secondPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;thirdPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;pos.x,&nbsp;pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(secondPoint.x,&nbsp;secondPoint.y,&nbsp;pos.x,&nbsp;pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(firstPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;secondPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;thirdPoint&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(inTriangle(pos,&nbsp;firstPoint,&nbsp;secondPoint,&nbsp;thirdPoint))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.setColor(Color.RED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.setColor(Color.BLUE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;radius&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawOval(pos.x&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;radius,&nbsp;pos.y&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;radius,&nbsp;radius&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">, radius&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
}<br />
</span></div>
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Triangle&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;JFrame&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;serialVersionUID&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1L</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;CanvasPanel&nbsp;mainPanel&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Triangle()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTitle(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Triangle</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Dimension(</span><span style="color: rgb(0, 0, 0);">300</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setResizable(</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;container&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(mainPanel);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setVisible(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;init()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainPanel&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;CanvasPanel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Triangle();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 10pt;"><br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/217214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-07-24 17:02 <a href="http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>下一代Java Applet插件技术(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 14 Jul 2008 11:56:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/214703.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/214703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/214703.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 14pt;">下一代Java Applet插件技术</span></strong><br />
</div>
&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt;">Java SE 6对Java桌面应用进行较大的升级，并启动了Java SE 6 Update N计划，该计划旨在简化JRE的大小，增进用户的安装体验，并提供了一个新的Applet浏览器插件，该插件将会随<a href="https://jdk6.dev.java.net/6u10ea.html">Java SE 6 Update 10</a>发布。<a href="http://java.sun.com/developer/technicalArticles/javase/newapplets/">本文</a>全面介绍了这个新插件的关键特性，并以<a href="http://www.nasa.gov/">NASA</a>的<a href="http://worldwind.arc.nasa.gov/java/">World Wind</a>为例介绍了该插件的应用。(2008.07.15最后更新)<br />
<br />
</span><span style="font-size: 10pt;">Applet回来了！<br />
为了在网络中传递你的程序，是时候再次考虑Java Applet技术了。<a href="http://jdk6.dev.java.net/6u10ea.html">下一代Java插件技术</a>以一种不同的，比过去更高效、更可靠的途径来运行Applet。现在你可以获得如下好处：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;">
    增强的可靠性</span></li>
    <li><span style="font-size: 10pt;">
    改进的用户体验</span></li>
    <li><span style="font-size: 10pt;">
    在后台启动Applet</span></li>
    <li><span style="font-size: 10pt;">
    内建的JNLP支持</span></li>
    <li><span style="font-size: 10pt;">
    针对每个Applet的命令行参数</span></li>
    <li><span style="font-size: 10pt;">
    堆内存大小，Java 2D API加速选项</span></li>
    <li><span style="font-size: 10pt;">
    改进的Java/JavaScript程序设计语言集成</span></li>
    <li><span style="font-size: 10pt;">
    改进的Windows Vista支持</span></li>
    <li><span style="font-size: 10pt;">
    签名的Applet现在可以在Internet Explorer的保护模式中正常运行</span></li>
</ul>
<span style="font-size: 10pt;">
下一代Java插件提供了一种完全重新设计的架构，它将出现在<a href="http://jdk6.dev.java.net/6u10ea.html">Java SE 6 Update 10</a>中。该插件为运行在网络浏览器中的Applet提供了强大的新功能，它以向后兼容的方式改进了整个Applet的可靠性及功能。<br />
下一代Java插件最有意义的新特性是它内建支持通过JNLP文件启动Applet。使用JNLP文件格式作为Applet的描述符就能允许Applet马上复用之前为Java Web Start应用所写的JNLP扩展。<br />
<strong><br />
<span style="font-size: 12pt;">执行Applet的新途径</span></strong><br />
执行Applet的新途径在结构上与Java Web Start技术相似，但与浏览器整合的更为紧密。Applet不在运行于网络浏览器内的JVM中，而是会启动一个独立的JVM进程去运行Applet。默认地，只有一个JVM将被启动，但你也能启动多个JVM，并且可以为每个Applet都设置命令行参数，所以你能影响堆内存的大小或其它的要求。<br />
<img alt="" src="http://java.sun.com/developer/technicalArticles/javase/newapplets/images/architecture.jpg" width="424" height="320" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 10pt;"><strong>Figure 1.</strong> <em>Applet Architecture</em></span><br />
<span style="font-size: 10pt;">
在上图中，云表示JVM实例。在浏览器内有一个小的，headless JVM被用于管理一个或多个客户端JVM之间的连接，这些JVM运行着Applet。在该图中，Duke表示Applet。其中，一个JVM实例运行着两个Applet，另一个运行着一个Applet。<br />
Applet直接从JNLP文件启动，它使用的JNLP文件与Java Web Start软件使用的描述符文件相同，并且允许使用比典型的"archive"，"code"和"cache_archive"更为强大的参数。<br />
新的插件提供了：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;">
    能够访问之前仅由Java Web Start软件专用的高级JNLP扩展。之前有少部分参数能够使用，但有一些限制，现在这些限制则被去除。</span></li>
    <li><span style="font-size: 10pt;">
    通过Applet访问JNLP API。</span></li>
    <li><span style="font-size: 10pt;">
    支持PersistenceService和DownloadService。</span></li>
    <li><span style="font-size: 10pt;">
    能够控制堆内存大小，命令行参数，JRE版本选择和自动下载。你具有Java Web Start软件所拥有的相同功能。</span></li>
</ul>
<span style="font-size: 10pt;">
现在你就可以在Web页面中使用像下面这样的语句了：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">applet&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">500</span><span style="color: #000000;">&#8221;&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">500</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;jnlp_href&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;my_applet.jnlp&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">applet</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">调用Applet生命周期方法init，start，stop和destroy会更为确定，并且已经改进了跨浏览器行为。完全支持Applet类装载器缓存，遗留的Applet生命周期及对向后兼容性的需求，并且这些行为都已得到了改进。<br />
Applet运行的就像一个由Java Web Start启动的应用。参数jnlp_href在Web页面和Applet的JNLP描述之间起到了桥接的作用。在如宽度与高度这样的特定方面，Applet标签与JNLP文件具有重叠的机制。<br />
一般地，你应该使用<a href="https://jdk6.dev.java.net/testDT.html">Deployment Toolkit</a>，这也是一个出现在Java SE 6 Update 10中的新工具，它能自动地为Applet标签生成HTML。<a href="https://jdk6.dev.java.net/deployment_advice.html">部署建议</a>指南展示了如何使用Deployment Toolkit简便地发布Applet。<br />
<br />
<strong><span style="font-size: 12pt;">配置Applet</span></strong><br />
现在也能更为简单地在多个方面来配置Applet，包括堆内存大小，需要被使用的Java版本，类加载器缓存，边界，及其它。<br />
&lt;applet&gt;与JNLP文件在针对某些参数时有重叠的机制。这些冲突可以用如下方法解决：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;"><strong>width and height</strong>：这些属性将总是从&lt;applet&gt;，而不是JNLP文件，中获取。这是假设浏览器知道Applet在Web页面上应该显示多大，也只有浏览器才能支持相对于页面的宽度与高度(例如，width="50%")。</span></li>
    <li><span style="font-size: 10pt;">
    <strong>codebase</strong>：如果JNLP文件在&lt;jnlp&gt;标签中指定了一个绝对的codebase，那么就使用它。否则，将使用在<a href="https://jdk6.dev.java.net/plugin2/jnlp/#CODEBASE">codebase handling</a>一节中描述的规则进行组织。</span></li>
    <li><span style="font-size: 10pt;">
    <strong>code</strong>：当指定了jnlp_href参数，Applet的主类名将从main-class参数换成JNLP文件中的applet-desc标签，并且code属性会被忽略。注意，该特性允许你为经典Java插件写一个拥有反馈的Applet标签，但在新的Java插件中，该标签可使用更高级的功能。请见下面的"兼容性"一节。</span></li>
    <li><span style="font-size: 10pt;">
    任何一个由&lt;param&gt;标签指定的Applet参数将与JNLP文件中指定的参数进行合并。如果&lt;applet&gt;标签和JNLP文件都指定了同一个参数，&lt;applet&gt;标签中的版本将覆盖JNLP文件中的版本，除了参数java_arguments和java_version。</span></li>
    <li><span style="font-size: 10pt;">
    新的java_arguments和java_version参数在JNLP Applet中是不必要的。会替换为通过JNLP文件请求JRE版本或向JVM传递参数的机制。所以，命令行参数和JNLP文件请求的JRE版本将会覆盖HTML中为Applet指定的这些值。</span></li>
    <li><span style="font-size: 10pt;">
    特定的参数，例如image，boxbgcolor等等，在Applet的启动过程中是有用的。在HTML而不是JNLP文件中指定这些参数可能更好些，以便于在加载Web页面时就可立即获取它们，而不用再等到单独下载JNLP文件之后。</span></li>
</ul>
<span style="font-size: 10pt;">
过去，通过Java控制面板设置最大堆内存是有限制的。在新的Java插件中，这些限制被取消。现在Applet可以像命令行应用那样使用大量堆空间。<br />
指定一个比默认值大的堆空间：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">APPLET&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">my_applet.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MyApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java_arguments</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">-Xmx128m</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">APPLET</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">指定一个非默认大小的堆内存以及一个Java 2D硬件加速器选项，该选项常通过JOGL使用OpenGL应用于Applet。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">APPLET&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">my_applet.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MyApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java_arguments</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">-Xmx256m&nbsp;-Dsun.java2d.noddraw=true</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">APPLET</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">如果你喜欢，一个Applet可强制进入一个属于它自己的JVM实例，而与所有其它的Applet隔离开：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;separate_jvm&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&#8221;&nbsp;</span><span style="color: #000000;">/&gt;</span></div>
<span style="font-size: 10pt;">当把某些桌面应用移植到Web浏览器时，这就有用了。<br />
你也能使特定的Applet运行在特定版本的JRE上，如下所示：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">j2se&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">1.4</span><span style="color: #000000;">+</span><span style="color: #000000;">&#8221;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">j2se&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">1.5</span><span style="color: #000000;">*</span><span style="color: #000000;">&#8221;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">当想针对特定版本的JRE，或Applet取代早期版本的选择机制(如同IE浏览器中的CLSID)，进行质量测评时，该方法就很有用了。如果请求了一个非常老的JRE版本，就会强制执行限制；如果Applet试图加载未签名的代码，将会提示用户。<br />
注意，因为支持JNLP的Java插件是在Java SE 6 Update 10中才首次出现的，所以指定像&#8220;1.4+&#8221;这样的版本基本上没有意义的。当需要&#8220;1.7+&#8221;时，这才有意义。<br />
另外，你可以在JNLP文件中使用&lt;update&gt;标签来显著降低第二次及接下来各次启动的时间。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">update&nbsp;check</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;background&#8221;</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">在这种情况下，将使用缓存中已有的Applet程序，并且在后台下载该应用的更新版本。在下次启动时，就会使用新版本。<br />
新的插件也能更好地对图像进行定制，在Applet被加载之前会展示该图像。image参数会以支持动画GIF文件作为目标，<a href="http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/contents.html">Java Plug-in Developers' Guide</a>的<a href="http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/special_attributes.html">Special Attributes</a>一节对此有描述。此外，现也支持如下新的参数：<br />
<strong>boxborder</strong><br />
一个布尔型参数，用于指定在Applet被加载之前是否在Applet区域的边缘绘制一个宽度一象素的边框。默认为true。我们建议将该值设置为false，特别是将一个动画GIF用作加载期图像时，以避免可能的闪烁。<br />
<strong>centerimage</strong><br />
一个布尔型参数，用于指定是否将加载期图像在Applet区域内居中显示，而不是从左上角起始。默认为false。<br />
使用参数boxborder和centerimage的例子：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">APPLET&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">large_archive.jar</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MyApplet</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Use&nbsp;an&nbsp;animated&nbsp;GIF&nbsp;as&nbsp;an&nbsp;indeterminate&nbsp;progress&nbsp;bar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;the&nbsp;applet&nbsp;is&nbsp;loading&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;NAME</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">image</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;VALUE</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">animated_gif.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Turn&nbsp;off&nbsp;the&nbsp;box&nbsp;border&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;better&nbsp;blending&nbsp;</span><span style="color: #0000ff;">with</span><span style="color: #000000;">&nbsp;the<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;surrounding&nbsp;web&nbsp;page&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;NAME</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">boxborder</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;VALUE</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Center&nbsp;the&nbsp;image&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;the&nbsp;applet's&nbsp;area&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;NAME</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">centerimage</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;VALUE</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">APPLET</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;"><br />
<strong><span style="font-size: 12pt;">兼容性</span></strong><br />
现在可更容易维护向后兼容性。你可创建运行在更早Java插件版本上的程序，但仅需提供一个与jnlp_href参数一样的格式完整的&lt;applet&gt;标签就可使用这些新特性了。早期版本的JRE会忽略jnlp_href参数，转而使用&lt;applet&gt;标签。新的Java插件技术将忽略archive和code参数，而仅使用JNLP文件去启动Applet。<br />
<br />
<strong><span style="font-size: 12pt;">World Wind Applet示例</span></strong><br />
由World Wind Java开发组创建的<a href="http://download.java.net/javadesktop/plugin2/wwj/">NASA World Wind Java</a> Applet示例阐述了如果发布像NASA World Wind Java这样的领先类库。同样地，也用示例说明了如何使用JavaScript在Web页面中高效地整合HTML和Applet内容。<br />
<img alt="" src="http://java.sun.com/developer/technicalArticles/javase/newapplets/images/nasaapplet.jpg" width="450" height="283" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
</span><span style="font-size: 10pt;"><strong>Figure 2.</strong> </span><em><span style="font-size: 10pt;">NASA World Wind Applet</span></em><br />
<span style="font-size: 10pt;">该Web页面包含了关于喀斯喀特山脉的信息(要感谢维基百科)，并且将World Wind Java作为一个Applet嵌入其中，以图示该山脉中各山的位置。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">applet&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">wwjApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">600</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">380</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">gov.nasa.worldwind.examples.applet.WWJApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">BackwardCompatibility.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jnlp_href</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">WWJApplet.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">applet</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">WWJApplet随标准的<a href="http://worldwind.arc.nasa.gov/java/">World Wind Java发行包</a>发布。如下所述，你可选择编写你自己的Applet类并将World Wind嵌入其中：<br />
下面是WWJApplet.jnlp文件中相关的部分：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">jnlp&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">WWJApplet.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">resources&nbsp;os</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Windows</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sun.java2d.noddraw</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">resources</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">resources</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">j2se&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://java.sun.com/products/autodl/j2se</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.4+</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">jar&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">worldwind.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;main</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">extension&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jogl</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">resources</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">applet</span><span style="color: #000000;">-</span><span style="color: #000000;">descname</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">WWJ&nbsp;Applet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;main</span><span style="color: #000000;">-</span><span style="color: #000000;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">gov.nasa.worldwind.examples.applet.WWJApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Overwritten&nbsp;by&nbsp;the&nbsp;surrounding&nbsp;web&nbsp;page&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">100</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">100</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">applet</span><span style="color: #000000;">-</span><span style="color: #000000;">desc</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">jnlp</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">注意几点：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;">
    在本例中，worldwind.jar作为主类使用。理想地，从NASA的网站引用它，将其作为一个JNLP扩展，这就使得许多不同的都嵌入了World Wind的应用程序或Applet共享相同的jar文件。详情请见下面的内容。</span></li>
    <li><span style="font-size: 10pt;">
    为了它的硬件加速的3D图形，World Wind Java使用了针对OpenGL API的Java绑定，<a href="http://jogl.dev.java.net/">JOGL</a>。注意，JOGL JNLP扩展仅使用一行代码与应用程序进行结合。也要注意，在Windows平台上，由于OpenGL API与DirectDraw/Direct3D API(该API用于Windows平台默认的Java 2D实现)之间在驱动层面的冲突，需要指定系统参数-Dsun.java2d.noddraw=true。Windows平台上所有使用JOGL的应用程序与Applet程序都需要该系统参数。</span></li>
</ul>
<span style="font-size: 10pt;">
Web页面中的HTML链接调用JavaScript函数，该函数会与Applet进行交互并将其导向合适的山峰。下面是这些链接中的一个：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">a&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">javascript:gotoLocation(MOUNT_RAINIER);</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">Mount&nbsp;Rainier</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">a</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;(southeast&nbsp;of&nbsp;Tacoma,&nbsp;Washington)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span></div>
<span style="font-size: 10pt;">当点击该链接后，将会调用JavaScript函数gotoLocation。该函数定义在同一个Web页面中：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;gotoLocation(locationString)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;params&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;locationString.split(';');<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(params.length&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Lat/lon</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;getWWJApplet().gotoLatLon(parseFloat(params[</span><span style="color: #000000;">1</span><span style="color: #000000;">]),<br />
&nbsp;&nbsp;&nbsp;&nbsp;parseFloat(params[</span><span style="color: #000000;">2</span><span style="color: #000000;">]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
}</span></div>
<span style="font-size: 10pt;">Web页面HTML中的山峰位置将被解码为JavaScript字符串。将从这些字符串中解析出纬度，经度及其它视觉信息，并将它们传递给Applet。 gotoLatLon方法是在WWJApplet类中定义的；上面的方法调用将起动一个JavaScript-to-Java调用，把参数从JavaScript引擎传给Java。World Wind Applet接收该通知，并将视点以动画的方式切换到适当的地方。注意，gotoLatLon方法会迅速地返回，以便浏览器不必等待它的完成；该动画会在一个单独的Java线程中运行。<br />
<img alt="" src="http://java.sun.com/developer/technicalArticles/javase/newapplets/images/mtsthelens.jpg" /><br />
&nbsp;&nbsp;
</span><span style="font-size: 10pt;"><strong>Figure 3.</strong> <em>World Wind Applet with Mount St. Helen's Clicked</em><br />
</span>
<span style="font-size: 10pt;">如上所述，将World Wind Java集成到你的应用程序或Applet程序中的最好方法是将其作为一个JNLP扩展。这允许很多来自网络的集成了World Wind Java的应用程序或Applet程序能够共享World Wind代码资源。为了引用World Wind JNLP扩展，你需将下面的语句行加入到你的应用程序或Applet程序的JNLP文件中的&lt;resources&gt;部分：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">extension&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">worldwind</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">extension&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jogl</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span></div>
<span style="font-size: 10pt;">注意，World Wind扩展JNLP是区分版本的，所以你需参考World Wind文档或访问<a href="http://forum.worldwindcentral.com/forumdisplay.php?f=37">论坛</a>去找到你的JNLP会引用到的扩展的最新版本。<a href="http://worldwindcentral.com/">World Wind Central</a>是一个关于World Wind最新信息的有用资源。<br />
将World Wind作为一个扩展使用就意味着你不能将WWJApplet直接作为你的main-class使用。由于JNLP文件格式的语义，主jar (main="true")必须定义在主JNLP文件中。但很容易就能适应该限制，你可简单地创建你自己的WWJApplet子类(称之为MyWWJApplet)，而它并不做任何事情：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">class&nbsp;MyWWJApplet&nbsp;extends&nbsp;WWJApplet&nbsp;{}</span></div>
<span style="font-size: 10pt;">将worldwind.jar置于classpath中，并编译上述类，然后将该类放入它自己的jar文件中。引入这个jar作为你的主jar，MyWWJApplet就成为了你的main-class，然后将其作为JNLP扩展引入到World Wind中。<br />
<br />
<strong><span style="font-size: 12pt;">结论</span></strong><br />
介绍了Java插件对JNLP的支持，这为Applet的发布提供了很多新的可能，这对在浏览器内外发布Java内容的方法的统一又进了一大步。Applet自从它们起始已过了很长的时间，现在随着对JNLP的支持，它们会比以往更快，也更易于定制。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/214703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-07-14 19:56 <a href="http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>