??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美国产小视频,天堂精品中文字幕在线,成人高清在线http://www.aygfsteel.com/javagui/category/26767.htmlJava Desktop Technologyzh-cnThu, 20 Mar 2014 06:52:52 GMTThu, 20 Mar 2014 06:52:52 GMT60JDK 8和NetBeans 8.0正式版发布了(jin)http://www.aygfsteel.com/javagui/archive/2014/03/19/411218.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Wed, 19 Mar 2014 05:55:00 GMThttp://www.aygfsteel.com/javagui/archive/2014/03/19/411218.htmlhttp://www.aygfsteel.com/javagui/comments/411218.htmlhttp://www.aygfsteel.com/javagui/archive/2014/03/19/411218.html#Feedback0http://www.aygfsteel.com/javagui/comments/commentRss/411218.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/411218.htmll过2q半的努力、屡ơ的延期?个里E碑版本Q甲骨文的Java开发团队终于发布了(jin)Java 8正式版本?/div>同时Q作为Java首选IDEQNetBeans同时也发布了(jin)最新的8.0版本?br />JDK下蝲Q?a >http://www.oracle.com/technetwork/java/javase/downloads/index.html
NetBeans下蝲Q?a target="null">https://netbeans.org/downloads/

sun_java_studio@yahoo.com.cn(늎) 2014-03-19 13:55 发表评论
]]>
NetBeans 7.3正式版发布了(jin)http://www.aygfsteel.com/javagui/archive/2013/02/22/395567.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Fri, 22 Feb 2013 05:25:00 GMThttp://www.aygfsteel.com/javagui/archive/2013/02/22/395567.htmlhttp://www.aygfsteel.com/javagui/comments/395567.htmlhttp://www.aygfsteel.com/javagui/archive/2013/02/22/395567.html#Feedback0http://www.aygfsteel.com/javagui/comments/commentRss/395567.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/395567.html对开发者来_(d)新版本除?jin)改善?jin)对于Javaq_的支持,q引入了(jin)一pdHTML5、JavaScript和CSS开发功能,开发者可以快速、轻村֜构徏、调试富互联|应用和Ud应用?  阅读全文

sun_java_studio@yahoo.com.cn(늎) 2013-02-22 13:25 发表评论
]]>
NetBeans 7.2正式版发?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2012/07/24/383888.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/383888.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2012/07/24/383888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/383888.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/383888.html</trackback:ping><description><![CDATA[     摘要: q次的发布有些低调,但是仍然值得一?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2012/07/24/383888.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/383888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2012-07-24 23:05 <a href="http://www.aygfsteel.com/javagui/archive/2012/07/24/383888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重返Swinghttp://www.aygfsteel.com/javagui/archive/2012/01/06/368027.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Fri, 06 Jan 2012 09:30:00 GMThttp://www.aygfsteel.com/javagui/archive/2012/01/06/368027.htmlhttp://www.aygfsteel.com/javagui/comments/368027.htmlhttp://www.aygfsteel.com/javagui/archive/2012/01/06/368027.html#Feedback8http://www.aygfsteel.com/javagui/comments/commentRss/368027.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/368027.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2012-01-06 17:30 发表评论
]]>
NetBeans7.1正式版发?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2012/01/05/367955.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/367955.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2012/01/05/367955.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/367955.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/367955.html</trackback:ping><description><![CDATA[     摘要: 本来d发布Q可惜g期到?jin)今q?月。看NetBeans路线图,NetBeans7.1.1也不q了(jin)Q?.2版本也将?月底发布。期待吧  <a href='http://www.aygfsteel.com/javagui/archive/2012/01/05/367955.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/367955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2012-01-05 22:22 <a href="http://www.aygfsteel.com/javagui/archive/2012/01/05/367955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>~怀乔布?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2011/10/06/360083.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/360083.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2011/10/06/360083.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/360083.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/360083.html</trackback:ping><description><![CDATA[     摘要: 有三个苹果改变了(jin)世界。夏娃的Ҏ(gu)让h有了(jin)道dQ牛的Ҏ(gu)让h有了(jin)U学Q乔布斯的苹果让人有?jin)生z?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2011/10/06/360083.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/360083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2011-10-06 23:00 <a href="http://www.aygfsteel.com/javagui/archive/2011/10/06/360083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans7.0正式发布http://www.aygfsteel.com/javagui/archive/2011/04/21/348677.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Thu, 21 Apr 2011 01:54:00 GMThttp://www.aygfsteel.com/javagui/archive/2011/04/21/348677.htmlhttp://www.aygfsteel.com/javagui/comments/348677.htmlhttp://www.aygfsteel.com/javagui/archive/2011/04/21/348677.html#Feedback6http://www.aygfsteel.com/javagui/comments/commentRss/348677.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/348677.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2011-04-21 09:54 发表评论
]]>
NetBeans6.10发布计划http://www.aygfsteel.com/javagui/archive/2010/08/19/329310.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Thu, 19 Aug 2010 02:05:00 GMThttp://www.aygfsteel.com/javagui/archive/2010/08/19/329310.htmlhttp://www.aygfsteel.com/javagui/comments/329310.htmlhttp://www.aygfsteel.com/javagui/archive/2010/08/19/329310.html#Feedback6http://www.aygfsteel.com/javagui/comments/commentRss/329310.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/329310.html按照计划Q?.10于明年1月发布?br />



