﻿<?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-Java桌面技术-随笔分类-NetBeans</title><link>http://www.blogjava.net/javagui/category/26767.html</link><description>Java Desktop Technology</description><language>zh-cn</language><lastBuildDate>Thu, 20 Mar 2014 06:52:52 GMT</lastBuildDate><pubDate>Thu, 20 Mar 2014 06:52:52 GMT</pubDate><ttl>60</ttl><item><title>JDK 8和NetBeans 8.0正式版发布了</title><link>http://www.blogjava.net/javagui/archive/2014/03/19/411218.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Wed, 19 Mar 2014 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2014/03/19/411218.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/411218.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2014/03/19/411218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/411218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/411218.html</trackback:ping><description><![CDATA[<div>经过2年半的努力、屡次的延期和9个里程碑版本，甲骨文的Java开发团队终于发布了Java 8正式版本。</div>同时，作为Java首选IDE，NetBeans同时也发布了最新的8.0版本。<br />JDK下载：<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html ">http://www.oracle.com/technetwork/java/javase/downloads/index.html </a><br />NetBeans下载：<a target="null"></a><a href="https://netbeans.org/downloads/">https://netbeans.org/downloads/</a><img src ="http://www.blogjava.net/javagui/aggbug/411218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2014-03-19 13:55 <a href="http://www.blogjava.net/javagui/archive/2014/03/19/411218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans 7.3正式版发布了</title><link>http://www.blogjava.net/javagui/archive/2013/02/22/395567.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Fri, 22 Feb 2013 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2013/02/22/395567.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/395567.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2013/02/22/395567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/395567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/395567.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 甲骨文公司正式推出NetBeans IDE 7.3。<br>对开发者来说，新版本除了改善了对于Java平台的支持，还引入了一系列HTML5、JavaScript和CSS开发功能，开发者可以快速、轻松地构建、调试富互联网应用和移动应用。 &nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2013/02/22/395567.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/395567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2013-02-22 13:25 <a href="http://www.blogjava.net/javagui/archive/2013/02/22/395567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans 7.2正式版发布</title><link>http://www.blogjava.net/javagui/archive/2012/07/24/383888.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Tue, 24 Jul 2012 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2012/07/24/383888.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/383888.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2012/07/24/383888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/383888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/383888.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这次的发布有些低调，但是仍然值得一用&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2012/07/24/383888.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/383888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2012-07-24 23:05 <a href="http://www.blogjava.net/javagui/archive/2012/07/24/383888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重返Swing</title><link>http://www.blogjava.net/javagui/archive/2012/01/06/368027.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Fri, 06 Jan 2012 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2012/01/06/368027.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/368027.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2012/01/06/368027.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/368027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/368027.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我又干起了老本行，Swing。这次回归没有以往对Swing的着迷，取而代之的是对Swing的反感... ...&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2012/01/06/368027.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/368027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2012-01-06 17:30 <a href="http://www.blogjava.net/javagui/archive/2012/01/06/368027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans7.1正式版发布</title><link>http://www.blogjava.net/javagui/archive/2012/01/05/367955.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 05 Jan 2012 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2012/01/05/367955.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/367955.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2012/01/05/367955.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/367955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/367955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本来去年发布，可惜延期到了今年1月。看NetBeans路线图，NetBeans7.1.1也不远了，7.2版本也将于6月底发布。期待吧&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2012/01/05/367955.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/367955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2012-01-05 22:22 <a href="http://www.blogjava.net/javagui/archive/2012/01/05/367955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>缅怀乔布斯</title><link>http://www.blogjava.net/javagui/archive/2011/10/06/360083.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 06 Oct 2011 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2011/10/06/360083.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/360083.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2011/10/06/360083.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/360083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/360083.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有三个苹果改变了世界。夏娃的苹果让人有了道德，牛顿的苹果让人有了科学，乔布斯的苹果让人有了生活&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2011/10/06/360083.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/360083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2011-10-06 23:00 <a href="http://www.blogjava.net/javagui/archive/2011/10/06/360083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans7.0正式发布</title><link>http://www.blogjava.net/javagui/archive/2011/04/21/348677.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 21 Apr 2011 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2011/04/21/348677.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/348677.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2011/04/21/348677.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/348677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/348677.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 经过漫长的等待，无数次延期，NetBeans7.0终于发布了。这次带来了众多改进，如JDK7的支持、GlassFish3.1的支持、Maven3的支持等，都是开发者们盼望已久的功能。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2011/04/21/348677.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/348677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2011-04-21 09:54 <a href="http://www.blogjava.net/javagui/archive/2011/04/21/348677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans6.10发布计划</title><link>http://www.blogjava.net/javagui/archive/2010/08/19/329310.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 19 Aug 2010 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2010/08/19/329310.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/329310.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2010/08/19/329310.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/329310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/329310.html</trackback:ping><description><![CDATA[NetBeans下一个版本是6.10，NetBeans小组正在紧锣密鼓地进行了。http://wiki.netbeans.org/NetBeans_610?intcmp=925655
<div>按照计划，6.10将于明年1月发布。<br />
<div><br />
</div>
</div><img src ="http://www.blogjava.net/javagui/aggbug/329310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2010-08-19 10:05 <a href="http://www.blogjava.net/javagui/archive/2010/08/19/329310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans6.9正式发布</title><link>http://www.blogjava.net/javagui/archive/2010/06/17/323685.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 17 Jun 2010 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2010/06/17/323685.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/323685.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2010/06/17/323685.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/323685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/323685.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天一早来到公司，习惯性地打开www.netbeans.org发现期待已久的6.9版本正式发布。这是一个里程碑的版本，首次正式加入对OSGI的支持。其他编辑特性也明显增强&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2010/06/17/323685.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/323685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2010-06-17 09:50 <a href="http://www.blogjava.net/javagui/archive/2010/06/17/323685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK6 update18发布</title><link>http://www.blogjava.net/javagui/archive/2010/01/14/309402.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 14 Jan 2010 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2010/01/14/309402.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/309402.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2010/01/14/309402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/309402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/309402.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JDK6 update18发布了，这次更新包含了许多值得关注的新特性以及性能的提升&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2010/01/14/309402.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/309402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2010-01-14 09:31 <a href="http://www.blogjava.net/javagui/archive/2010/01/14/309402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans6.8发布了</title><link>http://www.blogjava.net/javagui/archive/2009/12/11/305509.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Fri, 11 Dec 2009 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2009/12/11/305509.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/305509.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2009/12/11/305509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/305509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/305509.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: NetBeans6.8正式发布，同时符合Java EE6规范的GlassFishV3也放出了正式版本。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2009/12/11/305509.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/305509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2009-12-11 09:55 <a href="http://www.blogjava.net/javagui/archive/2009/12/11/305509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>期待NetBeans6.8的发布</title><link>http://www.blogjava.net/javagui/archive/2009/07/17/287139.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Fri, 17 Jul 2009 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2009/07/17/287139.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/287139.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2009/07/17/287139.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/287139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/287139.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 性能问题一向是历代NetBeans发布时的关注焦点。和发布6.7之前的情形一样，6.8版本包含很多值得自豪的改进。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2009/07/17/287139.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/287139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2009-07-17 13:55 <a href="http://www.blogjava.net/javagui/archive/2009/07/17/287139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK 1.6.0_14 发布了</title><link>http://www.blogjava.net/javagui/archive/2009/05/29/278934.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Fri, 29 May 2009 10:54:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2009/05/29/278934.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/278934.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2009/05/29/278934.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/278934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/278934.html</trackback:ping><description><![CDATA[期待已久的JDK 1.6.0_14 发布了。<a title="http://java.sun.com/javase/6/webnotes/6u14.html" href="http://java.sun.com/javase/6/webnotes/6u14.html">http://java.sun.com/javase/6/webnotes/6u14.html</a><br />
本次更新是继Update 10以来最大的一次更新，包含了众多新特性和bug的修复，喜欢尝鲜的开发人员可以试试最新版本的JDK带来的益处。<br />
<br />
需要关注的是JRE的安装界面，Sun标志的背景改为了红色，但愿Oracle能使Java更加辉煌吧。<img src="file:///C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot-2.jpg" alt="" /><img src="file:///C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot-3.jpg" alt="" /><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/javagui/u14install.jpg" height="386" width="504" /><br />
<img src="file:///C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /><img src="file:///C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot-1.jpg" alt="" /><img src ="http://www.blogjava.net/javagui/aggbug/278934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2009-05-29 18:54 <a href="http://www.blogjava.net/javagui/archive/2009/05/29/278934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《FilthyRichClients》读书笔记(二)-让Swing正确显示Gif</title><link>http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Sun, 07 Dec 2008 12:36:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/244891.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/244891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/244891.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 显示GIF图片一直是swing的诟病,本文给出一个用swing处理gif类型图片的参考实现&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/244891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2008-12-07 20:36 <a href="http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《FilthyRichClients》读书笔记(一)-SwingのEDT</title><link>http://www.blogjava.net/javagui/archive/2008/06/23/EDT.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Mon, 23 Jun 2008 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2008/06/23/EDT.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/210182.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2008/06/23/EDT.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/210182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/210182.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 愿借助此帖能使读者彻底理解Swing事件队列及EDT机制，达到“此贴一发，余词尽废”的效果。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2008/06/23/EDT.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/210182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2008-06-23 22:49 <a href="http://www.blogjava.net/javagui/archive/2008/06/23/EDT.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FilthyRichClients中文版</title><link>http://www.blogjava.net/javagui/archive/2008/05/29/FilthyRichClients.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 29 May 2008 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2008/05/29/FilthyRichClients.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/203933.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2008/05/29/FilthyRichClients.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/203933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/203933.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 没想到FilthyRichClients的中文版居然这么快！真是欣喜若狂。打算今后陆续开始写读书笔记，对自己、Swing开发人员都有益处。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2008/05/29/FilthyRichClients.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/203933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2008-05-29 21:09 <a href="http://www.blogjava.net/javagui/archive/2008/05/29/FilthyRichClients.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过xml配置文件定义及布局组件</title><link>http://www.blogjava.net/javagui/archive/2007/12/31/171788.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Sun, 30 Dec 2007 16:49:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/12/31/171788.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/171788.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/12/31/171788.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/171788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/171788.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 无论Matisse发展得如何强大，但是其本质只是用来生成Java代码而已，当你修改这代码后，再逆向恢复成UI设计器时Matisse却出于自己的一套安全考虑不允许你这样做，所以最终不得迫使开发人员放弃拖曳方式设计UI，而统统采用面向代码的方式。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/12/31/171788.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/171788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-12-31 00:49 <a href="http://www.blogjava.net/javagui/archive/2007/12/31/171788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义布局管理器-CenterLayout</title><link>http://www.blogjava.net/javagui/archive/2007/11/29/164038.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Thu, 29 Nov 2007 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/11/29/164038.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/164038.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/11/29/164038.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/164038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/164038.html</trackback:ping><description><![CDATA[<p>上文<a title="自定义布局管理器-FormLayout" href="http://www.blogjava.net/javagui/archive/2007/11/24/FormLayout.html">自定义布局管理器-FormLayout</a>介绍了FormLayout的参考实现，利用FormLayout，通过指定left、top、</p>
<p>right（可选）、bottom（可选）布局约束可以对组件进行精确定位。然而有些组件在业务上是有固定尺寸的，例如<a title="自定义组件之Button" href="http://www.blogjava.net/javagui/archive/2007/11/11/javagui.html">自定义组件之Button</a>介绍的一样，通过给按钮指定4种状态时的图片，那么组件的最佳尺寸就是图片的尺寸，因此组件的PreferredSize就可以确定，所以此时只需要组件<span style="color: red;">中心</span>的确定坐标就可以了，实际组件的Location只和其PreferredSize有关。如下图所示：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/javagui/swing_demo/centerlayout.jpg" border="0" height="232" width="363" /><br />
这就是CenterLayout的思想。</p>
<p>修改FormData，只需要添加两个变量即可。<br />
<span style="color: #3366ff; ">public final class FormData {</span><br /><span style="color: #3366ff; ">&nbsp; &nbsp; public FormAttachment left;</span></p>
<p><span style="color: #3366ff; ">&nbsp; &nbsp; public FormAttachment right;</span></p>
<p><span style="color: #3366ff; ">&nbsp; &nbsp; public FormAttachment top;</span></p>
<p><span style="color: #3366ff; ">&nbsp; &nbsp; public FormAttachment bottom;</span></p>
<p><span style="color: #ff0000; ">&nbsp; &nbsp;&nbsp;</span><span style="color: #ff0000; ">public FormAttachment centerX;</span></p>
<p><span style="color: #ff0000; ">&nbsp; &nbsp; public FormAttachment centerY;</span><span style="color: #3366ff; "><br />
</span><span style="color: #3366ff; ">}</span><br />
CenterLayout与FormLayout不同只在于addLayoutComponent、layoutContainer这两个</p>
<p>方法实现，其他接口方法均相同，所以下面只介绍这两个方法实现，其他接口方法请</p>
<p>参阅上文<a title="自定义布局管理器-FormLayout" href="http://www.blogjava.net/javagui/archive/2007/11/24/FormLayout.html">自定义布局管理器-FormLayout</a><br />
在addLayoutComponent方法的开头，同样是对布局约束参数constraints合法性进行检查，这点与FormLayout大致相同。</p>
if (constraints == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("constraints can't be null");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (!(constraints instanceof FormData)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("constraints must be a " + FormData.class.getName() + " instance");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (comp.getTreeLock()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FormData formData = (FormData) constraints;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (formData.centerX == null || formData.centerY == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("centerX FormAttachment and centerY FormAttachment can't be null");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (comp.getPreferredSize() == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException("component must have preferred size before be add into parent with CenterLayout");<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;componentConstraints.put(comp, (FormData) constraints);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<p>
对于CenterLayout来说，FormData对象的centerX、centerY必须给出，因为它代表，点的坐标，除此之外组件必须有PreferredSize属性来指定组件大小。</p>
<p>layoutContainer方法实现也大致相同<br />
public synchronized void layoutContainer(Container target) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (target.getTreeLock()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w = target.getWidth();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int h = target.getHeight();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Component[] components = target.getComponents();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Component comp : components) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FormData formData =&nbsp;componentConstraints.get(comp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (formData != null) {<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
上面这步与FormLayout一样。关键在if语句块内，代码如下：<br />
&nbsp;
FormAttachment centerX = formData.centerX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FormAttachment centerY = formData.centerY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int width = component.getPreferredSize().width;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int height = component.getPreferredSize().height;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = (int) (centerX.percentage * w) + centerX.offset - width / 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = (int) (centerY.percentage * h) + centerY.offset - height / 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comp.setBounds(x, y, width, height);<br />
获得centerX、centerY以及最佳尺寸，如上图所示，不难得出x、y的计算方法。<br />
<br />
至此，自定义布局管理器就介绍到这里，这两个布局类可以解决很多<span style="color: red;">静态布局</span>需求，所谓静态布局是指容器内有什么组件是固定的。如果遇到动态界面，例如组件的内容依照用户级别、插件扩展点等因素决定，也并不是难事，因为了解了布局管理器运行机制以后可很容易地定义适合你需求的布局类。对于静态布局来说，你可能厌倦了hard coding来布局，你希望这一切由xml这样的配置搞定，好，下一部分则开始&#8220;压轴戏&#8221;&#8212;&#8212;用配置文件解决布局。</p><img src ="http://www.blogjava.net/javagui/aggbug/164038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-11-29 16:53 <a href="http://www.blogjava.net/javagui/archive/2007/11/29/164038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义布局管理器-FormLayout</title><link>http://www.blogjava.net/javagui/archive/2007/11/24/FormLayout.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Sat, 24 Nov 2007 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/11/24/FormLayout.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/162877.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/11/24/FormLayout.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/162877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/162877.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在java.awt包与javax.swing包下有许多现成的布局类，比如BorderLayout、FlowLayout，还有较为复杂的、用于精确定位的布局类GridBagLayout、SpringLayout等。起初我刚刚从事gooey时（06年中），企图依靠JDK自带的布局类进行布局，但是实际不可能或者说很难做到。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/11/24/FormLayout.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/162877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-11-24 18:26 <a href="http://www.blogjava.net/javagui/archive/2007/11/24/FormLayout.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>布局管理器面面观</title><link>http://www.blogjava.net/javagui/archive/2007/11/18/Layout.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Sun, 18 Nov 2007 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/11/18/Layout.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/161403.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/11/18/Layout.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/161403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/161403.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 布局管理器是一个实现了LayoutManager接口或LayoutManager2接口并且能够确定一个容器内部所有组件大小和位置的对象。尽管组件能够提供大小和对齐的提示信息，但是一个容器的布局管理器将最终决定组件的尺寸和位置。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/11/18/Layout.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/161403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-11-18 15:15 <a href="http://www.blogjava.net/javagui/archive/2007/11/18/Layout.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>swing专业外观</title><link>http://www.blogjava.net/javagui/archive/2007/11/07/158849.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Wed, 07 Nov 2007 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/11/07/158849.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/158849.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/11/07/158849.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/158849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/158849.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前3篇文章使用SWT组件实现了专业外观窗口，现在给出一个swing实现版本。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/11/07/158849.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/158849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-11-07 16:17 <a href="http://www.blogjava.net/javagui/archive/2007/11/07/158849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造专业外观-三</title><link>http://www.blogjava.net/javagui/archive/2007/11/07/158693.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Tue, 06 Nov 2007 16:49:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/11/07/158693.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/158693.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/11/07/158693.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/158693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/158693.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在《打造专业外观-二》中，留下了3个未实现的功能：窗口标题和图标，边缘圆角，功能按钮。在本篇中将实现这些功能来完结打造专业外观-窗口部分的讲解。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/11/07/158693.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/158693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-11-07 00:49 <a href="http://www.blogjava.net/javagui/archive/2007/11/07/158693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造专业外观-二</title><link>http://www.blogjava.net/javagui/archive/2007/11/04/158107.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Sun, 04 Nov 2007 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/11/04/158107.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/158107.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/11/04/158107.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/158107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/158107.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇《打造专业外观-九宫图》，介绍了九宫格的概念并留下了一个演示程序。那个程序只是一个渲染过的窗口，许多必要的功能尚未实现，比如拖拽移动、改变大小、标题栏双击等。好现在就来一一实现。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/11/04/158107.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/158107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-11-04 20:12 <a href="http://www.blogjava.net/javagui/archive/2007/11/04/158107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造专业外观-九宫图</title><link>http://www.blogjava.net/javagui/archive/2007/11/03/157948.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Sat, 03 Nov 2007 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/11/03/157948.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/157948.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/11/03/157948.html#Feedback</comments><slash:comments>45</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/157948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/157948.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 起初依赖JButton、JScroll等基础组件，BorderLayout、FlowLayout等现成的布局管理器企图能实现类似MSN的外观效果，但是实际看来是完全不可能的，所以我当时就下了这样的结论，哪怕现在我依然认为是正确的：“抛弃所有的外观设计工具和一切现有的桌面组件及布局管理器，一切的一切必须自定义实现，设计工具最多能替你完成一半”。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/11/03/157948.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/157948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-11-03 17:56 <a href="http://www.blogjava.net/javagui/archive/2007/11/03/157948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans 6.0模块快速入门教程</title><link>http://www.blogjava.net/javagui/archive/2007/10/28/156477.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Sun, 28 Oct 2007 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/10/28/156477.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/156477.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/10/28/156477.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/156477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/156477.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这篇文档展示如何创建一个模块来向IDE或其他基于NetBeans平台的应用程序添加一个Google查询工具栏。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/10/28/156477.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/156477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-10-28 15:15 <a href="http://www.blogjava.net/javagui/archive/2007/10/28/156477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Netbeans模块和富客户端应用学习教程翻译计划</title><link>http://www.blogjava.net/javagui/archive/2007/10/26/netBeans.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Fri, 26 Oct 2007 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/10/26/netBeans.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/156140.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/10/26/netBeans.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/156140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/156140.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     随着netBeans6.0 Beta2的发布，netBeans的优势已越来越明显。但是国内介绍netBeans的书籍相比Eclipse的臭街而言少之又少，而且没有一本专门介绍netBeans插件的书籍，有也是Sun中文技术社区零星的几篇翻译。而我又对netBeans插件的了解还只是入门级水平，看来看去最好去Sun的官方网站看NetBeans Modules学习教程。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/10/26/netBeans.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/156140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-10-26 14:35 <a href="http://www.blogjava.net/javagui/archive/2007/10/26/netBeans.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>netBeans6.0咸鱼翻身与Swing称霸桌面应用</title><link>http://www.blogjava.net/javagui/archive/2007/10/26/netBeans6.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Fri, 26 Oct 2007 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/10/26/netBeans6.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/156126.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/10/26/netBeans6.html#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/156126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/156126.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     长期以来，Java被认为是服务器端的佼佼者而在桌面领域并无建树，早期的Swing在外观和性能上都差强人意，成功案例不多，基于Swing的netBeans无疑惨遭厄运，这样的局面下滋生了SWT和Eclipse这种违背Java原则的产物。&nbsp;&nbsp;<a href='http://www.blogjava.net/javagui/archive/2007/10/26/netBeans6.html'>阅读全文</a><img src ="http://www.blogjava.net/javagui/aggbug/156126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-10-26 13:59 <a href="http://www.blogjava.net/javagui/archive/2007/10/26/netBeans6.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT自定义组件之Slider</title><link>http://www.blogjava.net/javagui/archive/2007/10/23/155271.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Tue, 23 Oct 2007 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/10/23/155271.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/155271.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/10/23/155271.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/155271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/155271.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; 曾经介绍过<a href="http://blog.csdn.net/www_hero/archive/2007/09/10/1778678.aspx">用SWT实现MSN风格的下拉框</a>，SWT虽然没有Swing那么强大，尤其是在打造专业外观上，不支持L&amp;F，但是通过自定义组件，同样可以达到用户要求。下面就向大家介绍本人实现的一个具备专业外观的Slider控件。<br />
&nbsp;&nbsp;&nbsp; 首先来参考一下组件的实际运行效果，并和SWT原生组件进行一下对比。&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height="296" alt="" src="http://www.blogjava.net/images/blogjava_net/javagui/slider_demo.png" width="259" border="0" /></p>
<p>可以看出，经过自定义的组件在外观上要比SWT直接调用本地组件显得更加专业。当用户托拽滑动块时，还会出现一个虚拟的滑动块用来标识将要移动到的位置。演示就到此为止，下面详细介绍这个很Cool的组件是如何通过SWT实现的。</p>
<p>&nbsp;&nbsp;&nbsp; 基本设计思想：与其他自定义组件一样，是通过继承org.eclipse.swt.widgets.Composite来实现，定义该类为Slider，另外滑动块（thumb）也是Composite，并放在Slider之上，当鼠标移动thumb时，调用setBounds方法定位在Slider在父组件（Slider）上的位置，从而达到拖拽thumb的目的。此外通过实现PaintListener接口进行自定义绘制，绘制的对象包括组件边框、被填充的格子、未被填充的格子、虚拟滑块。</p>
<p>&nbsp;&nbsp;&nbsp; 接触过GUI编程的程序员都应该知道像Scroll、Slider、ProgressBar这样的控件都有setMaxValue、setMinValue、setValue这样的方法，除了鼠标拖拽thumb来改变当前数值外，可直接调用setValue来设置当前值。此外这些控件还有水平（Horizontal）、垂直（Vertical）两种布局，对于事件处理一般都要有一个从java.util.EventObject继承而来的事件类，还要编写事件监听器（Listener）接口，因此在开始编写Slider控件之前先定义3个类，代码都不是很长，如果你熟悉AWT、Swing的事件处理机制，相信你能轻松跳过。</p>
<p><br />
public enum SliderOrientation {<br />
&nbsp;HORIZONTAL, VERTICAL;<br />
}</p>
<p>public class SliderEvent extends EventObject {</p>
<p>&nbsp;private int value;</p>
<p>&nbsp;public SliderEvent(Object source, int value) {<br />
&nbsp;&nbsp;super(source);<br />
&nbsp;&nbsp;this.value = value;<br />
&nbsp;}</p>
<p>&nbsp;public int getValue() {<br />
&nbsp;&nbsp;return value;<br />
&nbsp;}<br />
}</p>
<p>public interface SliderListener {</p>
<p>&nbsp;public void valueChanged(SliderEvent event);<br />
}</p>
<p>&nbsp;&nbsp;&nbsp; 接下来着重介绍Slider。首先是继承Composite并实现ControlListener、PaintListener、MouseListener,、MouseMoveListener,、MouseTrackListener，然后自动生成接口方法代码，通过Eclipse可以轻松实现，需要注意的是MouseListener，有java.awt.event.MouseListener和org.eclipse.swt.events.MouseListener两种，不要混淆，否则错误很难找到。然后是要采集一些数据信息，分别是：边框颜色、已有数据部分的填充颜色（上图中组件的绿色部分）、未达到数据部分的填充颜色（上图中组件的白色部分）、被禁用时的填充颜色、水平滑块的图标（正常、托拽中两种）、垂直滑块图标（正常、托拽中两种）、水平、垂直虚拟滑块图标。以上这些数据对应的常量声明如下：</p>
<p>&nbsp;private final Color BORDER_COLOR = new Color(Display.getCurrent(), 180, 188, 203);</p>
<p>&nbsp;private final Color FILL_COLOR = new Color(Display.getCurrent(), 147, 217, 72);</p>
<p>&nbsp;private final Color BLANK_COLOR = new Color(Display.getCurrent(), 254, 254, 254);</p>
<p>&nbsp;private final Color DISABLE_COLOR = new Color(Display.getCurrent(), 192, 192, 192);</p>
<p>&nbsp;private final Image THUMB_ICON_V = new Image(Display.getDefault(), "slider_up_v.png");</p>
<p>&nbsp;private final Image THUMB_OVER_ICON_V = new Image(Display.getDefault(), "slider_over_v.png");</p>
<p>&nbsp;private final Image THUMB_ICON_H = new Image(Display.getDefault(),&nbsp;"slider_up_h.png");</p>
<p>&nbsp;private final Image THUMB_OVER_ICON_H = new Image(Display.getDefault(), "slider_over_h.png");</p>
<p>&nbsp;private final Image TEMP_H = new Image(Display.getDefault(), "temp_h.png");</p>
<p>&nbsp;private final Image TEMP_V = new Image(Display.getDefault(), "temp_v.png");</p>
<p>&nbsp;除了这些常量，还应该声明默认最大值的常量，private final int DEFAULT_MAX_VALUE = 100;<br />
接下来定义当前数值和最大值，<br />
private int value;<br />
private int maxValue = DEFAULT_MAX_VALUE;<br />
并生成以上两个成员属性的get方法<br />
然后定义滑动块和布局<br />
private SliderOrientation orientation;<br />
private Composite thumb;<br />
要处理数值变化，需要实现一组监听器，添加如下代码<br />
private List&lt;SliderListener&gt; listeners = new ArrayList&lt;SliderListener&gt;();<br />
public void addSliderListener(SliderListener sliderListener) {<br />
&nbsp;listeners.add(sliderListener);<br />
}<br />
public void removeSliderListener(SliderListener sliderListener) {<br />
&nbsp;listeners.remove(sliderListener);<br />
}<br />
接下来定义2个辅助方法，实现value&lt;-&gt;pelsLength转换。其中value是当前的数值，由具体业务来决定，下文中称其业务值。例如一个音量控制器，音量范围在0~500，那么从业务上来讲可以将数值设置在0~500之间的任何数，而pelsLength则由控件的长/高度来决定，单位是像素。但是value与pelsLength之间存在着一个比例关系式：value/maxValue=pelsLength/控件长度或高度。这样不难得出两个函数的定义。<br />
private int valueToPels(int value) {<br />
&nbsp;&nbsp;float widgetLength = (orientation == SliderOrientation.HORIZONTAL) ? getBounds().width<br />
&nbsp;&nbsp;&nbsp;&nbsp;: getBounds().height;<br />
&nbsp;&nbsp;return (int) (widgetLength * (float) value / (float) maxValue);<br />
&nbsp;}</p>
<p>&nbsp;private int pelsToValue(int pels) {<br />
&nbsp;&nbsp;float widgetLength = (orientation == SliderOrientation.HORIZONTAL) ? getBounds().width<br />
&nbsp;&nbsp;&nbsp;&nbsp;: getBounds().height;<br />
&nbsp;&nbsp;return (int) ((float) pels * (float) maxValue / (float) widgetLength);<br />
&nbsp;}<br />
最后定义构造器。代码如下<br />
public Slider(Composite parent, SliderOrientation orientation) {<br />
&nbsp;&nbsp;super(parent, SWT.FLAT);<br />
&nbsp;&nbsp;this.orientation = orientation;<br />
&nbsp;&nbsp;thumb = new Composite(this, SWT.FLAT);<br />
&nbsp;&nbsp;thumb<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setBackgroundImage(orientation == SliderOrientation.VERTICAL ? THUMB_ICON_V<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: THUMB_ICON_H);<br />
&nbsp;&nbsp;addControlListener(this);<br />
&nbsp;&nbsp;addPaintListener(this);<br />
&nbsp;&nbsp;thumb.addMouseListener(this);<br />
&nbsp;&nbsp;thumb.addMouseMoveListener(this);<br />
&nbsp;&nbsp;thumb.addMouseTrackListener(this);<br />
&nbsp;}<br />
在构造器中，注入布局对象，然后在控件上创建滑动块组件thumb，并添加鼠标处理等。<br />
到此为止，基本的成员和方法的定义完毕，下面循序渐进讨论如何实现这一Slider。</p>
<p>一、绘制边框<br />
由于是绘制操作，所以一切绘制代码均在paintControl方法内实现，先将如下代码拷贝到paintControl内<br />
int w = getBounds().width;<br />
int h = getBounds().height;<br />
int fillLength = valueToPels(getValue());<br />
GC gc = e.gc;<br />
switch (orientation) {<br />
&nbsp;case HORIZONTAL:<br />
&nbsp;&nbsp;break;<br />
&nbsp;case VERTICAL:<br />
&nbsp;&nbsp;break;<br />
}<br />
分析如下<br />
首先获取控件的长度与高度，因为接下来的绘制要经常用到这两个变量。<br />
&#8220;int fillLength = valueToPels(getValue());&#8221;这一行代码稍后作解释，然后是获得绘制上下文对象，下一步是根据布局不同采用不同的处理，除了paintControl函数，在其他很多地方都对布局进行判断，但是简单起见，只对水平布局进行介绍，垂直部分参考完整程序。<br />
接下来的绘制操作均在case HORIZONTAL中进行，首先将颜色设置为边框的颜色<br />
gc.setForeground(BORDER_COLOR);然后绘制一个矩形gc.drawRectangle(0, 2, w - 1, h - 5);<br />
关于为什么要偏移2像素、长度为什么减1、高度为什么减5，请参考有关绘图的基本知识，<a href="http://blog.csdn.net/www_hero/archive/2007/09/10/1778678.aspx">上一篇</a>也有简单的介绍。</p>
<p>现在，你就可以编写测试程序来验证结果了，看看边框是否与示例的效果一样。<br />
</p>
<p>二、托拽thumb的实现<br />
桌面GUI编程领域技术深浅的度量衡通常有4项指标：皮肤（外观，swing组件体系称其L&amp;F）、绘图、自定义组件布局（Layout）、自定义组件。而托拽是实现自定义组件和绘图不可或缺的技术，也是难点之一，因此掌握的深浅是衡量桌面编程水平的标志。<br />
虽然作为难点，但是也有章可循，其基本实现简单到只监听鼠标事件这么简单，基本流程是：当鼠标在thumb上按下时，记住这个位置，然后按住鼠标左键托拽，最后松开鼠标计算两个位置之间的距离（位移），根据位移量移动thumb的位置并换算出等价的value增量（可能为负值）进行业务逻辑处理。下面通过代码循序渐进完成。<br />
定义一个位置变量用来存储鼠标单击的位置，private Point controlPoint;然后实现public void mouseDown(MouseEvent e)和public void mouseUp(MouseEvent e)两个方法。<br />
public void mouseDown(MouseEvent e) {<br />
&nbsp;&nbsp;controlPoint = new Point(e.x, e.y);<br />
&nbsp;&nbsp;thumb<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setBackgroundImage(orientation == SliderOrientation.VERTICAL ? THUMB_OVER_ICON_V<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: THUMB_OVER_ICON_H);<br />
&nbsp;}</p>
<p>&nbsp;public void mouseUp(MouseEvent e) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;thumb<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setBackgroundImage(orientation == SliderOrientation.VERTICAL ? THUMB_ICON_V<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: THUMB_ICON_H);<br />
&nbsp;&nbsp;&nbsp;countValue(e);<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;controlPoint = null;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&#8220;controlPoint = new Point(e.x, e.y);&#8221;这一行实现记住鼠标点的位置，注意，这个位置是相对滑块thumb的，因为是thumb监听的鼠标事件。接下来是设置滑动块背景，不难理解当鼠标松开时，应该将背景恢复。然后进行非常重要的换算工作，通过countValue方法实现，最后务必要把鼠标位置清空，用try-finally是有必要这样的。之所以要在方法结束的时候清空controlPoint，是因为在鼠标移动的时候需要对controlPoint进行更加复杂的计算。稍后讲解mouseMove实现的时候再作解释，接下来着重分析countValue方法。<br />
如前所述，countValue完成计算鼠标按下、松开的位移量，换算成与业务相关的数据（value）。<br />
private void countValue(MouseEvent e) {<br />
&nbsp;&nbsp;switch (orientation) {<br />
&nbsp;&nbsp;case HORIZONTAL:<br />
&nbsp;&nbsp;&nbsp;int movedX = e.x - controlPoint.x;<br />
&nbsp;&nbsp;&nbsp;setValue(getValue() + pelsToValue(movedX));<br />
&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;case VERTICAL:<br />
&nbsp;&nbsp;&nbsp;......<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&#8220;int movedX = e.x - controlPoint.x;&#8221;实现了位移量的计算，保存到movedX，调用pelsToValue方法将movedX转换成业务值的增量，然后调用setValue重新赋值，注意pelsToValue得到的是增量，需要与原值（getValue()得到）叠加。接下来分析setValue方法。<br />
public void setValue(int value) {<br />
&nbsp;&nbsp;if (value &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;this.value = 0;<br />
&nbsp;&nbsp;} else if (value &gt; getMaxValue()) {<br />
&nbsp;&nbsp;&nbsp;this.value = getMaxValue();<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;this.value = value;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;moveThumb();<br />
&nbsp;&nbsp;&nbsp;redraw();<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;for (SliderListener listener : listeners) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SliderEvent event = new SliderEvent(this, getValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listener.valueChanged(event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
方法开始处的一系列if语句对value进行验证后再赋值，然后是调用moveThumb实现滑块移动、调用redraw对组件重新绘制，最后是处理具体的业务，可以看出处理业务是setValue方法的关键，所以要用try-finally，谁也不敢确保moveThumb、redraw不出问题。对于实现业务是遍历监听器列表然后执行每个监听器的valueChanged方法，这种事件源-监听器模型也是Java2以后的GUI事件实现模型。</p>
<p>&nbsp;private void moveThumb() {<br />
&nbsp;&nbsp;Image icon = thumb.getBackgroundImage();<br />
&nbsp;&nbsp;int iconw = (icon != null) ? icon.getBounds().width : 0;<br />
&nbsp;&nbsp;int iconh = (icon != null) ? icon.getBounds().height : 0;<br />
&nbsp;&nbsp;switch (orientation) {<br />
&nbsp;&nbsp;case HORIZONTAL:<br />
&nbsp;&nbsp;&nbsp;int x = valueToPels(getValue()) - iconw / 2;<br />
&nbsp;&nbsp;&nbsp;if (x &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;x = 0;<br />
&nbsp;&nbsp;&nbsp;} else if (x &gt; getBounds().width - iconw) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;x = getBounds().width - iconw;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;thumb.setBounds(x, 0, iconw, iconh);<br />
&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;case VERTICAL:<br />
&nbsp;&nbsp;&nbsp;......&nbsp;&nbsp;}<br />
&nbsp;}<br />
不难理解，moveThumb的任务就是根据业务值value来将滑块移动到正确的位置。<br />
以上代码声明滑块的位置是&#8220;x&#8221;，通过转换函数获得，但是还要减去滑块的一半，因为具体坐标应该落到滑动块的中间，仔细想想不难得出。if-else是对x进行验证，最后通过setBound来定位thumb。<br />
对于redraw,他的作用是触发paintControl方法进行重绘，因为重绘出了边框还要根据value绘制填充格子，而value已经在redraw方法调用前被赋了值，所以这时候应该进行重绘。<br />
现在你可以托拽thumb了，美中不足的是滑动块不能随时跟随鼠标的轨迹移动，这个稍后会实现。</p>
<p>三、填充格子<br />
现在的组件外观只是绘制了边框，现在进行格子填充。在讲述边框绘制的时候提到了一行代码&#8220;int fillLength = valueToPels(getValue());&#8221;现在不难理解吧，就是将当前业务值value转换成实际的长度。在绘制边框之后，加入如下代码：<br />
if (getEnabled()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;gc.setBackground(FILL_COLOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 2; i &lt; w - 2; i += 4) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i &gt; fillLength) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.setBackground(BLANK_COLOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.fillRectangle(i, 4, 3, h - 8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;gc.setBackground(DISABLE_COLOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;gc.fillRectangle(1, 4, w - 1, h - 8);<br />
&nbsp;&nbsp;&nbsp;}<br />
首先判断是否是enable，然后设置填充颜色FILL_COLOR，然后在for循环中执行正方形格子的填充，递增量&#8220;i&#8221;从2开始是空开2像素间隔，同理i也不能超过w-2（对称性），i+=4是相邻两个格子左边坐标间距4像素，然后&#8220;gc.fillRectangle(i, 4, 3, h - 8);&#8221;这一行进行填充绘制正方形。留意，x坐标是i，y坐标是从4开始画的，出于对称高度也要&#8220;h-8&#8221;，长度之所以是&#8220;3&#8221;是保持相邻两个格子之间保持1像素的间隔（想想&#8220;i+=4&#8221;就不难得出答案）。此外还要对fillLength进行判断以便决定颜色采用绿色还是白色以示区分。对于绘图操作来说，千万不要埋怨考虑细节过多，事实上，GUI编程过程中&#8220;坐标系&#8221;这个概念是需要经常被考虑的，试想如果上述代码for循环中把&#8220;i+=4&#8221;，写成&#8220;i+=5&#8221;，只是一个像素之差绘制效果差之千里，如果想知道笔者是如何得到这些坐标数据的，实话说，是靠多次调试得出的结果。<br />
现在你运行程序，应该能根据value进行格子填充了。到此为止，绝大多数的功能已经实现，但是人性化的界面设计应该在托拽时出现一个虚拟的滑动块用来标识将要移动到的位置。好，继续实现这一功能。<br />
定义一个int变量纪录thumb的临时位置，private int tempLocation;然后在paintControl添加如下红色代码<br />
case HORIZONTAL:<br />
&nbsp;&nbsp;&nbsp;gc.setForeground(BORDER_COLOR);<br />
&nbsp;&nbsp;&nbsp;gc.drawRectangle(0, 2, w - 1, h - 5);<br />
&nbsp;&nbsp;&nbsp;if (getEnabled()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;gc.setBackground(FILL_COLOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 2; i &lt; w - 2; i += 4) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i &gt; fillLength) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.setBackground(BLANK_COLOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.fillRectangle(i, 4, 3, h - 8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<span style="color: #ff0000">&nbsp;&nbsp;if (controlPoint != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.drawImage(TEMP_H, tempLocation, 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span>&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;gc.setBackground(DISABLE_COLOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;gc.fillRectangle(1, 4, w - 1, h - 8);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;break;<br />
很直观，对于水平布局就是在(tempLocation,0)画出&#8220;TEMP_H&#8221;图标。外面的if很重要，还记得mouseDown方法中的语句&#8220;controlPoint = new Point(e.x, e.y);&#8221;和mouseUp方法中的语句&#8220;controlPoint = null;&#8221;吗，当鼠标按下托拽开始时，为controlPoint赋值，当鼠标完成托拽松开时，将controlPoint置null，在这个托拽过程中controlPoint一直保持非null状态，所以paintControl方法才将图标画出。如果现在就着急运行程序则会发现，鼠标托拽时候虚拟图标总停留在最左边（如果垂直布局停留在最上边，因为并没有为tempLocation赋值默认是0），不会跟随鼠标移动。如果要实现真正的托拽那么必须在鼠标移动时反复执行paintControl，下面花大量的笔墨详细地介绍mouseMove方法的实现，并简单介绍绘图操作的一些原理和流程。<br />
开门见山，直接将mouseMove函数的全部代码列出。<br />
public void mouseMove(MouseEvent e) {<br />
&nbsp;&nbsp;if (controlPoint == null) {<br />
&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;int maxLength;<br />
&nbsp;&nbsp;int maxLocator;<br />
&nbsp;&nbsp;switch (orientation) {<br />
&nbsp;&nbsp;case HORIZONTAL:<br />
&nbsp;&nbsp;&nbsp;maxLength = valueToPels(getMaxValue());<br />
&nbsp;&nbsp;&nbsp;maxLocator = maxLength - TEMP_H.getBounds().width;<br />
&nbsp;&nbsp;&nbsp;int movedX = e.x - controlPoint.x;<br />
&nbsp;&nbsp;&nbsp;redraw(tempLocation, 0, TEMP_H.getBounds().width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMP_H.getBounds().height, false);<br />
&nbsp;&nbsp;&nbsp;tempLocation = valueToPels(getValue()) + movedX<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- TEMP_H.getBounds().width / 2;<br />
&nbsp;&nbsp;&nbsp;if (tempLocation &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;tempLocation = 0;<br />
&nbsp;&nbsp;&nbsp;} else if (tempLocation &gt; maxLocator) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;tempLocation = maxLocator;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;case VERTICAL:<br />
&nbsp;&nbsp;&nbsp;......<br />
&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
最前面的if语句表明，只有鼠标按下时移动鼠标才算托拽，道理前面已经阐明了。maxLength代表最大值转换得到的像素，maxLocator是虚拟图标左端（上端）最大坐标，movedX代表托拽的位移量。最下面的if-else if目的很明了。整个mouseMove函数中<br />
redraw(tempLocation, 0, TEMP_H.getBounds().width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMP_H.getBounds().height, false);<br />
&nbsp;&nbsp;&nbsp;tempLocation = valueToPels(getValue()) + movedX<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- TEMP_H.getBounds().width / 2;<br />
是整个托拽操作最难懂也是技术含量最高的两条语句。简单起见暂时用下面的语句代替<br />
tempLocation = valueToPels(getValue()) + movedX<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- TEMP_H.getBounds().width / 2;<br />
&nbsp;&nbsp;&nbsp;if (tempLocation &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;tempLocation = 0;<br />
&nbsp;&nbsp;&nbsp;} else if (tempLocation &gt; maxLocator) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;tempLocation = maxLocator;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;redraw();<br />
其中&#8220;tempLocation&#8221;的赋值语句不变，变化的是redraw函数的调用位置和参数。这样的变化使得意思就不难理解了，首先确定tempLocation的值，等号右边的计算结果也不难理解，然后调用redraw方法重画组件。如果这时候你运行程序，托拽时确实虚拟光标会跟随鼠标移动，但是也会发现组件闪烁得很厉害！具体程度取决于用户计算机的性能，关于&#8220;组件重绘时闪烁&#8221;的问题是绘图操作的一个常见问题，不仅仅是Java，任何支持绘图的计算机语言都可以暴露这样的问题，当年在大学用MFC、VB的编写过画图板的人应该熟悉这类问题。<br />
在具体讨论之前先简单讲述鼠标监听器中的mouseMove操作<br />
一旦为GUI组件添加鼠标移动监听器，当鼠标光标在组件上移动时便调用监听器接口的mouseMove(MouseEvent e)方法，mouseMove调用的频率与鼠标移动的快慢有关，移动越快mouseMove被调用的次数就越少，反之就越多。假设鼠标从组件上的A点移动到B点，如果鼠标移动得足够快，那么就可以理解为从A直接到B而不经过中间的任何一个点，那么mouseMove函数仅仅调用一次。反之鼠标慢慢从A移动到B，那么中间可能会经过C、D、E、F......一系列的点，而mouseMove也会被执行多次。总之当鼠标在组件上移动时，mouseMove会频繁被调用，之所以闪烁问题出在redraw方法，如果redraw方法不加任何参数那么将对组件全部重绘，对于鼠标托拽这种操作鼠标每移动一次就要对组件全部重绘，性能的代价可想而知，不闪才怪呢。解决的办法就是只重绘变化的部分。<br />
如何做到这一点，要先了解必要的绘图机制，在SWT中（Swing绘图原理与其类似）redraw其实会包含2个含义，擦除、绘制，所以得名于redraw，意思就是重绘。首先是根据传入redraw方法的参数确认需要擦除的范围，如果没有则擦除全部，然后<span style="color: #ff0000">底层会创建一个绘制请求交给操作系统去处理，但是这个请求不会在redraw方法调用完毕后立即被处理，即重绘操作不会立即执行，它是被送进底层的事件队列中</span>。处理时的绘制操作是由paintControl完成，所以redraw的调用会导致paintControl的执行。<br />
再将那两行代码列出来。<br />
redraw(tempLocation, 0, TEMP_H.getBounds().width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMP_H.getBounds().height, false);<br />
&nbsp;&nbsp;&nbsp;tempLocation = valueToPels(getValue()) + movedX<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- TEMP_H.getBounds().width / 2;<br />
如果光标从A移到B处，redraw方法所做的事情是通知重绘光标在A点时虚拟图标范围内的图像，然后立即创建一个绘制请求送到系统事件队列，然后更新tempLocation的值。现在再将绘制的那部分代码列出<br />
if (controlPoint != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.drawImage(TEMP_H, tempLocation, 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
将这两部分代码列出来做个比较，还有非常重要的一点需要指出，托拽时虚拟光标能呈连续性移动，这一功能之所以能得以实现非常重要的一点是：<span style="color: #ff0000">从底层请求送入事件队列到请求被执行存在时间差</span>，利用这个时间差（时间非常短）可以执行一些&#8220;更新操作&#8221;，比如上面的更新tempLocation。简单的理解是redraw方法调用会以异步方式执行擦除、绘制。当执行绘制操作&#8220;gc.drawImage(TEMP_H, tempLocation, 0);&#8221;时，tempLocation已经是更新后的值了，而redraw表明擦除旧区域的图像，因为当paintControl执行时这部分图像区域根据计算结果已经不再是虚拟滑块了。下面做一个试验。<br />
添加下面红色代码<br />
redraw(tempLocation, 0, TEMP_H.getBounds().width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMP_H.getBounds().height, false);<br />
&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(1000);<br />
&nbsp;&nbsp;&nbsp;} catch (InterruptedException e1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e1.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
</span>&nbsp;&nbsp;&nbsp;tempLocation = valueToPels(getValue()) + movedX<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- TEMP_H.getBounds().width / 2;<br />
这样在绘制执行时，tempLocation还没有得到更新，效果运行下知晓。<br />
<br />
现在，你可以运行完整的程序了，看一下托拽时的效果。<br />
完整的程序<a title="这里" href="http://blogs.oracle.com/Swing/resource/Slider_Demo.zip">这里</a>下载</p><img src ="http://www.blogjava.net/javagui/aggbug/155271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-10-23 13:35 <a href="http://www.blogjava.net/javagui/archive/2007/10/23/155271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求《Pro Netbeans IDE 6 Rich Client Platform Edition》电子版</title><link>http://www.blogjava.net/javagui/archive/2007/10/23/155260.html</link><dc:creator>sun_java_studio@yahoo.com.cn(电玩)</dc:creator><author>sun_java_studio@yahoo.com.cn(电玩)</author><pubDate>Tue, 23 Oct 2007 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/javagui/archive/2007/10/23/155260.html</guid><wfw:comment>http://www.blogjava.net/javagui/comments/155260.html</wfw:comment><comments>http://www.blogjava.net/javagui/archive/2007/10/23/155260.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/javagui/comments/commentRss/155260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javagui/services/trackbacks/155260.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 前些日子在netbeans.org上看到年底要出版一本关于netBeans6.0的指南《Pro Netbeans IDE 6 Rich Client Platform Edition》，突然萌生翻译此书的想法，为国内Java开发者做一点贡献。翻译的工作很辛苦，最初当然只是在博客上发表，还望同仁多多指教。<br />
&nbsp;&nbsp;&nbsp; 首要任务是希望尽快拿到该书的电子版，请业界同仁帮忙，不胜感激！<br />
<img height="500" alt="" src="http://www.blogjava.net/images/blogjava_net/javagui/51-GNoY44qL__SS500_.jpg" width="500" border="0" /><br />
<p>该书的详细介绍参见<a title="http://www.amazon.com/Pro-Netbeans-Rich-Client-Platform/dp/1590598954" href="http://www.amazon.com/Pro-Netbeans-Rich-Client-Platform/dp/1590598954">http://www.amazon.com/Pro-Netbeans-Rich-Client-Platform/dp/1590598954</a></p>
  <img src ="http://www.blogjava.net/javagui/aggbug/155260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(电玩)</a> 2007-10-23 13:21 <a href="http://www.blogjava.net/javagui/archive/2007/10/23/155260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>