sun_java_studio@yahoo.com.cn(늎) 2010-08-19 10:05 发表评论
]]>
NetBeans6.9正式发布http://www.aygfsteel.com/javagui/archive/2010/06/17/323685.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Thu, 17 Jun 2010 01:50:00 GMThttp://www.aygfsteel.com/javagui/archive/2010/06/17/323685.htmlhttp://www.aygfsteel.com/javagui/comments/323685.htmlhttp://www.aygfsteel.com/javagui/archive/2010/06/17/323685.html#Feedback7http://www.aygfsteel.com/javagui/comments/commentRss/323685.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/323685.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2010-06-17 09:50 发表评论
]]>
JDK6 update18发布http://www.aygfsteel.com/javagui/archive/2010/01/14/309402.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Thu, 14 Jan 2010 01:31:00 GMThttp://www.aygfsteel.com/javagui/archive/2010/01/14/309402.htmlhttp://www.aygfsteel.com/javagui/comments/309402.htmlhttp://www.aygfsteel.com/javagui/archive/2010/01/14/309402.html#Feedback0http://www.aygfsteel.com/javagui/comments/commentRss/309402.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/309402.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2010-01-14 09:31 发表评论
]]>
NetBeans6.8发布?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2009/12/11/305509.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/305509.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2009/12/11/305509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/305509.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/305509.html</trackback:ping><description><![CDATA[     摘要: NetBeans6.8正式发布Q同时符合Java EE6规范的GlassFishV3也放Z(jin)正式版本?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2009/12/11/305509.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/305509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2009-12-11 09:55 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/javagui/archive/2009/07/17/287139.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/287139.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2009/07/17/287139.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/287139.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/287139.html</trackback:ping><description><![CDATA[     摘要: 性能问题一向是历代NetBeans发布时的x焦点。和发布6.7之前的情形一P6.8版本包含很多值得自豪的改q?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2009/07/17/287139.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/287139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2009-07-17 13:55 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/javagui/archive/2009/05/29/278934.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/278934.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2009/05/29/278934.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/278934.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/278934.html</trackback:ping><description><![CDATA[期待已久的JDK 1.6.0_14 发布?jin)?a title="http://java.sun.com/javase/6/webnotes/6u14.html" >http://java.sun.com/javase/6/webnotes/6u14.html</a><br /> 本次更新是Update 10以来最大的一ơ更斎ͼ包含?jin)众多新?gu)和bug的修复,喜欢鲜的开发h员可以试试最新版本的JDK带来的益处?br /> <br /> 需要关注的是JRE的安装界面,Sun标志的背景改Z(jin)U色Q但愿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.aygfsteel.com/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.aygfsteel.com/javagui/aggbug/278934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2009-05-29 18:54 <a href="http://www.aygfsteel.com/javagui/archive/2009/05/29/278934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《FilthyRichClients》读书笔??-让Swing正确昄Gifhttp://www.aygfsteel.com/javagui/archive/2008/12/07/javafx.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Sun, 07 Dec 2008 12:36:00 GMThttp://www.aygfsteel.com/javagui/archive/2008/12/07/javafx.htmlhttp://www.aygfsteel.com/javagui/comments/244891.htmlhttp://www.aygfsteel.com/javagui/archive/2008/12/07/javafx.html#Feedback6http://www.aygfsteel.com/javagui/comments/commentRss/244891.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/244891.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2008-12-07 20:36 发表评论
]]>
《FilthyRichClients》读书笔?一)-SwingのEDThttp://www.aygfsteel.com/javagui/archive/2008/06/23/EDT.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Mon, 23 Jun 2008 14:49:00 GMThttp://www.aygfsteel.com/javagui/archive/2008/06/23/EDT.htmlhttp://www.aygfsteel.com/javagui/comments/210182.htmlhttp://www.aygfsteel.com/javagui/archive/2008/06/23/EDT.html#Feedback7http://www.aygfsteel.com/javagui/comments/commentRss/210182.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/210182.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2008-06-23 22:49 发表评论
]]>
FilthyRichClients中文?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2008/05/29/FilthyRichClients.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/203933.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2008/05/29/FilthyRichClients.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/203933.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/203933.html</trackback:ping><description><![CDATA[     摘要: 没想到FilthyRichClients的中文版居然q么快!真是ƣ喜若狂。打今后陆l开始写MW记Q对自己、Swing开发h员都有益处?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2008/05/29/FilthyRichClients.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/203933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2008-05-29 21:09 <a href="http://www.aygfsteel.com/javagui/archive/2008/05/29/FilthyRichClients.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过xml配置文g定义?qing)布局lghttp://www.aygfsteel.com/javagui/archive/2007/12/31/171788.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Sun, 30 Dec 2007 16:49:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/12/31/171788.htmlhttp://www.aygfsteel.com/javagui/comments/171788.htmlhttp://www.aygfsteel.com/javagui/archive/2007/12/31/171788.html#Feedback4http://www.aygfsteel.com/javagui/comments/commentRss/171788.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/171788.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2007-12-31 00:49 发表评论
]]>
自定义布局理?CenterLayouthttp://www.aygfsteel.com/javagui/archive/2007/11/29/164038.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Thu, 29 Nov 2007 08:53:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/11/29/164038.htmlhttp://www.aygfsteel.com/javagui/comments/164038.htmlhttp://www.aygfsteel.com/javagui/archive/2007/11/29/164038.html#Feedback1http://www.aygfsteel.com/javagui/comments/commentRss/164038.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/164038.html上文自定义布局理?FormLayout介绍?jin)FormLayout的参考实玎ͼ利用FormLayoutQ通过指定left、top?/p>

rightQ可选)(j)、bottomQ可选)(j)布局U束可以对组件进行精定位。然而有些组件在业务上是有固定尺寸的Q例?a title="自定义组件之Button" href="http://www.aygfsteel.com/javagui/archive/2007/11/11/javagui.html">自定义组件之Button介绍的一P通过l按钮指?U状态时的图片,那么lg的最?jng)_寸就是图片的寸Q因此组件的PreferredSize可以确定,所以此时只需要组?span style="color: red;">中心(j)的确定坐标就可以?jin),实际lg的Location只和其PreferredSize有关。如下图所C:(x)

q就是CenterLayout的思想?/p>

修改FormDataQ只需要添加两个变量即可?br /> public final class FormData {
    public FormAttachment left;

    public FormAttachment right;

    public FormAttachment top;

    public FormAttachment bottom;

    public FormAttachment centerX;

    public FormAttachment centerY;
}
CenterLayout与FormLayout不同只在于addLayoutComponent、layoutContainerq两?/p>

Ҏ(gu)实现Q其他接口方法均相同Q所以下面只介绍q两个方法实玎ͼ其他接口Ҏ(gu)?/p>

参阅上文自定义布局理?FormLayout
在addLayoutComponentҎ(gu)的开_(d)同样是对布局U束参数constraints合法性进行检查,q点与FormLayout大致相同?/p> if (constraints == null) {
            throw new IllegalArgumentException("constraints can't be null");
        } else if (!(constraints instanceof FormData)) {
            throw new IllegalArgumentException("constraints must be a " + FormData.class.getName() + " instance");
        } else {
            synchronized (comp.getTreeLock()) {
                FormData formData = (FormData) constraints;
                if (formData.centerX == null || formData.centerY == null) {
                    throw new IllegalArgumentException("centerX FormAttachment and centerY FormAttachment can't be null");
                } else if (comp.getPreferredSize() == null) {
                    throw new RuntimeException("component must have preferred size before be add into parent with CenterLayout");
                }
                 componentConstraints.put(comp, (FormData) constraints);
            }
        }

对于CenterLayout来说QFormData对象的centerX、centerY必须l出Q因为它代表Q点的坐标,除此之外lg必须有PreferredSize属性来指定lg大小?/p>

layoutContainerҎ(gu)实现也大致相?br /> public synchronized void layoutContainer(Container target) {
        synchronized (target.getTreeLock()) {
            int w = target.getWidth();
            int h = target.getHeight();
            Component[] components = target.getComponents();
            for (Component comp : components) {
                FormData formData = componentConstraints.get(comp);
                if (formData != null) {
                    ...
                }
            }
        }
    }
上面q步与FormLayout一栗关键在if语句块内Q代码如下:(x)
  FormAttachment centerX = formData.centerX;
                    FormAttachment centerY = formData.centerY;
                    int width = component.getPreferredSize().width;
                    int height = component.getPreferredSize().height;
                    int x = (int) (centerX.percentage * w) + centerX.offset - width / 2;
                    int y = (int) (centerY.percentage * h) + centerY.offset - height / 2;
                    comp.setBounds(x, y, width, height);
获得centerX、centerY以及(qing)最?jng)_寸,如上图所C,不难得出x、y的计方法?br />
xQ自定义布局理器就介绍到这里,q两个布局cd以解军_?span style="color: red;">?rn)态布局需求,所谓静(rn)态布局是指容器内有什么组件是固定的。如果遇到动态界面,例如lg的内容依照用L(fng)别、插件扩展点{因素决定,也ƈ不是难事Q因Z(jin)解了(jin)布局理器运行机制以后可很容易地定义适合你需求的布局cR对于静(rn)态布局来说Q你可能厌倦了(jin)hard coding来布局Q你希望q一切由xmlq样的配|搞定,好,下一部分则开?#8220;压u?#8221;——用配|文件解军_局?/p>

sun_java_studio@yahoo.com.cn(늎) 2007-11-29 16:53 发表评论
]]>
自定义布局理?FormLayouthttp://www.aygfsteel.com/javagui/archive/2007/11/24/FormLayout.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Sat, 24 Nov 2007 10:26:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/11/24/FormLayout.htmlhttp://www.aygfsteel.com/javagui/comments/162877.htmlhttp://www.aygfsteel.com/javagui/archive/2007/11/24/FormLayout.html#Feedback5http://www.aygfsteel.com/javagui/comments/commentRss/162877.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/162877.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2007-11-24 18:26 发表评论
]]>
布局理器面面观http://www.aygfsteel.com/javagui/archive/2007/11/18/Layout.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Sun, 18 Nov 2007 07:15:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/11/18/Layout.htmlhttp://www.aygfsteel.com/javagui/comments/161403.htmlhttp://www.aygfsteel.com/javagui/archive/2007/11/18/Layout.html#Feedback4http://www.aygfsteel.com/javagui/comments/commentRss/161403.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/161403.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2007-11-18 15:15 发表评论
]]>
swing专业外观http://www.aygfsteel.com/javagui/archive/2007/11/07/158849.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Wed, 07 Nov 2007 08:17:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/11/07/158849.htmlhttp://www.aygfsteel.com/javagui/comments/158849.htmlhttp://www.aygfsteel.com/javagui/archive/2007/11/07/158849.html#Feedback22http://www.aygfsteel.com/javagui/comments/commentRss/158849.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/158849.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2007-11-07 16:17 发表评论
]]>
打造专业外??/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2007/11/07/158693.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/158693.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2007/11/07/158693.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/158693.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/158693.html</trackback:ping><description><![CDATA[     摘要: 在《打造专业外?二》中Q留下了(jin)3个未实现的功能:(x)H口标题和图标,边缘圆角Q功能按钮。在本篇中将实现q些功能来完l打造专业外?H口部分的讲解?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2007/11/07/158693.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/158693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2007-11-07 00:49 <a href="http://www.aygfsteel.com/javagui/archive/2007/11/07/158693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造专业外??/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2007/11/04/158107.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/158107.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2007/11/04/158107.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/158107.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/158107.html</trackback:ping><description><![CDATA[     摘要: 在上一《打造专业外??ji)宫图》,介绍?jin)?ji)宫格的概念ƈ留下?jin)一个演C程序。那个程序只是一个渲染过的窗口,许多必要的功能尚未实玎ͼ比如拖拽Ud、改变大、标题栏双击{。好现在来一一实现?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2007/11/04/158107.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/158107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2007-11-04 20:12 <a href="http://www.aygfsteel.com/javagui/archive/2007/11/04/158107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造专业外??ji)宫?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2007/11/03/157948.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/157948.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2007/11/03/157948.html#Feedback</comments><slash:comments>45</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/157948.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/157948.html</trackback:ping><description><![CDATA[     摘要: 起初依赖JButton、JScroll{基lgQBorderLayout、FlowLayout{现成的布局理器企图能实现cMMSN的外观效果,但是实际看来是完全不可能的,所以我当时׃?jin)这L(fng)l论Q哪怕现在我依然认ؓ(f)是正的Q“抛弃所有的外观设计工具和一切现有的桌面lg?qing)布局理器,一切的一切必自定义实现Q设计工h多能替你完成一半”?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2007/11/03/157948.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/157948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2007-11-03 17:56 <a href="http://www.aygfsteel.com/javagui/archive/2007/11/03/157948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans 6.0模块快速入门教E?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2007/10/28/156477.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/156477.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2007/10/28/156477.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/156477.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/156477.html</trackback:ping><description><![CDATA[     摘要: q篇文档展示如何创徏一个模块来向IDE或其他基于NetBeansq_的应用程序添加一个Google查询工具栏?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2007/10/28/156477.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/156477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2007-10-28 15:15 <a href="http://www.aygfsteel.com/javagui/archive/2007/10/28/156477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Netbeans模块和富客户端应用学?fn)教E翻译计?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javagui/archive/2007/10/26/netBeans.html</guid><wfw:comment>http://www.aygfsteel.com/javagui/comments/156140.html</wfw:comment><comments>http://www.aygfsteel.com/javagui/archive/2007/10/26/netBeans.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javagui/comments/commentRss/156140.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javagui/services/trackbacks/156140.html</trackback:ping><description><![CDATA[     摘要: 随着netBeans6.0 Beta2的发布,netBeans的优势已来明显。但是国内介lnetBeans的书c相比Eclipse的臭街而言之又少Q而且没有一本专门介lnetBeans插g的书c,有也是Sun中文技术社区零星的几篇译。而我又对netBeans插g的了(jin)解还只是入门U水qI看来看去最好去Sun的官方网站看NetBeans Modules学习(fn)教程?nbsp; <a href='http://www.aygfsteel.com/javagui/archive/2007/10/26/netBeans.html'>阅读全文</a><img src ="http://www.aygfsteel.com/javagui/aggbug/156140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javagui/" target="_blank">sun_java_studio@yahoo.com.cn(늎)</a> 2007-10-26 14:35 <a href="http://www.aygfsteel.com/javagui/archive/2007/10/26/netBeans.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>netBeans6.0咔Rn与SwingU霸桌面应用http://www.aygfsteel.com/javagui/archive/2007/10/26/netBeans6.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Fri, 26 Oct 2007 05:59:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/10/26/netBeans6.htmlhttp://www.aygfsteel.com/javagui/comments/156126.htmlhttp://www.aygfsteel.com/javagui/archive/2007/10/26/netBeans6.html#Feedback37http://www.aygfsteel.com/javagui/comments/commentRss/156126.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/156126.html阅读全文

sun_java_studio@yahoo.com.cn(늎) 2007-10-26 13:59 发表评论
]]>
SWT自定义组件之Sliderhttp://www.aygfsteel.com/javagui/archive/2007/10/23/155271.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Tue, 23 Oct 2007 05:35:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/10/23/155271.htmlhttp://www.aygfsteel.com/javagui/comments/155271.htmlhttp://www.aygfsteel.com/javagui/archive/2007/10/23/155271.html#Feedback11http://www.aygfsteel.com/javagui/comments/commentRss/155271.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/155271.html   曄介绍q?a >用SWT实现MSN风格的下拉框QSWT虽然没有Swing那么强大Q尤其是在打造专业外观上Q不支持L&FQ但是通过自定义组Ӟ同样可以辑ֈ用户要求。下面就向大家介l本人实现的一个具备专业外观的Slider控g?br />     首先来参考一下组件的实际q行效果Qƈ和SWT原生lgq行一下对比?nbsp;

                                                       

可以看出Q经q自定义的组件在外观上要比SWT直接调用本地lg昑־更加专业。当用户托拽滑动块时Q还?x)出C个虚拟的滑动块用来标识将要移动到的位|。演C就到此为止Q下面详l介l这个很Cool的组件是如何通过SWT实现的?/p>

    基本设计思想Q与其他自定义组件一P是通过l承org.eclipse.swt.widgets.Composite来实玎ͼ定义该类为SliderQ另外滑动块QthumbQ也是CompositeQƈ攑֜Slider之上Q当鼠标UdthumbӞ调用setBoundsҎ(gu)定位在Slider在父lgQSliderQ上的位|,从而达到拖拽thumb的目的。此外通过实现PaintListener接口q行自定义绘Ӟl制的对象包括组件边框、被填充的格子、未被填充的格子、虚拟滑块?/p>

    接触qGUI~程的程序员都应该知道像Scroll、Slider、ProgressBarq样的控仉有setMaxValue、setMinValue、setValueq样的方法,除了(jin)鼠标拖拽thumb来改变当前数值外Q可直接调用setValue来设|当前倹{此外这些控件还有水qIHorizontalQ、垂_(d)VerticalQ两U布局Q对于事件处理一般都要有一个从java.util.EventObjectl承而来的事件类Q还要编写事件监听器QListenerQ接口,因此在开始编写Slider控g之前先定?个类Q代码都不是很长Q如果你熟?zhn)AWT、Swing的事件处理机Ӟ怿你能L跌?/p>


public enum SliderOrientation {
 HORIZONTAL, VERTICAL;
}

public class SliderEvent extends EventObject {

 private int value;

 public SliderEvent(Object source, int value) {
  super(source);
  this.value = value;
 }

 public int getValue() {
  return value;
 }
}

public interface SliderListener {

 public void valueChanged(SliderEvent event);
}

    接下来着重介lSlider。首先是l承Compositeq实现ControlListener、PaintListener、MouseListener,、MouseMoveListener,、MouseTrackListenerQ然后自动生成接口方法代码,通过Eclipse可以L实现Q需要注意的是MouseListenerQ有java.awt.event.MouseListener和org.eclipse.swt.events.MouseListener两种Q不要؜淆,否则错误很难扑ֈ。然后是要采集一些数据信息,分别是:(x)Ҏ(gu)颜色、已有数据部分的填充颜色Q上图中lg的绿色部分)(j)、未辑ֈ数据部分的填充颜Ԍ上图中组件的白色部分Q、被用时的填充颜色、水qx块的图标Q正常、托拽中两种Q、垂直滑块图标(正常、托拽中两种Q、水q뀁垂直虚拟滑块图标。以上这些数据对应的帔R声明如下Q?/p>

 private final Color BORDER_COLOR = new Color(Display.getCurrent(), 180, 188, 203);

 private final Color FILL_COLOR = new Color(Display.getCurrent(), 147, 217, 72);

 private final Color BLANK_COLOR = new Color(Display.getCurrent(), 254, 254, 254);

 private final Color DISABLE_COLOR = new Color(Display.getCurrent(), 192, 192, 192);

 private final Image THUMB_ICON_V = new Image(Display.getDefault(), "slider_up_v.png");

 private final Image THUMB_OVER_ICON_V = new Image(Display.getDefault(), "slider_over_v.png");

 private final Image THUMB_ICON_H = new Image(Display.getDefault(), "slider_up_h.png");

 private final Image THUMB_OVER_ICON_H = new Image(Display.getDefault(), "slider_over_h.png");

 private final Image TEMP_H = new Image(Display.getDefault(), "temp_h.png");

 private final Image TEMP_V = new Image(Display.getDefault(), "temp_v.png");

 除了(jin)q些帔RQ还应该声明默认最大值的帔RQprivate final int DEFAULT_MAX_VALUE = 100;
接下来定义当前数值和最大|
private int value;
private int maxValue = DEFAULT_MAX_VALUE;
q生成以上两个成员属性的getҎ(gu)
然后定义滑动块和布局
private SliderOrientation orientation;
private Composite thumb;
要处理数值变化,需要实Cl监听器Q添加如下代?br /> private List<SliderListener> listeners = new ArrayList<SliderListener>();
public void addSliderListener(SliderListener sliderListener) {
 listeners.add(sliderListener);
}
public void removeSliderListener(SliderListener sliderListener) {
 listeners.remove(sliderListener);
}
接下来定?个辅助方法,实现value<->pelsLength转换。其中value是当前的数|由具体业务来军_Q下文中U其业务倹{例如一个音量控制器Q音量范围在0~500Q那么从业务上来讲可以将数D|在0~500之间的Q何数Q而pelsLength则由控g的长/高度来决定,单位是像素。但是value与pelsLength之间存在着一个比例关pdQvalue/maxValue=pelsLength/控g长度或高度。这样不隑־Z个函数的定义?br /> private int valueToPels(int value) {
  float widgetLength = (orientation == SliderOrientation.HORIZONTAL) ? getBounds().width
    : getBounds().height;
  return (int) (widgetLength * (float) value / (float) maxValue);
 }

 private int pelsToValue(int pels) {
  float widgetLength = (orientation == SliderOrientation.HORIZONTAL) ? getBounds().width
    : getBounds().height;
  return (int) ((float) pels * (float) maxValue / (float) widgetLength);
 }
最后定义构造器。代码如?br /> public Slider(Composite parent, SliderOrientation orientation) {
  super(parent, SWT.FLAT);
  this.orientation = orientation;
  thumb = new Composite(this, SWT.FLAT);
  thumb
    .setBackgroundImage(orientation == SliderOrientation.VERTICAL ? THUMB_ICON_V
      : THUMB_ICON_H);
  addControlListener(this);
  addPaintListener(this);
  thumb.addMouseListener(this);
  thumb.addMouseMoveListener(this);
  thumb.addMouseTrackListener(this);
 }
在构造器中,注入布局对象Q然后在控g上创建滑动块lgthumbQƈd鼠标处理{?br /> 到此为止Q基本的成员和方法的定义完毕Q下面@序渐q讨论如何实现这一Slider?/p>

一、绘制边?br /> ׃是绘制操作,所以一切绘制代码均在paintControlҎ(gu)内实玎ͼ先将如下代码拯到paintControl?br /> int w = getBounds().width;
int h = getBounds().height;
int fillLength = valueToPels(getValue());
GC gc = e.gc;
switch (orientation) {
 case HORIZONTAL:
  break;
 case VERTICAL:
  break;
}
分析如下
首先获取控g的长度与高度Q因为接下来的绘制要l常用到q两个变量?br /> “int fillLength = valueToPels(getValue());”q一行代码稍后作解释Q然后是获得l制上下文对象,下一步是Ҏ(gu)布局不同采用不同的处理,除了(jin)paintControl函数Q在其他很多地方都对布局q行判断Q但是简单v见,只对水^布局q行介绍Q垂直部分参考完整程序?br /> 接下来的l制操作均在case HORIZONTAL中进行,首先颜色设|ؓ(f)Ҏ(gu)的颜?br /> gc.setForeground(BORDER_COLOR);然后l制一个矩形gc.drawRectangle(0, 2, w - 1, h - 5);
关于Z么要偏移2像素、长度ؓ(f)什么减1、高度ؓ(f)什么减5Q请参考有关绘囄基本知识Q?a >上一?/a>也有单的介绍?/p>

现在Q你可以编写测试程序来验证l果?jin),看看?gu)是否与示例的效果一栗?br />

二、托拽thumb的实?br /> 桌面GUI~程领域技术深的度量衡通常?Ҏ(gu)标:(x)皮肤Q外观,swinglg体系U其L&FQ、绘图、自定义lg布局QLayoutQ、自定义lg。而托拽是实现自定义组件和l图不可或缺的技术,也是隄之一Q因此掌握的深浅是衡量桌面编E水q的标志?br /> 虽然作ؓ(f)隄Q但是也有章可@Q其基本实现单到只监听鼠标事件这么简单,基本程是:(x)当鼠标在thumb上按下时Q记住这个位|,然后按住鼠标左键托拽Q最后松开鼠标计算两个位置之间的距(位移Q,Ҏ(gu)位移量移动thumb的位|ƈ换算出等L(fng)value增量Q可能ؓ(f)负|(j)q行业务逻辑处理。下面通过代码循序渐进完成?br /> 定义一个位|变量用来存储鼠标单ȝ位置Qprivate Point controlPoint;然后实现public void mouseDown(MouseEvent e)和public void mouseUp(MouseEvent e)两个Ҏ(gu)?br /> public void mouseDown(MouseEvent e) {
  controlPoint = new Point(e.x, e.y);
  thumb
    .setBackgroundImage(orientation == SliderOrientation.VERTICAL ? THUMB_OVER_ICON_V
      : THUMB_OVER_ICON_H);
 }

 public void mouseUp(MouseEvent e) {
  try {
   thumb
     .setBackgroundImage(orientation == SliderOrientation.VERTICAL ? THUMB_ICON_V
       : THUMB_ICON_H);
   countValue(e);
  } finally {
   controlPoint = null;
  }
 }
“controlPoint = new Point(e.x, e.y);”q一行实现记住鼠标点的位|,注意Q这个位|是相对滑块thumb的,因ؓ(f)是thumb监听的鼠标事件。接下来是设|滑动块背景Q不隄解当鼠标村ּӞ应该背景恢复。然后进行非帔R要的换算工作Q通过countValueҎ(gu)实现Q最后务必要把鼠标位|清I,用try-finally是有必要q样的。之所以要在方法结束的时候清IcontrolPointQ是因ؓ(f)在鼠标移动的时候需要对controlPointq行更加复杂的计。稍后讲解mouseMove实现的时候再作解释,接下来着重分析countValueҎ(gu)?br /> 如前所qͼcountValue完成计算鼠标按下、松开的位U量Q换成与业务相关的数据QvalueQ?br /> private void countValue(MouseEvent e) {
  switch (orientation) {
  case HORIZONTAL:
   int movedX = e.x - controlPoint.x;
   setValue(getValue() + pelsToValue(movedX));
   break;
  case VERTICAL:
   ......
  }
 }
“int movedX = e.x - controlPoint.x;”实现?jin)位U量的计,保存到movedXQ调用pelsToValueҎ(gu)movedX转换成业务值的增量Q然后调用setValue重新赋|注意pelsToValue得到的是增量Q需要与原|getValue()得到Q叠加。接下来分析setValueҎ(gu)?br /> public void setValue(int value) {
  if (value < 0) {
   this.value = 0;
  } else if (value > getMaxValue()) {
   this.value = getMaxValue();
  } else {
   this.value = value;
  }
  try {
   moveThumb();
   redraw();
  } finally {
   for (SliderListener listener : listeners) {
    try {
     SliderEvent event = new SliderEvent(this, getValue());
     listener.valueChanged(event);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
 }
Ҏ(gu)开始处的一pdif语句对valueq行验证后再赋|然后是调用moveThumb实现滑块Ud、调用redraw对组仉新绘Ӟ最后是处理具体的业务,可以看出处理业务是setValueҎ(gu)的关键,所以要用try-finallyQ谁也不敢确保moveThumb、redraw不出问题。对于实C务是遍历监听器列表然后执行每个监听器的valueChangedҎ(gu)Q这U事件源-监听器模型也是Java2以后的GUI事g实现模型?/p>

 private void moveThumb() {
  Image icon = thumb.getBackgroundImage();
  int iconw = (icon != null) ? icon.getBounds().width : 0;
  int iconh = (icon != null) ? icon.getBounds().height : 0;
  switch (orientation) {
  case HORIZONTAL:
   int x = valueToPels(getValue()) - iconw / 2;
   if (x < 0) {
    x = 0;
   } else if (x > getBounds().width - iconw) {
    x = getBounds().width - iconw;
   }
   thumb.setBounds(x, 0, iconw, iconh);
   break;
  case VERTICAL:
   ......  }
 }
不难理解QmoveThumb的Q务就是根据业务值value来将滑块Ud到正的位置?br /> 以上代码声明滑块的位|是“x”Q通过转换函数获得Q但是还要减L块的一半,因ؓ(f)具体坐标应该落到滑动块的中间Q仔l想想不隑־出。if-else是对xq行验证Q最后通过setBound来定位thumb?br /> 对于redraw,他的作用是触发paintControlҎ(gu)q行重绘Q因为重l出?jin)边框还要根据valuel制填充格子Q而value已经在redrawҎ(gu)调用前被赋了(jin)|所以这时候应该进行重l?br /> 现在你可以托拽thumb?jin),中不的是滑动块不能随时跟随鼠标的轨迹UdQ这个稍后会(x)实现?/p>

三、填充格?br /> 现在的组件外观只是绘制了(jin)Ҏ(gu)Q现在进行格子填充。在讲述Ҏ(gu)l制的时候提C(jin)一行代?#8220;int fillLength = valueToPels(getValue());”现在不难理解吧,是当前业务值value转换成实际的长度。在l制Ҏ(gu)之后Q加入如下代码:(x)
if (getEnabled()) {
    gc.setBackground(FILL_COLOR);
    for (int i = 2; i < w - 2; i += 4) {
     if (i > fillLength) {
      gc.setBackground(BLANK_COLOR);
     }
     gc.fillRectangle(i, 4, 3, h - 8);
    }
   } else {
    gc.setBackground(DISABLE_COLOR);
    gc.fillRectangle(1, 4, w - 1, h - 8);
   }
首先判断是否是enableQ然后设|填充颜色FILL_COLORQ然后在for循环中执行正方Ş格子的填充,递增?#8220;i”?开始是I开2像素间隔Q同理i也不能超qw-2Q对U性)(j)Qi+=4是相M个格子左边坐标间?像素Q然?#8220;gc.fillRectangle(i, 4, 3, h - 8);”q一行进行填充绘制正方Ş。留意,x坐标是iQy坐标是从4开始画的,Z对称高度也要“h-8”Q长度之所以是“3”是保持相M个格子之间保?像素的间隔(x“i+=4”׃隑־出答案)(j)。此外还要对fillLengthq行判断以便军_颜色采用l色q是白色以示区分。对于绘图操作来_(d)千万不要埋怨考虑l节q多Q事实上QGUI~程q程?#8220;坐标p?#8221;q个概念是需要经常被考虑的,试想如果上述代码for循环中把“i+=4”Q写?#8220;i+=5”Q只是一个像素之差绘制效果差之千里,如果想知道笔者是如何得到q些坐标数据的,实话_(d)是靠多次调试得出的结果?br /> 现在你运行程序,应该能根据valueq行格子填充?jin)。到此ؓ(f)止,l大多数的功能已l实玎ͼ但是人性化的界面设计应该在托拽时出C个虚拟的滑动块用来标识将要移动到的位|。好Ql实现这一功能?br /> 定义一个int变量U录thumb的(f)时位|,private int tempLocation;然后在paintControld如下U色代码
case HORIZONTAL:
   gc.setForeground(BORDER_COLOR);
   gc.drawRectangle(0, 2, w - 1, h - 5);
   if (getEnabled()) {
    gc.setBackground(FILL_COLOR);
    for (int i = 2; i < w - 2; i += 4) {
     if (i > fillLength) {
      gc.setBackground(BLANK_COLOR);
     }
     gc.fillRectangle(i, 4, 3, h - 8);
    }
    if (controlPoint != null) {
     gc.drawImage(TEMP_H, tempLocation, 0);
    }
   } else {
    gc.setBackground(DISABLE_COLOR);
    gc.fillRectangle(1, 4, w - 1, h - 8);
   }
   break;
很直观,对于水^布局是?tempLocation,0)d“TEMP_H”图标。外面的if很重要,q记得mouseDownҎ(gu)中的语句“controlPoint = new Point(e.x, e.y);”和mouseUpҎ(gu)中的语句“controlPoint = null;”吗,当鼠标按下托拽开始时Qؓ(f)controlPoint赋|当鼠标完成托拽松开ӞcontrolPoint|nullQ在q个托拽q程中controlPoint一直保持非null状态,所以paintControlҎ(gu)才将图标d。如果现在就着急运行程序则?x)发玎ͼ鼠标托拽时候虚拟图标d留在最左边Q如果垂直布局停留在最上边Q因为ƈ没有为tempLocation赋值默认是0Q,不会(x)跟随鼠标Ud。如果要实现真正的托拽那么必d鼠标Ud时反复执行paintControlQ下面花大量的笔墨详l地介绍mouseMoveҎ(gu)的实玎ͼq简单介l绘图操作的一些原理和程?br /> 开门见山,直接mouseMove函数的全部代码列出?br /> public void mouseMove(MouseEvent e) {
  if (controlPoint == null) {
   return;
  }
  int maxLength;
  int maxLocator;
  switch (orientation) {
  case HORIZONTAL:
   maxLength = valueToPels(getMaxValue());
   maxLocator = maxLength - TEMP_H.getBounds().width;
   int movedX = e.x - controlPoint.x;
   redraw(tempLocation, 0, TEMP_H.getBounds().width,
     TEMP_H.getBounds().height, false);
   tempLocation = valueToPels(getValue()) + movedX
     - TEMP_H.getBounds().width / 2;
   if (tempLocation < 0) {
    tempLocation = 0;
   } else if (tempLocation > maxLocator) {
    tempLocation = maxLocator;
   }
   break;
  case VERTICAL:
   ......
   break;
  }
 }
最前面的if语句表明Q只有鼠标按下时Ud鼠标才算托拽Q道理前面已l阐明了(jin)。maxLength代表最大D{换得到的像素QmaxLocator是虚拟图标左端(上端Q最大坐标,movedX代表托拽的位U量。最下面的if-else if目的很明?jin)。整个mouseMove函数?br /> redraw(tempLocation, 0, TEMP_H.getBounds().width,
     TEMP_H.getBounds().height, false);
   tempLocation = valueToPels(getValue()) + movedX
     - TEMP_H.getBounds().width / 2;
是整个托拽操作最难懂也是技术含量最高的两条语句。简单v见暂时用下面的语句代?br /> tempLocation = valueToPels(getValue()) + movedX
     - TEMP_H.getBounds().width / 2;
   if (tempLocation < 0) {
    tempLocation = 0;
   } else if (tempLocation > maxLocator) {
    tempLocation = maxLocator;
   }
   redraw();
其中“tempLocation”的赋D句不变,变化的是redraw函数的调用位|和参数。这L(fng)变化使得意思就不难理解?jin),首先定tempLocation的|{号双的计结果也不难理解Q然后调用redrawҎ(gu)重画lg。如果这时候你q行E序Q托拽时实虚拟光标?x)跟随鼠标移动,但是也?x)发现lg闪烁得很厉害Q具体程度取决于用户计算机的性能Q关?#8220;lg重绘旉?#8221;的问题是l图操作的一个常见问题,不仅仅是JavaQQ何支持绘囄计算a都可以暴露这L(fng)问题Q当q在大学用MFC、VB的编写过d板的人应该熟(zhn)这c问题?br /> 在具体讨Z前先单讲q鼠标监听器中的mouseMove操作
一旦ؓ(f)GUIlgd鼠标Ud监听器,当鼠标光标在lg上移动时便调用监听器接口的mouseMove(MouseEvent e)Ҏ(gu)QmouseMove调用的频率与鼠标Ud的快慢有养IUd快mouseMove被调用的ơ数p,反之p多。假N标从lg上的A点移动到B点,如果鼠标Ud得够快Q那么就可以理解ZA直接到B而不l过中间的Q何一个点Q那么mouseMove函数仅仅调用一ơ。反之鼠标慢慢从AUd到BQ那么中间可能会(x)l过C、D、E、F......一pd的点Q而mouseMove也会(x)被执行多ơ。M当鼠标在lg上移动时QmouseMove?x)频J被调用Q之所以闪烁问题出在redrawҎ(gu)Q如果redrawҎ(gu)不加M参数那么对lg全部重绘Q对于鼠标托拽这U操作鼠标每Ud一ơ就要对lg全部重绘Q性能的代价可惌知Q不闪才怪呢。解决的办法是只重l变化的部分?br /> 如何做到q一点,要先?jin)解必要的绘图机Ӟ在SWT中(Swingl图原理与其cMQredraw其实?x)包?个含义,擦除、绘Ӟ所以得名于redrawQ意思就是重l。首先是Ҏ(gu)传入redrawҎ(gu)的参数确认需要擦除的范围Q如果没有则擦除全部Q然?span style="color: #ff0000">底层?x)创Z个绘制请求交l操作系l去处理Q但是这个请求不?x)在redrawҎ(gu)调用完毕后立卌处理Q即重绘操作不会(x)立即执行Q它是被送进底层的事仉列中。处理时的绘制操作是由paintControl完成Q所以redraw的调用会(x)DpaintControl的执行?br /> 再将那两行代码列出来?br /> redraw(tempLocation, 0, TEMP_H.getBounds().width,
     TEMP_H.getBounds().height, false);
   tempLocation = valueToPels(getValue()) + movedX
     - TEMP_H.getBounds().width / 2;
如果光标从AUdB处,redrawҎ(gu)所做的事情是通知重绘光标在AҎ(gu)虚拟图标范围内的囑փQ然后立卛_Z个绘制请求送到pȝ事g队列Q然后更新tempLocation的倹{现在再绘制的那部分代码列?br /> if (controlPoint != null) {
     gc.drawImage(TEMP_H, tempLocation, 0);
    }
这两部分代码列出来做个比较Q还有非帔R要的一炚w要指出,托拽时虚拟光标能呈连l性移动,q一功能之所以能得以实现非常重要的一Ҏ(gu)Q?span style="color: #ff0000">从底层请求送入事g队列到请求被执行存在旉?/span>Q利用这个时间差Q时间非常短Q可以执行一?#8220;更新操作”Q比如上面的更新tempLocation。简单的理解是redrawҎ(gu)调用?x)以异步方式执行擦除、绘制。当执行l制操作“gc.drawImage(TEMP_H, tempLocation, 0);”ӞtempLocation已经是更新后的g(jin)Q而redraw表明擦除旧区域的囑փQ因为当paintControl执行时这部分囑փ区域Ҏ(gu)计算l果已经不再是虚拟滑块了(jin)。下面做一个试验?br /> d下面U色代码
redraw(tempLocation, 0, TEMP_H.getBounds().width,
     TEMP_H.getBounds().height, false);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e1) {
    e1.printStackTrace();
   }
   tempLocation = valueToPels(getValue()) + movedX
     - TEMP_H.getBounds().width / 2;
q样在绘制执行时QtempLocationq没有得到更斎ͼ效果q行下知晓?br />
现在Q你可以q行完整的程序了(jin)Q看一下托拽时的效果?br /> 完整的程?a title="q里" >q里下蝲



sun_java_studio@yahoo.com.cn(늎) 2007-10-23 13:35 发表评论
]]>
求《Pro Netbeans IDE 6 Rich Client Platform Edition》电(sh)子版http://www.aygfsteel.com/javagui/archive/2007/10/23/155260.htmlsun_java_studio@yahoo.com.cn(늎)sun_java_studio@yahoo.com.cn(늎)Tue, 23 Oct 2007 05:21:00 GMThttp://www.aygfsteel.com/javagui/archive/2007/10/23/155260.htmlhttp://www.aygfsteel.com/javagui/comments/155260.htmlhttp://www.aygfsteel.com/javagui/archive/2007/10/23/155260.html#Feedback10http://www.aygfsteel.com/javagui/comments/commentRss/155260.htmlhttp://www.aygfsteel.com/javagui/services/trackbacks/155260.html     首要d是希望尽快拿到该书的?sh)子版,请业界同仁帮忙,不胜感激Q?br />

该书的详l介l参?a title="http://www.amazon.com/Pro-Netbeans-Rich-Client-Platform/dp/1590598954" >http://www.amazon.com/Pro-Netbeans-Rich-Client-Platform/dp/1590598954



sun_java_studio@yahoo.com.cn(늎) 2007-10-23 13:21 发表评论
]]>
վ֩ģ壺 | Դ| | | | | ƽ| | | | | ƺ| ƴ| ˮ| | | ԰| | ƴ| | ȫ| | ˹| | | ȫ| | Ԫ| | | | Ѯ| | ֳ| ڰ| Դ| | | ɽ| | |