<?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-study-随笔分类-Eclipse</title><link>http://www.blogjava.net/xixidabao/category/15385.html</link><description>GROW WITH JAVA</description><language>zh-cn</language><lastBuildDate>Sun, 06 May 2007 03:57:49 GMT</lastBuildDate><pubDate>Sun, 06 May 2007 03:57:49 GMT</pubDate><ttl>60</ttl><item><title>Eclips使用秘技(绝对经典)</title><link>http://www.blogjava.net/xixidabao/archive/2007/05/06/115509.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Sun, 06 May 2007 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2007/05/06/115509.html</guid><description><![CDATA[<table id=table1 height=41 width="100%" border=0>
    <tbody>
        <tr>
            <td vAlign=top>
            <div><strong><font size=4>Eclips使用秘技(绝对经典)</font></strong></div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>Author：sungo&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>前言：&nbsp; </div>
            <br>
            <div>本来我都是使用JBuilderX当主力IDE、但使用了Eclipse后&nbsp; </div>
            <br>
            <div>发现...Eclipse原来也这么好用...渐渐的就爱上了它......&nbsp; </div>
            <br>
            <div>Eclipse优点：免费、程序代码排版功能、有中文化包、可增&nbsp; </div>
            <br>
            <div>设许多功能强大的外挂、支持多种操作系统(Windows、&nbsp; </div>
            <br>
            <div>Linux、Solaris、Mac OSX)..等等。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>开此篇讨论串的目的，是希望能将Eclipse的一些使用技巧集&nbsp; </div>
            <br>
            <div>合起来...欢迎大家继续补充下去...由于Eclipse的版本众多&nbsp; </div>
            <br>
            <div>，希望补充的先进们能顺便说明一下您所使用的版本～&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>Eclipse网站：http://www.eclipse.org/ ; </div>
            <br>
            <div>Eclipse中文化教学：JavaWorld站内文章参考&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>(使用版本：Eclipse 2.1.2 Release + 中文化)&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>热键篇：&nbsp; </div>
            <br>
            <div>Template：Alt + /&nbsp; </div>
            <br>
            <div>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;编辑-&gt;内容辅助。&nbsp; </div>
            <br>
            <div>个人习惯：Shift+SPACE(空白)。&nbsp; </div>
            <br>
            <div>简易说明：编辑程序代码时，打sysout +Template启动键，就&nbsp; </div>
            <br>
            <div>会自动出现：System.out.println(); 。&nbsp; </div>
            <br>
            <div>设定Template的格式：窗口-&gt;喜好设定-&gt;Java-&gt;编辑器-&gt;模板。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>程序代码自动排版：Ctrl+Shift+F&nbsp; </div>
            <br>
            <div>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;程序代码-&gt;格式。&nbsp; </div>
            <br>
            <div>个人习惯：Alt+Z。&nbsp; </div>
            <br>
            <div>自动排版设定：窗口-&gt;喜好设定-&gt;Java-&gt;程序代码格式制作程序。&nbsp; </div>
            <br>
            <div>样式页面-&gt;将插入tab(而非空格键)以内缩，该选项取消勾选&nbsp; </div>
            <br>
            <div>，下面空格数目填4，这样在自动编排时会以空格4作缩排。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>快速执行程序：Ctrl + F11&nbsp; </div>
            <br>
            <div>个人习惯：ALT+X&nbsp; </div>
            <br>
            <div>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;执行-&gt;启动前一次的启动作业。&nbsp; </div>
            <br>
            <div>简易说明：第一次执行时，它会询问您执行模式，&nbsp; </div>
            <br>
            <div>设置好后，以后只要按这个热键，它就会快速执行。&nbsp; </div>
            <br>
            <div>&lt;ALT+Z(排版完)、ATL+X(执行)&gt;..我觉得很顺手^___^&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>自动汇入所需要的类别：Ctrl+Shift+O&nbsp; </div>
            <br>
            <div>简易说明：&nbsp; </div>
            <br>
            <div>假设我们没有Import任何类别时，当我们在程序里打入：&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>BufferedReader buf =&nbsp; </div>
            <br>
            <div>new BufferedReader(new InputStreamReader(System.in));&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>此时Eclipse会警示说没有汇入类别，这时我们只要按下Ctrl+Shift+O&nbsp; </div>
            <br>
            <div>，它就会自动帮我们Import类别。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>查看使用类别的原始码：Ctrl+鼠标左键点击&nbsp; </div>
            <br>
            <div>简易说明：可以看到您所使用类别的原始码。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>将选取的文字批注起来：Ctrl+/&nbsp; </div>
            <br>
            <div>简易说明：Debug时很方便。&nbsp; </div>
            <br>
            <div>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;程序代码-&gt;批注&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>视景切换：Ctrl+F8&nbsp; </div>
            <br>
            <div>个人习惯：Alt+S。&nbsp; </div>
            <br>
            <div>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;窗口-&gt;下一个视景。&nbsp; </div>
            <br>
            <div>简易说明：可以方便我们快速切换编辑、除错等视景。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>密技篇：&nbsp; </div>
            <br>
            <div>一套Eclipse可同时切换，英文、繁体、简体显示：&nbsp; </div>
            <br>
            <div>1.首先要先安装完中文化包。&nbsp; </div>
            <br>
            <div>2.在桌面的快捷方式后面加上参数即可，&nbsp; </div>
            <br>
            <div>英文-&gt; -nl "zh_US"&nbsp; </div>
            <br>
            <div>繁体-&gt; -nl "zh_TW"&nbsp; </div>
            <br>
            <div>简体-&gt; -nl "zh_CN"。&nbsp; </div>
            <br>
            <div>(其它语系以此类推)&nbsp; </div>
            <br>
            <div>像我2.1.2中文化后，我在我桌面的Eclipse快捷方式加入参数-n1 "zh_US"。&nbsp; </div>
            <br>
            <div>"C:Program Fileseclipseeclipse.exe" -n "zh_US"&nbsp; </div>
            <br>
            <div>接口就会变回英文语系噜。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>利用Eclipse，在Word编辑文书时可不必将程序代码重新编排：&nbsp; </div>
            <br>
            <div>将Eclipse程序编辑区的程序代码整个复制下来(Ctrl+C)，直接贴(Ctrl+V)到&nbsp; </div>
            <br>
            <div>Word或WordPad上，您将会发现在Word里的程序代码格式，跟Eclipse&nbsp; </div>
            <br>
            <div>所设定的完全一样，包括字型、缩排、关键词颜色。我曾试过JBuilder&nbsp; </div>
            <br>
            <div>、GEL、NetBeans...使用复制贴上时，只有缩排格式一样，字型、颜&nbsp; </div>
            <br>
            <div>色等都不会改变。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>外挂篇：&nbsp; </div>
            <br>
            <div>外挂安装：将外挂包下载回来后，将其解压缩后，您会发现features、&nbsp; </div>
            <br>
            <div>plugins这2个数据夹，将里面的东西都复制或移动到Eclipse的features&nbsp; </div>
            <br>
            <div>、plugins数据夹内后，重新启动Eclipse即可。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>让Eclipse可以像JBuilderX一样使用拖拉方式建构GUI的外挂：&nbsp; </div>
            <br>
            <div>1.Jigloo SWT/Swing GUI Builder ：&nbsp; </div>
            <br>
            <div>http://cloudgarden.com/jigloo/index.html ; </div>
            <br>
            <div>下载此版本：Jigloo plugin for Eclipse (using Java 1.4 or 1.5)&nbsp; </div>
            <br>
            <div>安装后即可由档案-&gt;新建-&gt;其它-&gt;GUI Form选取要建构的GUI类型。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>2.Eclipse Visual Editor Project：&nbsp; </div>
            <br>
            <div>http://www.eclipse.org/vep/ ; </div>
            <br>
            <div>点选下方Download Page，再点选Latest Release 0.5.0进入下载。&nbsp; </div>
            <br>
            <div>除了VE-runtime-0.5.0.zip要下载外，以下这2个也要：&nbsp; </div>
            <br>
            <div>EMF build 1.1.1: (build page) (download zip)&nbsp; </div>
            <br>
            <div>GEF Build 2.1.2: (build page) (download zip)&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>3.0 M8版本，请下载：&nbsp; </div>
            <br>
            <div>EMF build I200403250631&nbsp; </div>
            <br>
            <div>GEF Build I20040330&nbsp; </div>
            <br>
            <div>VE-runtime-1.0M1&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>安装成功后，便可由File-&gt;New-&gt;Visual Class开始UI设计。&nbsp; </div>
            <br>
            <div>安装成功后，即可由新建-&gt;Java-&gt;AWT与Swing里选择&nbsp; </div>
            <br>
            <div>所要建构的GUI类型开始进行设计。VE必须配合着对应&nbsp; </div>
            <br>
            <div>版本，才能正常使用，否则即使安装成功，使用上仍会&nbsp; </div>
            <br>
            <div>有问题。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>使用Eclipse来开发JSP程序：&nbsp; </div>
            <br>
            <div>外挂名称：lomboz(下载页面)&nbsp; </div>
            <br>
            <div>http://forge.objectweb.org/project/showfiles.php?group_id=97 ; </div>
            <br>
            <div>请选择适合自己版本的lomboz下载，lomboz.212.p1.zip表示2.1.2版，&nbsp; </div>
            <br>
            <div>lomboz.3m7.zip表示M7版本....以此类推。&nbsp; </div>
            <br>
            <div>lomboz安装以及设置教学：&nbsp; </div>
            <br>
            <div>Eclipse开发JSP-教学文件&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>Java转exe篇：&nbsp; </div>
            <br>
            <div>实现方式：Eclipse搭配JSmooth(免费)。&nbsp; </div>
            <br>
            <div>1.先由Eclipse制作包含Manifest的JAR。&nbsp; </div>
            <br>
            <div>制作教学&nbsp; </div>
            <br>
            <div>2.使用JSmooth将做好的JAR包装成EXE。&nbsp; </div>
            <br>
            <div>JSmooth下载页面：&nbsp; </div>
            <br>
            <div>http://jsmooth.sourceforge.net/index.php ; </div>
            <br>
            <div>3.制作完成的exe文件，可在有装置JRE的Windows上执行。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>Eclipse-Java编辑器最佳设定：&nbsp; </div>
            <br>
            <div>编辑器字型设定：工作台-&gt;字型-&gt;Java编辑器文字字型。&nbsp; </div>
            <br>
            <div>(建议设定Courier New -regular 10)&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>编辑器相关设定：窗口-&gt;喜好设定-&gt;Java-&gt;编辑器&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>外观：显示行号、强调对称显示的方括号、强调显示现行行、&nbsp; </div>
            <br>
            <div>显示打印边距，将其勾选，Tab宽度设4，打印编距字段设80。&nbsp; </div>
            <br>
            <div>程序代码协助：采预设即可。&nbsp; </div>
            <br>
            <div>语法：可设定关键词、字符串等等的显示颜色。&nbsp; </div>
            <br>
            <div>附注：采预设即可。&nbsp; </div>
            <br>
            <div>输入：全部字段都勾选。&nbsp; </div>
            <br>
            <div>浮动说明：采预设即可。&nbsp; </div>
            <br>
            <div>导览：采预设即可。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>使自动排版排出来的效果，最符合Java设计惯例的设定：&nbsp; </div>
            <br>
            <div>自动排版设定：窗口-&gt;喜好设定-&gt;Java-&gt;程序代码制作格式。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>换行：全部不勾选。&nbsp; </div>
            <br>
            <div>分行：行长度上限设：80。&nbsp; </div>
            <br>
            <div>样式：只将强制转型后插入空白勾选。&nbsp; </div>
            <br>
            <div>内缩空格数目：设为4。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>Eclipse的教学文件：&nbsp; </div>
            <br>
            <div>Eclipse 3.0系列热键表 - 中英对照解说版 (by sungo) ~New~&nbsp; </div>
            <br>
            <div>Window+GCC+CDT用Eclipse开发C、C++ (by sungo) ~New~&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>其它：&nbsp; </div>
            <br>
            <div>扩充Eclipse的Java 开发工具(中文)&nbsp; </div>
            <br>
            <div>使用Eclipse开发J2EE 应用程序(中文)&nbsp; </div>
            <br>
            <div>使用Eclipse平台进行除错(中文)&nbsp; </div>
            <br>
            <div>用Eclipse进行XML 开发(中文)&nbsp; </div>
            <br>
            <div>开发Eclipse外挂程序(中文)&nbsp; </div>
            <br>
            <div>国际化您的Eclipse外挂程序(英文)&nbsp; </div>
            <br>
            <div>将Swing编辑器加入Eclipse(英文)&nbsp; </div>
            <br>
            <div>如何测试你的Eclipse plug-in符合国际市场需求(英文)&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>Eclipse的相关网站：&nbsp; </div>
            <br>
            <div>http://eclipse-plugins.2y.net/eclipse/index.jsp ; </div>
            <br>
            <div>http://www.eclipseplugincentral.com/ ; </div>
            <br>
            <div>Eclipse相关教学[简体]&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>&nbsp;&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>&nbsp;&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>写程序写到很累了，想休息一下？？玩玩小Game是&nbsp; </div>
            <br>
            <div>不错的选择，下面介绍使用Eclipse玩Game的Plug-in。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>补充外挂篇：&nbsp; </div>
            <br>
            <div>Eclipse-Games：&nbsp; </div>
            <br>
            <div>http://eclipse-games.sourceforge.net/ ; </div>
            <br>
            <div>版本选：Latest Release 3.0.1 (Release Notes) Sat, 3 Jan 2004&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>外挂安装完后，重新开启Eclipse。&nbsp; </div>
            <br>
            <div>窗口-&gt;自订视景-&gt;其它-&gt;勾选Game Actions。&nbsp; </div>
            <br>
            <div>再将Eclipse关闭，重新再启动，就可以开始玩噜。&nbsp; </div>
            <br>
            <div>(共有4种：采地雷I、采地雷II、贪食蛇、仓库番。)&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>(Eclipse 2.1.2 +中文化 玩Game -仓库番)&nbsp;&nbsp;&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>补充：(于Eclipse使用assertion机制)&nbsp; </div>
            <br>
            <div>Eclipse版本：2.1.3 release。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>JDK1.4版新加入的assertion机制(关键词：assert)，由于JDK1.4编译器&nbsp; </div>
            <br>
            <div>预设是兼容1.3，所以要使用assert必须在编译时加上-source 1.4的参数。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>C:&gt;javac -source 1.4 XXX.java </div>
            <br>
            <div>执行时则必须加-ea 或-enableassertions参数启动。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>C:&gt;java -ea XXX </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>如要在Eclipse中使用assertion机制，请作以下设定：&nbsp; </div>
            <br>
            <div>设定一：(编译设定)&nbsp; </div>
            <br>
            <div>Windows-&gt;Preferance-&gt;Java-&gt;Compiler-&gt;Compliance and Classfiles&nbsp; </div>
            <br>
            <div>页面。将..JDK Compliance level-&gt;Compiler compliance level调成1.4。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>设定二：(执行设定)&nbsp; </div>
            <br>
            <div>Run-&gt;Run-&gt;(x)=Arguments页面，在VM arguments加入-da参数，按下&nbsp; </div>
            <br>
            <div>Run button便可看到启动assertion后的执行结果。&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>(Eclipse 2.1.3 release + assertion测试)&nbsp; </div>
            <br>
            <div>&lt;assert判别为false，所以show出AssertionError&gt;&nbsp;&nbsp;&nbsp; </div>
            <br>
            <div>&nbsp;</div>
            <br>
            <div>新版(m8+)的eclipse可以设vm arguments&nbsp; </div>
            <br>
            <div>另外提供一种设法，是在eclipse启动时加入vm arguments(跟加大eclipse预设内存大小的方式一样)&nbsp; </div>
            <br>
            <div>这样就不用每次run都得需去设vm arguments&nbsp;&nbsp; </div>
            　 </td>
            <td vAlign=top width=160>
            <p align=center></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left><br><br>
<table class=tf width="98%" align=center border=0>
    <tbody>
        <tr>
            <td>更多资源：<br>参与论坛讨论: <a href="http://www.java-cn.com/forum/index.jsp" target=_blank><u><font color=#0000ff>http://www.java-cn.com/forum/index.jsp</font></u></a><br>更多技术文章: <a href="http://www.java-cn.com/technology/index.jsp" target=_blank><u><font color=#0000ff>http://www.java-cn.com/technology/index.jsp</font></u></a><br>更多JAVA博客: <a href="http://www.54bk.com/" target=_blank><u><font color=#0000ff>http://www.54bk.com/</font></u></a><br><strong>JAVA中文站</strong>:&nbsp; 我们要做中国最好的JAVA门户网站,记住我们的域名: <strong>JAVA-CN.COM</strong> | <strong>JAVA-CN.NET</strong> | <strong>JAVA-CN.ORG</strong></td>
        </tr>
        <tr>
            <td>本文网址: <a href="http://www.java-cn.com/technology/technology_detail.jsp?id=4015" target=_blank><u><font color=#0000ff>http://www.java-cn.com/technology/technology_detail.jsp?id=4015</font></u></a><br><font class=red>声&nbsp;&nbsp;&nbsp; 明: 转载此文章,须在显著位置注明 <a href="http://www.java-cn.com/" target=_blank><u><font color=#0000ff>JAVA中文站</font></u></a> 的原文网址;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若是本站的转载文章,请标明原文出处,并保留作者信息</font></td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/115509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2007-05-06 10:16 <a href="http://www.blogjava.net/xixidabao/archive/2007/05/06/115509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse及其插件介绍和下载</title><link>http://www.blogjava.net/xixidabao/archive/2007/01/11/93040.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 10 Jan 2007 18:42:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2007/01/11/93040.html</guid><description><![CDATA[
		<p>一：Eclipse及其插件介绍和下载</p>
		<p>0.Eclipse下载<br />EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载<br /><a href="http://www.eclipse.org/downloads/index.php">http://www.eclipse.org/downloads/index.php</a><br /> <br />0.5.lomboz J2EE插件,开发JSP,EJB<br /><a href="http://forge.objectweb.org/projects/lomboz">http://forge.objectweb.org/projects/lomboz</a><br />1.MyEclipse J2EE开发插件，支持SERVLET/JSP/EJB/数据库操纵等 <br /><a href="http://www.myeclipseide.com/">http://www.myeclipseide.com</a><br /> <br />2.Properties Editor  编辑java的属性文件，并可以自动存盘为Unicode格式 <br /><a href="http://propedit.sourceforge.jp/index_en.html">http://propedit.sourceforge.jp/index_en.html</a><br />  <br />3.Colorer Take  为上百种类型的文件按语法着色 <br /><a href="http://colorer.sourceforge.net/">http://colorer.sourceforge.net/</a><br />  <br />4.XMLBuddy 编辑xml文件<br /><a href="http://www.xmlbuddy.com/">http://www.xmlbuddy.com</a><br />  <br />5.Code Folding  加入多种代码折叠功能（比eclipse自带的更多） <br /><a href="http://www.coffee-bytes.com/servlet/PlatformSupport">http://www.coffee-bytes.com/servlet/PlatformSupport</a><br />  <br />6.Easy Explorer  从eclipse中访问选定文件、目录所在的文件夹 <br /><a href="http://easystruts.sourceforge.net/">http://easystruts.sourceforge.net/</a><br />  <br />7.Fat Jar 打包插件，可以方便的完成各种打包任务，可以包含外部的包等 <br /><a href="http://fjep.sourceforge.net/">http://fjep.sourceforge.net/</a><br />  <br />8.RegEx Test 测试正则表达式 <br /><a href="http://brosinski.com/stephan/archives/000028.php">http://brosinski.com/stephan/archives/000028.php</a><br />  <br />9.JasperAssistant 报表插件（强，要钱的） <br /><a href="http://www.jasperassistant.com/">http://www.jasperassistant.com/</a><br />  <br />10.Jigloo GUI Builder ＪＡＶＡ的ＧＵＩ编辑插件 <br /><a href="http://cloudgarden.com/jigloo/">http://cloudgarden.com/jigloo/</a><br />  <br />11.Profiler 性能跟踪、测量工具，能跟踪、测量ＢＳ程序 <br /><a href="http://sourceforge.net/projects/eclipsecolorer/">http://sourceforge.net/projects/eclipsecolorer/</a><br />  <br />12.AdvanQas 提供对if/else等条件语句的提示和快捷帮助（自动更改结构等） <br /><a href="http://eclipsecolorer.sourceforge.net/advanqas/index.html">http://eclipsecolorer.sourceforge.net/advanqas/index.html</a><br />  <br />13.Log4E Log4j插件，提供各种和Log4j相关的任务，如为方法、类添加一个logger等 <br /><a href="http://log4e.jayefem.de/index.php/Main_Page">http://log4e.jayefem.de/index.php/Main_Page</a><br />  <br />14.VSSPlugin VSS插件 <br /><a href="http://sourceforge.net/projects/vssplugin">http://sourceforge.net/projects/vssplugin</a><br />  <br />15.Implementors 提供跳转到一个方法的实现类，而不是接中的功能（实用!） <br /><a href="http://eclipse-tools.sourceforge.net/implementors/">http://eclipse-tools.sourceforge.net/implementors/</a><br />  <br />16.Call Hierarchy 显示一个方法的调用层次（被哪些方法调，调了哪些方法） <br /><a href="http://eclipse-tools.sourceforge.net/call-hierarchy/index.html">http://eclipse-tools.sourceforge.net/call-hierarchy/index.html</a><br />  <br />17.EclipseTidy 检查和格式化HTML/XML文件 <br /><a href="http://eclipsetidy.sourceforge.net/">http://eclipsetidy.sourceforge.net/</a><br />  <br />18.Checkclipse 检查代码的风格、写法是否符合规范 <br /><a href="http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm">http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm</a><br />  <br />19.Hibernate Synchronizer Hibernate插件，自动映射等 <br /><a href="http://www.binamics.com/hibernatesync/">http://www.binamics.com/hibernatesync/</a><br />  <br />20.VeloEclipse  Velocity插件 <br /><a href="http://propsorter.sourceforge.net/">http://propsorter.sourceforge.net/</a><br />  <br />21.EditorList 方便的列出所有打开的Editor <br /><a href="http://editorlist.sourceforge.net/">http://editorlist.sourceforge.net/</a><br />  <br />22.MemoryManager 内存占用率的监视 <br /><a href="http://cloudgarden.com/memorymanager/">http://cloudgarden.com/memorymanager/</a><br /> <br />23.swt-designer java的GUI插件<br /><a href="http://www.swt-designer.com/">http://www.swt-designer.com/</a><br /> <br />24.TomcatPlugin 支持Tomcat插件 <br /><a href="http://www.sysdeo.com/eclipse/tomcatPlugin.html">http://www.sysdeo.com/eclipse/tomcatPlugin.html</a><br /> <br />25.XML Viewer <br /><a href="http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html">http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html</a><br /> <br />26.quantum 数据库插件<br /><a href="http://quantum.sourceforge.net/">http://quantum.sourceforge.net/</a><br /> <br />27.Dbedit 数据库插件<br /><a href="http://sourceforge.net/projects/dbedit">http://sourceforge.net/projects/dbedit</a><br /> <br />28.clay.core 可视化的数据库插件 <br /><a href="http://www.azzurri.jp/en/software/index.jsp">http://www.azzurri.jp/en/software/index.jsp</a><br /><a href="http://www.azzurri.jp/eclipse/plugins">http://www.azzurri.jp/eclipse/plugins</a><br /> <br />29.hiberclipse hibernate插件 <br /><a href="http://hiberclipse.sourceforge.net/">http://hiberclipse.sourceforge.net</a><br /><a href="http://www.binamics.com/hibernatesync">http://www.binamics.com/hibernatesync</a><br /> <br />30.struts-console Struts插件<br /><a href="http://www.jamesholmes.com/struts/console/">http://www.jamesholmes.com/struts/console/</a><br /> <br />31.easystruts Struts插件<br /><a href="http://easystruts.sourceforge.net/">http://easystruts.sourceforge.net</a><br /> <br />32.veloedit Velocity插件<br /><a href="http://veloedit.sourceforge.net/">http://veloedit.sourceforge.net/</a><br /> <br />33.jalopy 代码整理插件<br /><a href="http://jalopy.sourceforge.net/">http://jalopy.sourceforge.net/</a><br /> <br />34.JDepend 包关系分析<br /><a href="http://andrei.gmxhome.de/jdepend4eclipse/links.html">http://andrei.gmxhome.de/jdepend4eclipse/links.html</a><br /> <br />35.Spring IDE Spring插件<br /><a href="http://springide-eclip.sourceforge.net/updatesite/">http://springide-eclip.sourceforge.net/updatesite/</a><br /> <br />36.doclipse 可以产生xdoclet 的代码提示<br /><a href="http://beust.com/doclipse/">http://beust.com/doclipse/</a><br />0.Eclipse下载<br />EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载<br /><a href="http://www.eclipse.org/downloads/index.php"><font color="#002c99">http://www.eclipse.org/downloads/index.php</font></a><br /> <br />0.5.lomboz J2EE插件,开发JSP,EJB<br /><a href="http://forge.objectweb.org/projects/lomboz"><font color="#002c99">http://forge.objectweb.org/projects/lomboz</font></a><br />1.MyEclipse J2EE开发插件，支持SERVLET/JSP/EJB/数据库操纵等 <br /><a href="http://www.myeclipseide.com/"><font color="#002c99">http://www.myeclipseide.com</font></a><br /> <br />2.Properties Editor  编辑java的属性文件，并可以自动存盘为Unicode格式 <br /><a href="http://propedit.sourceforge.jp/index_en.html"><font color="#002c99">http://propedit.sourceforge.jp/index_en.html</font></a><br />  <br />3.Colorer Take  为上百种类型的文件按语法着色 <br /><a href="http://colorer.sourceforge.net/"><font color="#002c99">http://colorer.sourceforge.net/</font></a><br />  <br />4.XMLBuddy 编辑xml文件<br /><a href="http://www.xmlbuddy.com/"><font color="#002c99">http://www.xmlbuddy.com</font></a><br />  <br />5.Code Folding  加入多种代码折叠功能（比eclipse自带的更多） <br /><a href="http://www.coffee-bytes.com/servlet/PlatformSupport"><font color="#002c99">http://www.coffee-bytes.com/servlet/PlatformSupport</font></a><br />  <br />6.Easy Explorer  从eclipse中访问选定文件、目录所在的文件夹 <br /><a href="http://easystruts.sourceforge.net/"><font color="#002c99">http://easystruts.sourceforge.net/</font></a><br />  <br />7.Fat Jar 打包插件，可以方便的完成各种打包任务，可以包含外部的包等 <br /><a href="http://fjep.sourceforge.net/"><font color="#002c99">http://fjep.sourceforge.net/</font></a><br />  <br />8.RegEx Test 测试正则表达式 <br /><a href="http://brosinski.com/stephan/archives/000028.php"><font color="#002c99">http://brosinski.com/stephan/archives/000028.php</font></a><br />  <br />9.JasperAssistant 报表插件（强，要钱的） <br /><a href="http://www.jasperassistant.com/"><font color="#002c99">http://www.jasperassistant.com/</font></a><br />  <br />10.Jigloo GUI Builder ＪＡＶＡ的ＧＵＩ编辑插件 <br /><a href="http://cloudgarden.com/jigloo/"><font color="#002c99">http://cloudgarden.com/jigloo/</font></a><br />  <br />11.Profiler 性能跟踪、测量工具，能跟踪、测量ＢＳ程序 <br /><a href="http://sourceforge.net/projects/eclipsecolorer/"><font color="#002c99">http://sourceforge.net/projects/eclipsecolorer/</font></a><br />  <br />12.AdvanQas 提供对if/else等条件语句的提示和快捷帮助（自动更改结构等） <br /><a href="http://eclipsecolorer.sourceforge.net/advanqas/index.html"><font color="#002c99">http://eclipsecolorer.sourceforge.net/advanqas/index.html</font></a><br />  <br />13.Log4E Log4j插件，提供各种和Log4j相关的任务，如为方法、类添加一个logger等 <br /><a href="http://log4e.jayefem.de/index.php/Main_Page"><font color="#002c99">http://log4e.jayefem.de/index.php/Main_Page</font></a><br />  <br />14.VSSPlugin VSS插件 <br /><a href="http://sourceforge.net/projects/vssplugin"><font color="#002c99">http://sourceforge.net/projects/vssplugin</font></a><br />  <br />15.Implementors 提供跳转到一个方法的实现类，而不是接中的功能（实用!） <br /><a href="http://eclipse-tools.sourceforge.net/implementors/"><font color="#002c99">http://eclipse-tools.sourceforge.net/implementors/</font></a><br />  <br />16.Call Hierarchy 显示一个方法的调用层次（被哪些方法调，调了哪些方法） <br /><a href="http://eclipse-tools.sourceforge.net/call-hierarchy/index.html"><font color="#002c99">http://eclipse-tools.sourceforge.net/call-hierarchy/index.html</font></a><br />  <br />17.EclipseTidy 检查和格式化HTML/XML文件 <br /><a href="http://eclipsetidy.sourceforge.net/"><font color="#002c99">http://eclipsetidy.sourceforge.net/</font></a><br />  <br />18.Checkclipse 检查代码的风格、写法是否符合规范 <br /><a href="http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm"><font color="#002c99">http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm</font></a><br />  <br />19.Hibernate Synchronizer Hibernate插件，自动映射等 <br /><a href="http://www.binamics.com/hibernatesync/"><font color="#002c99">http://www.binamics.com/hibernatesync/</font></a><br />  <br />20.VeloEclipse  Velocity插件 <br /><a href="http://propsorter.sourceforge.net/"><font color="#002c99">http://propsorter.sourceforge.net/</font></a><br />  <br />21.EditorList 方便的列出所有打开的Editor <br /><a href="http://editorlist.sourceforge.net/"><font color="#002c99">http://editorlist.sourceforge.net/</font></a><br />  <br />22.MemoryManager 内存占用率的监视 <br /><a href="http://cloudgarden.com/memorymanager/"><font color="#002c99">http://cloudgarden.com/memorymanager/</font></a><br /> <br />23.swt-designer java的GUI插件<br /><a href="http://www.swt-designer.com/"><font color="#002c99">http://www.swt-designer.com/</font></a><br /> <br />24.TomcatPlugin 支持Tomcat插件 <br /><a href="http://www.sysdeo.com/eclipse/tomcatPlugin.html"><font color="#002c99">http://www.sysdeo.com/eclipse/tomcatPlugin.html</font></a><br /> <br />25.XML Viewer <br /><a href="http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html"><font color="#002c99">http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html</font></a><br /> <br />26.quantum 数据库插件<br /><a href="http://quantum.sourceforge.net/"><font color="#002c99">http://quantum.sourceforge.net/</font></a><br /> <br />27.Dbedit 数据库插件<br /><a href="http://sourceforge.net/projects/dbedit"><font color="#002c99">http://sourceforge.net/projects/dbedit</font></a><br /> <br />28.clay.core 可视化的数据库插件 <br /><a href="http://www.azzurri.jp/en/software/index.jsp"><font color="#002c99">http://www.azzurri.jp/en/software/index.jsp</font></a><br /><a href="http://www.azzurri.jp/eclipse/plugins"><font color="#002c99">http://www.azzurri.jp/eclipse/plugins</font></a><br /> <br />29.hiberclipse hibernate插件 <br /><a href="http://hiberclipse.sourceforge.net/"><font color="#002c99">http://hiberclipse.sourceforge.net</font></a><br /><a href="http://www.binamics.com/hibernatesync"><font color="#002c99">http://www.binamics.com/hibernatesync</font></a><br /> <br />30.struts-console Struts插件<br /><a href="http://www.jamesholmes.com/struts/console/"><font color="#002c99">http://www.jamesholmes.com/struts/console/</font></a><br /> <br />31.easystruts Struts插件<br /><a href="http://easystruts.sourceforge.net/"><font color="#002c99">http://easystruts.sourceforge.net</font></a><br /> <br />32.veloedit Velocity插件<br /><a href="http://veloedit.sourceforge.net/"><font color="#002c99">http://veloedit.sourceforge.net/</font></a><br /> <br />33.jalopy 代码整理插件<br /><a href="http://jalopy.sourceforge.net/"><font color="#002c99">http://jalopy.sourceforge.net/</font></a><br /> <br />34.JDepend 包关系分析<br /><a href="http://andrei.gmxhome.de/jdepend4eclipse/links.html"><font color="#002c99">http://andrei.gmxhome.de/jdepend4eclipse/links.html</font></a><br /> <br />35.Spring IDE Spring插件<br /><a href="http://springide-eclip.sourceforge.net/updatesite/"><font color="#002c99">http://springide-eclip.sourceforge.net/updatesite/</font></a><br /> <br />36.doclipse 可以产生xdoclet 的代码提示<br /><a href="http://beust.com/doclipse/"><font color="#002c99">http://beust.com/doclipse/</font></a><br /></p>
		<p>二：</p>
		<p>After installing Eclipse 3 and Tomcat Plugin,the plugin is not loaded!</p>
		<p>Lanching Eclipse 3 with "-clean" option can fix this problem.<br /></p>
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=540513</p>
		<p>
				<br />
		</p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/93040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2007-01-11 02:42 <a href="http://www.blogjava.net/xixidabao/archive/2007/01/11/93040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Eclipse 3.0的SWT编程</title><link>http://www.blogjava.net/xixidabao/archive/2006/05/21/47340.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Sun, 21 May 2006 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/21/47340.html</guid><description><![CDATA[
		<pre>　一、SWT简介

　　Java语言的声望和它在桌面应用程序（GUI程序）所取得的成就显然极不相符，至今仍然很少能看到非常成功Java桌面程序。虽然有JBuilder，Netbean，JProbe等大型软件作为代表，但这仍不能证明Java的GUI程序是成功的：它们的外观总是和同一操作系统平台下的其它软件显得格格不入。对机器配置的需求也似乎永无止境，这使得它们只能被一些总是拥有当前最高性能PC的程序员们所容忍，或是那些不在乎金钱和时间的专业用户所接受。对绝大多数计算机使用者来说，AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget Toolkit（SWT）或许是Java这一噩梦的终结者，广大Java程序员终于可以开发出高效率的GUI程序，它们拥有标准的外观，几乎没有人能看出你的程序是用Java写出来的，更为重要的是，这些程序是跨平台的。 

　　SWT本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。或许是无心插柳，或是有意为之，至今为止，SWT无论是在性能和外观上，都超越了SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到了2.1版本，SWT已经十分稳定。这里指的稳定应该包含两层意思：

　　一是指性能上的稳定，其中的关键是源于SWT的设计理念。SWT最大化了操作系统的图形构件API，就是说只要操作系统提供了相应图形的构件，那么SWT只是简单应用JNI技术调用它们，只有那些操作系统中不提供的构件，SWT才自己去做一个模拟的实现。可以看出SWT的性能上的稳定大多时候取决于相应操作系统图形构件的稳定性。

　　另一个稳定是指SWT API包中的类、方法的名称和结构已经少有改变，程序员不用担心由于Eclipse组织开发进度很快（Eclipse IDE每天都会有一个Nightly版本的发布），而导致自己的程序代码变化过大。从一个版本的SWT更新至另一版本，通常只需要简单将SWT包换掉就可以了。

　　二、Eclipse3.0的SWT编程

　　1.SWT比AWT和Swing要快多，因为它是利用操作系统的界面组件生成UI的，在java桌面设计领域掀起一场革命

　　2.环境配置：

　　windows系统+eclipse3.0

　　3.具体操作：

　　(1).新建一java项目，命名SWT,文件结构如下：

　　+swt
　　+bin(编译输出)
　　+src(原文件)
　　+AddressBookUI.java
　　+swt-awt-win32-3062.dll(以下均从eclipse\plugins\org.eclipse.swt.win32_3.0.1\os\win32\x86下导入)
　　+swt-win32-3062.dll
　　+javaw.exe.manifest

　　(2).到项目的properties里，在java build path | libraries里将swt.jar导入

　　(3).AddressBookUI.java原代码如下：

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
public class AddressBookUI {
　private Shell shell;
　private Text miscText;
　private Text addrText;
　private Text emailText;
　private Text phoneText;
　private Text lnameText;
　private Text fnameText;
　private Button cancelButton;
　private Button saveButton;
　private Button nextButton;
　private Button prevButton;
　private Button editButton;
　private Button deleteButton;
　private Button newButton;
　public static void main(String[] args) {
　　AddressBookUI window = new AddressBookUI();
　　window.open();
　}
　public void open() {
　　final Display display = new Display();
　　shell = new Shell();
　　shell.setSize(610, 477);
　　shell.setText("Address Book");
　{
　　newButton = new Button(shell, SWT.NONE);
　　newButton.addSelectionListener(new SelectionAdapter() {
　　　public void widgetSelected(SelectionEvent e) {
　　　　clearText(); 
　　　　setTextEditable(true);
　　　　enableEditButtons(false);
　　　　enableSaveButtons(true);

　　　　System.out.println("New button selected.");
　　　}
　　});
　　newButton.setBounds(10, 380, 75, 35);
　　newButton.setText("New");
　}
　{
　　deleteButton = new Button(shell, SWT.NONE);
　　deleteButton.addSelectionListener(new SelectionAdapter() {
　　　public void widgetSelected(SelectionEvent e) {
　　　　clearText();

　　　　System.out.println("Delete button selected.");
　　　}
　　});
　　deleteButton.setBounds(85, 380, 75, 35);
　　deleteButton.setText("Delete");
　}
　{
　　editButton = new Button(shell, SWT.NONE);
　　editButton.addSelectionListener(new SelectionAdapter() {
　　　public void widgetSelected(SelectionEvent e) {
　　　　setTextEditable(true);
　　　　enableEditButtons(false);
　　　　enableSaveButtons(true);
　　
　　　　System.out.println("Edit button selected."); 
　　　}
　　});
　　editButton.setBounds(160, 380, 75, 35);
　　editButton.setText("Edit");
　}
　{
　　prevButton = new Button(shell, SWT.NONE);
　　prevButton.addSelectionListener(new SelectionAdapter() {
　　　public void widgetSelected(SelectionEvent e) {
　　　　System.out.println("Previous button selected.");
　　　}
　　});
　　prevButton.setBounds(265, 380, 75, 35);
　　prevButton.setText("Previous");
　}
　{
　　nextButton = new Button(shell, SWT.NONE);
　　nextButton.addSelectionListener(new SelectionAdapter() {
　　　public void widgetSelected(SelectionEvent e) {
　　　　System.out.println("Next button selected.");
　　　}
　　});
　　nextButton.setBounds(340, 380, 75, 35);
　　nextButton.setText("Next");
　}
　{
　　saveButton = new Button(shell, SWT.NONE);
　　saveButton.addSelectionListener(new SelectionAdapter() {
　　　public void widgetSelected(SelectionEvent e) {
　　　　setTextEditable(false);
　　　　enableEditButtons(true);
　　　　enableSaveButtons(false);
　
　　　　System.out.println("Save button selected."); 
　　　}
　　});
　　saveButton.setBounds(445, 380, 75, 35);
　　saveButton.setText("Save");
　　saveButton.setEnabled(false);
　}
　{
　　cancelButton = new Button(shell, SWT.NONE);
　　cancelButton.addSelectionListener(new SelectionAdapter() {
　　　public void widgetSelected(SelectionEvent e) {
　　　　setTextEditable(false);
　　　　enableEditButtons(true);
　　　　enableSaveButtons(false);

　　　　System.out.println("Cancel button selected."); 
　　　}
　　});
　　cancelButton.setBounds(520, 380, 75, 35);
　　cancelButton.setText("Cancel");
　　cancelButton.setEnabled(false);
　}
　{
　　final Group group = new Group(shell, SWT.NONE);
　　group.setText("Details");
　　group.setBounds(10, 10, 585, 355);
　　{
　　　final Label label = new Label(group, SWT.NONE);
　　　label.setBounds(10, 20, 135, 25);
　　　label.setText("First Name:");
　　}
　　{
　　　final Label label = new Label(group, SWT.NONE);
　　　label.setBounds(10, 60, 135, 25);
　　　label.setText("Last Name:");
　　}
　　{
　　　final Label label = new Label(group, SWT.NONE);
　　　label.setBounds(10, 100, 135, 25);
　　　label.setText("Phone:");
　　}
　　{
　　　final Label label = new Label(group, SWT.NONE);
　　　label.setBounds(10, 140, 135, 25);
　　　label.setText("Email:");
　　}
　　{
　　　final Label label = new Label(group, SWT.NONE);
　　　label.setBounds(10, 180, 135, 25);
　　　label.setText("Address:");
　　}
　　{
　　　final Label label = new Label(group, SWT.NONE);
　　　label.setBounds(10, 255, 135, 25);
　　　label.setText("Miscellaneous Information:");
　　}
　　{
　　　fnameText = new Text(group, SWT.BORDER | SWT.READ_ONLY);
　　　fnameText.setBounds(150, 15, 420, 25);
　　}
　　{
　　　lnameText = new Text(group, SWT.BORDER | SWT.READ_ONLY);
　　　lnameText.setBounds(150, 55, 420, 25);
　　}
　　{
　　　phoneText = new Text(group, SWT.BORDER | SWT.READ_ONLY);
　　　phoneText.setBounds(150, 95, 420, 25);
　　}
　　{
　　　emailText = new Text(group, SWT.BORDER | SWT.READ_ONLY);
　　　emailText.setBounds(150, 135, 420, 25);
　　}
　　{
　　　addrText = new Text(group, SWT.BORDER | SWT.READ_ONLY | SWT.V_SCROLL);
　　　addrText.setBounds(150, 175, 420, 60);
　　}
　　{
　　　miscText = new Text(group, SWT.BORDER | SWT.READ_ONLY | SWT.V_SCROLL);
　　　miscText.setBounds(150, 250, 420, 65);
　　}
　}

　setupMenu();

　shell.open();
　while (!shell.isDisposed()) {
　　if (!display.readAndDispatch())
　　　display.sleep();
　}
}

private void setupMenu() {
　//create the menu bar
　Menu menu = new Menu(shell, SWT.BAR);
　shell.setMenuBar(menu);
　//add the File option to it
　MenuItem file = new MenuItem(menu, SWT.CASCADE);
　file.setText("File");
　//create a menu for the File option
　file.setMenu(new Menu(file));
　//add MenuItems to the File menu
　MenuItem prevItem = new MenuItem(new Menu(file), SWT.NONE);
　prevItem.setText("Previous");

　MenuItem nextItem = new MenuItem(new Menu(file), SWT.PUSH);
　nextItem.setText("Next");

　MenuItem seperator = new MenuItem(new Menu(file), SWT.SEPARATOR);
　MenuItem quitItem = new MenuItem(new Menu(file), SWT.PUSH);
　quitItem.setText("Quit");
　//add listeners for the actions
　prevItem.addListener(SWT.Selection, new Listener() {
　　public void handleEvent(Event e) {
　　　System.out.println("Previous menu item selected.");
　　}
　});
　nextItem.addListener(SWT.Selection, new Listener() {
　　public void handleEvent(Event e) {
　　　System.out.println("Next menu item selected.");
　　}
　});
　quitItem.addListener(SWT.Selection, new Listener() {
　　public void handleEvent(Event e) {
　　　shell.dispose();
　　}
　});
}

private void clearText() {
　fnameText.setText("");
　lnameText.setText("");
　phoneText.setText("");
　emailText.setText("");
　addrText.setText("");
　miscText.setText(""); 
}

private void setTextEditable(boolean editable) {
　fnameText.setEditable(editable);
　lnameText.setEditable(editable);
　phoneText.setEditable(editable);
　emailText.setEditable(editable);
　addrText.setEditable(editable);
　miscText.setEditable(editable);
}

private void enableEditButtons(boolean enable) {
　newButton.setEnabled(enable);
　deleteButton.setEnabled(enable);
　editButton.setEnabled(enable);
}

private void enableSaveButtons(boolean enable) {
　saveButton.setEnabled(enable);
　cancelButton.setEnabled(enable); 
}
} 

</pre>
<img src ="http://www.blogjava.net/xixidabao/aggbug/47340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-21 22:50 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/21/47340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发Eclipse下的自定义控件</title><link>http://www.blogjava.net/xixidabao/archive/2006/05/20/47222.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Sat, 20 May 2006 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/20/47222.html</guid><description><![CDATA[
		<pre>　　本文首先介绍模型转换的基本概念，然后介绍RSA模型转换框架，之后本文以两个具体的例子介绍如何在RSA开发平台中以模型转换框架为基础创建和扩展模型转换。  

　　现在基于Eclipse的应用越来越多，很多桌面应用都是用Eclipse开发的。Eclipse提供了一套SWT/JFACE的控件库,使得人们开发界面应用极大的方便。但是，SWT/JFACE的控件库毕竟有限，在应用开发是我们不可避免地要自己开发一些自定义的控件。本文通过开发一个颜色列表控件的实例介绍了Eclipse自定义控件开发中所要用到的技术。

　　目标读者必须熟悉Java开发，并且有一定的Eclipse开发经验。

　　在Eclipse网站上有一篇相关的文章"Creating Your Own Widgets using SWT"，该文介绍了开发自己控件的很多基本概念、方法，并且通过实例进行了介绍，非常好。但是其所用的实例比较简单，还有很多控件开发中所要涉及到的内容，例如键盘、鼠标事件的处理，滚动条、焦点的处理等等没有提及。本文通过开发一个自定义的颜色列表控件的实例，全面地介绍了自定义控件所涉及的技术。同时，读者也可以对该实例进行扩展，实现自己的列表控件。　

　　SWT中提供的标准列表控件非常简单，只能提供字符串的选择。我们经常需要提供一些图形列表供用户选择，这就需要自己开发自定义的列表控件。颜色选择列表是我们常用的一种图形列表，我们就以此为例进行介绍。以下是我们将要开发的颜色列表。

　　我们在开发自定义控件时主要考虑以下问题：

　　1、 自定义控件的绘制：通常我们需要自己对控件的形状或图案进行绘制；

　　2、 控件对键盘事件的响应：当焦点进入控件，用户进行键盘操作，通过键盘对控件进行控制时，我们需要让控件对用户的操作进行响应。例如在列表中，用户会通过上下箭头改变列表的选择项；

　　3、 控件对鼠标事件的响应：当用户用鼠标选中控件，进行操作时，控件必须作出相应的反应；

　　4、 控件对焦点事件的响应：当界面焦点进入或移出控件，通常我们需要将控件绘制成得到或失去焦点的形状。例如，当焦点进入列表时，一般被选中的列表项会有虚框表示选中。

　　5、 响应TAB键：对于一个可操纵的控件，用户可以用TAB键将焦点移入或移出。

　　6、 响应滚动条事件：当控件有滚动条时，我们需要响应用户对滚动条的操作，完成对控件的绘制工作。

　　7、 提供事件监听机制：程序员使用你的控件时通常需要监听控件中发生的一些事件，这样当事件发生时，他们能够进行相应处理。

　　8、 提供辅助功能（Accessibility）：辅助功能是方便残障人士使用时必须的，标准控件都会提供相应的支持，我们自定义的控件也不例外。

　　9、 提供功能接口方便程序员访问：通常为方便程序员使用时获取控件中的信息或进行设置，我们需要提供一些接口。

　　首先我们要开发的列表控件是一个基本控件，所以我们选择Canvas作为我们开发的基类。


  public class ColorList extends Canvas {
  Vector colors = new Vector();  // 用于保存我们颜色控件中的颜色值
  Vector colorNames = new Vector(); // 用于保存颜色控件中的颜色名字

  int rowSel = -1; // 用于保存当前选中的行号
  int oldRowSel = -1; // 用于保存上一次选中的行号

  int maxX, maxY;  // 用于保存列表的宽度和高度
  int lineHeight; // 用于设置行高

  int cx = 0;  // 滚动条滚动后，控件的图形相对于控件可见区域左上角的x坐标
  int cy = 0;  // 滚动条滚动后，控件的图形相对于控件可见区域左上角的y坐标
}
  



　　控件开发最重要的就是控件的绘制了。控件的绘制可以通过添加PaintListener，在它的paintControl方法中进行。


  addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    GC gc = e.gc;
    Point size = getSize();
    int beginx = e.x;
    int beginy = (e.y / lineHeight) * lineHeight;
    int beginLine = (e.y - cy) / lineHeight;
    int endLine = beginLine + e.height / lineHeight + 1;
    if (endLine &gt; getItemCount())
     endLine = getItemCount();
    for (int i = beginLine; i &lt; endLine; i++) {
     boolean selected = false;
     if (i == rowSel)
      selected = true;
     onPaint(gc, i, cx, beginy + (i - beginLine) * lineHeight,
       selected);
    }
   }
  }); 
   



　　这里要注意的是从PaintEvent中获取的x,y,height,width是需要重绘的区域，x,y是以控件的左上角为原点的坐标。在我们的程序中，为了性能起见，我们先根据需要重绘的区域计算出需要重绘的行数，只重绘相应的行，而不是将整个控件重绘。我们程序中用到的onPaint用于绘制一行。

　　接下来，我们要让我们的控件响应键盘上下键对列表项进行选择。我们已对向上键的处理为例，首先当用户按了向上键时，我们需要改变选择，并且重绘旧的和新的选择项。如果选择项已经到了列表的顶部，我们还需要同时滚动滚动条。


  addListener(SWT.KeyDown, new Listener() {
   public void handleEvent(Event event) {
    switch (event.keyCode) {
    case SWT.ARROW_UP: // 处理向上键
     if (rowSel != 0) {
      oldRowSel = rowSel;
      rowSel--;
      if (oldRowSel != rowSel) { //发送消息让控件重绘
       ((Canvas) event.widget).redraw(cx, (rowSel + cy
         / lineHeight)
         * lineHeight, maxX, lineHeight*2, false);
      }
      if (rowSel &lt; -cy / lineHeight) { //如果需要，滚动滚动条
       ScrollBar bar = ((Canvas) event.widget)
         .getVerticalBar();
       bar.setSelection(bar.getSelection() - lineHeight);
       scrollVertical(bar);
      }
      selectionChanged(); // 发送selectionChanged事件
     }
     break;
    case SWT.ARROW_DOWN: // down arror key
     …
     break;
    }
   }
  });
   



　　接下来，我们要让我们的控件响应鼠标对列表项进行选择。首先我们要计算出鼠标选中的行号，注意MouseEvent中的y值只是相对于控件左上角的坐标，我们需要加上滚动出了控件的部分。


  addMouseListener(new MouseListener() {
   public void mouseDoubleClick(MouseEvent e) {
   }
   public void mouseDown(MouseEvent e) {
    int row = (e.y - cy) / lineHeight; //计算选中的行
    if (row &gt;= 0) {
     oldRowSel = rowSel;
     rowSel = row;
    }
    if (oldRowSel != rowSel) { // 重画旧的和新的选择项
     ((Canvas) e.getSource()).redraw(cx, (e.y / lineHeight)
       * lineHeight, maxX, lineHeight, false);
     ((Canvas) e.getSource()).redraw(cx, (oldRowSel + cy
       / lineHeight)
       * lineHeight, maxX, lineHeight, false);
    }
    selectionChanged();
   }
   public void mouseUp(MouseEvent e) {
   }
  });
   


　　当我们的控件获得焦点时，选中的列表项需要有虚框表示控件得到焦点。当获得或失去焦点是，我们这里只需要简单的通知选中的项重画。


  addFocusListener(new FocusListener() {
   public void focusGained(FocusEvent e) {
    ((Canvas) e.getSource()).redraw(cx, rowSel * lineHeight, maxX,
      lineHeight, true);
   }
   public void focusLost(FocusEvent e) {
    ((Canvas) e.getSource()).redraw(cx, rowSel * lineHeight, maxX,
      lineHeight, true);
   }
  });
   



　　我们在绘制每一个列表项时可以加入判断当前控件是否得到焦点，如果控件得到了焦点，我们就在选中的项目上画一个虚框。下面是我们绘制一个列表项的代码，注意在代码的最后绘制焦点的虚框。


void onPaint(GC gc, int row, int beginx, int beginy, boolean isSelected) {
  Color initColor = gc.getBackground();
  Color initForeColor = gc.getForeground();
  if (isSelected) {
   gc.setBackground(Display.getCurrent().getSystemColor(
     SWT.COLOR_LIST_SELECTION));
   gc.fillRectangle(beginx, beginy, maxX, lineHeight);
   gc.setForeground(Display.getCurrent().getSystemColor(
     SWT.COLOR_LIST_SELECTION_TEXT));
  } else {
   gc.setBackground(initColor);
  }
  gc.drawString((String) colorNames.get(row), beginx + 24, beginy);
  Color color = Display.getCurrent().getSystemColor(
    ((Integer) colors.get(row)).intValue());
  gc.setBackground(color);
  gc.fillRectangle(beginx + 2, beginy + 2, 20, lineHeight - 4);
  gc.setBackground(initColor);
  gc.setForeground(initForeColor);
  if (isFocusControl() &amp;&amp; isSelected)
   gc.drawFocus(cx, beginy, maxX, lineHeight);
}
  



　　作为一个可操作的控件，TAB键的支持也是很重要的。由于我们的控件是从Canvas继承过来的，不支持TAB键。下面的代码使我们的控件有TAB键的支持：


addTraverseListener(new TraverseListener() {
   public void keyTraversed(TraverseEvent e) {
    if (e.detail == SWT.TRAVERSE_TAB_NEXT
      || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
     e.doit = true;
    }
   };
  });




　　很多时候，我们需要有滚动条的支持。对于滚动条，我们只要在上面加上selectionListener，处理它的widgetSelected事件就可以。


bar = getVerticalBar();
  if (bar != null) {
   bar.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent event) {
     scrollVertical((ScrollBar) event.widget);
    }
   });
  }




　　下面是函数scrollVertical的代码。一旦用户对滚动条操作，我们就可以计算出要滚动的区域，然后调用scroll函数。对函数scroll函数的调用会导致相应区域的重绘。


void scrollVertical(ScrollBar scrollBar) {
  Rectangle bounds = getClientArea();
  int y = -scrollBar.getSelection();
  if (y + maxY &lt; bounds.height) {
   y = bounds.height - maxY;
  }
  if( y%lineHeight !=0 )
   y = y - y % lineHeight - lineHeight;
  scroll(cx, y, cx, cy, maxX, maxY, false);
  cy = y;
}



　　现在我们的程序已经基本成形了，我们来进一步完善它。由于我们开发的控件是提供给程序员的，我们需要提供接口，让外部知道控件中发生的事件。其中最重要的是列表项的选中事件。我们需要提供接口让程序员能够添加事件监控器(listener)来监控发生的事件，并且一旦发生事件，我们需要通知监控器。

　　首先，我们添加一个成员来保存添加的事件监控器：


Vector selectionListeners = new Vector();




　　我们再增加一个函数addSelectionListener，让程序员可以添加监控器


public void addSelectionListener(SelectionListener listener) {
  selectionListeners.addElement(listener);
}




　　在我们前面的代码中，我们注意到每次选择项改变，我们都会调用selectionChanged函数。下面是selectionChanged函数代码。这里，我们会生成一个SelectionEvent事件，并且逐个调用事件监控器的widgetSelected方法。这样别人就可以监听到我们的事件了。


public void selectionChanged() {
  Event event = new Event();
  event.widget = this;
  SelectionEvent e = new SelectionEvent(event);
  for (int i = 0; i &lt; selectionListeners.size(); i++) {
   SelectionListener listener = (SelectionListener) selectionListeners.elementAt(i);
   listener.widgetSelected(e);
  }
}




　　现在辅助功能（Accessibility）也日益成为软件重要的部分，它是的残疾人也能够方便的使用我们的软件。美国已经立法，不符合Accessibility规范的软件不能够在政府部门销售。我们开发的控件也需要支持Accessibility.下面的代码使我们的控件有Accessibility支持。其中最重要的是getRole和getValue函数。我们的控件是从Canvas继承，我们在getRole函数中返回ACC.ROLE_LIST,这样我们的控件才能让屏幕阅读软件将我们的控件作为列表控件对待。

Accessible accessible = getAccessible(); 
accessible.addAccessibleControlListener(new AccessibleControlAdapter() { 
　public void getRole(AccessibleControlEvent e) { 
　　int role = 0; int childID = e.childID; 
　　if (childID == ACC.CHILDID_SELF) { 
　　　role = ACC.ROLE_LIST; } 
　　else if (childID &gt;= 0 &amp;&amp; childID &lt; colors.size()) {
　　　role = ACC.ROLE_LISTITEM; 
　　}
　　e.detail = role;
　}
　public void getValue(AccessibleControlEvent e){
　　int childID = e.childID; 
　　if (childID == ACC.CHILDID_SELF) {
　　　e.result = getText(); 
　　}
　　else if (childID &gt;= 0 &amp;&amp; childID &lt; colors.size()) {
　　　e.result = (String)colorNames.get(childID); 
　　}
　}
　public void getChildAtPoint(AccessibleControlEvent e) {
　　Point testPoint = toControl(new Point(e.x, e.y));
　　int childID = ACC.CHILDID_NONE; 
　　childID = (testPoint.y - cy)/lineHeight;
　　if (childID == ACC.CHILDID_NONE) { 
　　　Rectangle location = getBounds();
　　　location.height = location.height - getClientArea().height;
　　　if (location.contains(testPoint)) { 
　　　　childID = ACC.CHILDID_SELF; 
　　　}
　　}
　　e.childID = childID; 
　}
　public void getLocation(AccessibleControlEvent e) {
　　Rectangle location = null; 
　　int childID = e.childID; 
　　if (childID == ACC.CHILDID_SELF) {
　　　location = getBounds();
　　}
　　if (childID &gt;= 0 &amp;&amp; childID &lt; colors.size()) {
　　　location = new Rectangle(cx,childID*lineHeight+cy,maxX,lineHeight);
　　}
　　if (location != null) { 
　　　Point pt = toDisplay(new Point(location.x, location.y)); 
　　　e.x = pt.x; 
　　　e.y = pt.y;
　　　e.width = location.width;
　　　e.height = location.height;
　　}
　}
　public void getChildCount(AccessibleControlEvent e) {
　　e.detail = colors.size(); 
　}
　public void getState(AccessibleControlEvent e) { 
　　int state = 0; 
　　int childID = e.childID; 
　　if (childID == ACC.CHILDID_SELF) {
　　　state = ACC.STATE_NORMAL; 
　　}
　　else if (childID &gt;= 0 &amp;&amp; childID &lt; colors.size()) {
　　　state = ACC.STATE_SELECTABLE; 
　　　if (isFocusControl()) {
　　　　state |= ACC.STATE_FOCUSABLE; 
　　　}
　　　if (rowSel == childID) {
　　　　state |= ACC.STATE_SELECTED; 
　　　　if (isFocusControl()) {
　　　　　state |= ACC.STATE_FOCUSED; 
　　　　}
　　　}
　　}
　　e.detail = state; 
　}
}); 
最后，我们需要提供一些方法方便程序员使用我们的控件。




public void setSelection(int index) {
  if (index &gt;= getItemCount() || index &lt; 0)
   return;
  oldRowSel = rowSel;
  rowSel = index;
  selectionChanged();
}
public int getSelectionIndex() {
  return rowSel;
}
public int getItemHeight() {
  return lineHeight;
}
public void setItemHeight(int height) {
  lineHeight = height;
}
public int getItemCount() {
  return colors.size();
}
public void add(int colorIndex, String colorName) {
  colorNames.add(colorName);
  colors.add(new Integer(colorIndex));
}
  


我们开发的控件的使用也是非常简单的。


CustomList customlist = new CustomList( parent, SWT.V_SCROLL | SWT.H_SCROLL );
  customlist.add(SWT.COLOR_BLACK,"BLACK");
  customlist.add(SWT.COLOR_BLUE,"BLUE");
  customlist.setSelection(1);
  customlist.setSize(400,400);
customlist.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_BACKGROUND));



以上我们介绍了如何开发一个简单的自定义控件所需要涉及的技术。这里我们只以一个简单的颜色控件为例，但是一旦我们掌握了方法，我们很容易就可以开发出各种不同的漂亮控件。

</pre>
<img src ="http://www.blogjava.net/xixidabao/aggbug/47222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-20 21:43 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/20/47222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Eclipse插件开发之定制向导</title><link>http://www.blogjava.net/xixidabao/archive/2006/05/20/47164.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Sat, 20 May 2006 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/20/47164.html</guid><description><![CDATA[
		<pre>Invokatron的历史
　　
　　首先，我们详细说明一下Invokatron本身。在前面的文章中我们讨论过，Invokatron是一个生成Java代码的的图形工具。你可以简单地通过拖放操作建立类的方法。拖入的方法被编辑的方法（也就是插件）"调用"。我们将让数据来驱动应用程序的设计。在后面一篇文章中，我们将开发这个GUI。现在我们需要做的是，找到插件将输入和存储的重要数据。它通常被称为应用程序的模型（model）。在设计这个系统的时候，我们需要考虑下面一些内容：
　　
　　· 哪些细节数据需要保存？
　　
　　· 这些数据在内存中用什么来表现？POJO、JavaBean还是EJB？
　　
　　· 这些数据的存储格式是怎样的？数据库表、XML文件、属性文件还是串行二进制文件？
　　
　　· 输入数据的方式有哪几种？用"新建文件"向导还是在文档属性页面上使用弹出对话框、用编辑器绘制、在文本编辑器中输入的其它向导？
　　
　　在我们继续工作之前必须回答这些问题。不可能有适合所有项目的答案；它完全依赖于你的需求。在我们的例子中，我做出了一些随意的、可能有问题的决定，如下所示：
　　
　　· 一个Java类，它包含类名、程序包、超类（superclass）和实现接口。我们以它为基础，在后面的文章中添加更多数据。
　　
　　· 我将把数据表现为扩展Properties类的类。它建立了编辑器的"文档类"。
　　
　　· 我将使用的格式是属性文件，很容易使用Properties类来分析它。
　　
　　· 在"新建文件"向导中，我将先寻找数据，接着让用户改变属性窗口或文本编辑器中的数据。这个步骤将在下一篇文章中完成。
　　
　　Document（文档）类
　　
　　下一步是编写文档类。建立一个新程序包（invokatron.model）和一个新类（InvokatronDocument）。下面是我们的文档类的开头：
　　
　　public class InvokatronDocument
　　extends Properties
　　{
　　public static final String PACKAGE = "package";
　　public static final String SUPERCLASS = "superclass";
　　public static final String INTERFACES = "interfaces";
　　}
　　
　　使用Properties类可以更简单地分析和保存我们的数据。Getter和 setter不是必须的，但是如果你想要，也可以加上它们。这个类还没有完成；我们将添加一个接口，在后面的部分中Eclipse需要使用它。
　　
　　有了这个类之后，我们要获取一个属性就非常简单了：
　　
　　String package =document.getProperty(InvokatronDocument.PACKAGE);
　　
　　定制向导
　　
　　请看一看前面的文章中所出现的向导。你应该记得，我们可以通过点击（我们自己添加的）工具条按钮或者菜单项来访问它。图1是它的界面：
　　
　
　　图1：旧的向导

　　
　　它只有一个页面，右上角没有图片。我们想输入更多的信息，并提供一个很好的图片。换句话说，我们希望定制这个向导。
　　
　　我们来分析一下这个向导。请打开InvokatronWizard.java文件。请注意这个类是如何扩展Wizard并实现INewWizard接口的。你应该理解它里面的很多方法。为了定制向导，我们简单地调用或重载其中的某些方法。下面是一些重要的方法：
　　
　　生命周期方法
　　
　　我们应该重载这些方法，把初始化和析构（destruction）代码插入向导中：
　　
　　· Constructor（构造函数）：向导实例化的时候、在Eclipse给它传递信息之前调用。向导的一般初始化实现。通常你希望调用"美化方法"（后面有描述）并设置对话框的默认值。
　　
　　· init(IWorkbench workbench, IStructuredSelection editorSelection): Eclipse调用它为向导提供工作台的信息。请重载它，保存IWorkbench和对象的句柄供以后使用。如果它是一个编辑器向导而不是新向导，我们最好把当前的编辑器选项作为第二个参数。
　　
　　· dispose()：Eclipse调用它执行清理工作。重载它来清除向导使用的资源。
　　
　　· finalize()：清除代码，可能使用dispose()代替。
　　
　　美化方法
　　
　　这些方法都是用于装饰向导窗体的。
　　
　　· setWindowTitle(String title)：设置窗体的标题行字符串。
　　
　　· setDefaultPageImageDescriptor(ImageDescriptor image)：用于提供显示在向导的所有页面右上方的图片。
　　
　　· setTitleBarColor(RGB color)：指定标题栏用什么颜色。
　　
　　按钮方法
　　
　　这些方法控制着向导按钮的实用性和行为。
　　
　　· boolean canFinish()：重载它用于指定Finish（完成）按钮是否激活（根据向导的状态）。
　　
　　· boolean performFinish()：重载它来实现向导的根本的业务逻辑。如果向导没有完成（错误的条件），就返回false。
　　
　　· boolean performCancel()：重载它，在用户点击Cancel（取消）按钮的时候进行清除操作。如果向导不能终止，则返回false。
　　
　　· boolean isHelpAvailable()：重载它用于指定Help（帮助）按钮是否可视。
　　
　　· boolean needsPreviousAndNextButtons()：重载它来指定Previous（前一步）和Next（后一步）按钮是否可视。
　　
　　· boolean needsProgressMonitor()：重载它来指定进度条部件是否可视。当点击Finish按钮调用performFinish()方法的时候，它就会出现。
　　
　　页面方法
　　
　　这些方法控制着页面的外观。
　　
　　· addPages()：向导显示的时候调用。重载它给向导插入新页面。
　　
　　· createPageControls(Composite pageContainer)：Eclipse调用它来实例化所有的向导页面（用前面的addPages()方法已经添加的页面）。重载它给向导添加持续可视的窗体小部件（除页面之外的部件）。
　　
　　· IWizardPage getStartingPage()：重载它来检测哪个页面是向导的第一个页面。
　　
　　· IWizardPage getNextPage(IWizardPage nextPage)：在默认情况下，点击Next按钮将进入addPages()所提供的数组中的下一个页面。你可能希望根据用户选择进入不同的页面。重载它来计算后一个页面。
　　
　　· IWizardPage getPreviousPage(IWizardPage previousPage)：与getNextPage()类似，用于计算前一个页面。
　　
　　· int getPageCount()：检索addPages()添加的页面的数量。在典型情况下，你不必重载它，除非你希望显示页面的数量和形式。
　　
　　其它有用的方法
　　
　　这些都是有用的辅助方法：
　　
　　· setDialogSettings(IDialogSettings settings)：你可以载入对话框的状态，并通过在init()中调用这个方法来设置这些值。在典型情况下，这些设置可以作为向导字段的默认值。请查看DialogSettings类了解更详细的信息。
　　
　　· IDialogSettings getDialogSettings()：当我们需要数据的时候，就调用这个方法来检索它。在performFinish()的对话框的末尾，你再次可以把数据保存到文件中。
　　
　　· IWizardContainer getContainer()：对于检索Shell、运行的后台线程、刷新窗口等非常有用。
　　
　　向导页面方法
　　
　　你已经看到了，向导是由一个或多个页面组成的。这些页面扩展了WizardPage类，并实现了IWizardPage接口。为了定制单独的页面，你必须了解很多方法。下面是一些重要的方法：
　　
　　· Constructor：用于实例化页面。
　　
　　· dispose()：重载它用于实现清除代码。
　　
　　· createControl(Composite parent)：重载它来给页面添加控件。
　　
　　· IWizard getWizard()：用于获取父向导对象。对于调用getDialogSettings()是有用处的。
　　
　　· setTitle(String title)：调用它来设置显示在向导标题区域中的字符串。
　　
　　· setDescription(String description)：调用它来提供标题下面显示的文本内容。
　　
　　· setImageDescriptor(ImageDescriptor image)：调用它来提供页面右上方出现的图片（用于代替默认的图片）。
　　
　　· setMessage(String message)：调用它来显示描述字符串下方的消息文本。这些文本是用于警告或提示用户的。
　　
　　· setErrorMessage(String error)：调用它来高亮度显示描述字符串下方的消息文本。它一般意味着向导不能继续，除非错误被修正。
　　
　　· setPageComplete(boolean complete)：如果为true，Next按钮就可视。
　　
　　· performHelp()：重载它来提供内容敏感的帮助信息。当点击Help按钮的时候向导会调用它。
　　
　　编写向导的代码
　　
　　有了这些方法之后，我们就能够开发出具有极大的灵活性的向导了。我们现在修改以前建立的Invokatron向导，给它添加一个页面来请求用户输入初始的文档数据。我们还给向导添加了一个图片。新代码是粗体的：
　　
　　public class InvokatronWizard extends Wizard
　　implements INewWizard {
　　private InvokatronWizardPage page;
　　private InvokatronWizardPage2 page2;
　　private ISelection selection;
　　
　　public InvokatronWizard() {
　　super();
　　setNeedsProgressMonitor(true);
　　ImageDescriptor image =AbstractUIPlugin.imageDescriptorFromPlugin("Invokatron", "icons/InvokatronIcon32.GIF");
　　setDefaultPageImageDescriptor(image);
　　}
　　
　　public void init(IWorkbench workbench,IStructuredSelection selection) {
　　this.selection = selection;
　　}
　　
　　在构造函数中，我们打开了进度条，并设置了向导的图片。你可以下载并保存下面的图片：
　　
　

　　请把这个图片保存在Invokatron/icons文件夹之下。为了更容易载入这个图片，我们使用了便捷的AbstractUIPlugin.imageDescriptorFromPlugin()方法。
　　
　　请注意：你应该知道，尽管这个向导是INewWizard类型的，但是并非所有的向导都是用于建立新文档的。你可以参考其它一些资料来了解如何建立"独立的"向导的信息。
　　
　　下面是addPages()方法：
　　
　　public void addPages() {
　　page=new InvokatronWizardPage(selection);
　　addPage(page);
　　page2 = new InvokatronWizardPage2(selection);
　　addPage(page2);
　　}
　　
　　在这个方法中，我们添加了一个新页面（InvokatronWizardPage2），我们在后面编辑它。下面是用户点击向导的"完成"按钮的时候执行的一些方法：
　　
　　public boolean performFinish() {
　　//首先把所有的页面数据保存在变量中
　　final String containerName = page.getContainerName();
　　final String fileName =page.getFileName();
　　final InvokatronDocument properties = new InvokatronDocument();
　　properties.setProperty(InvokatronDocument.PACKAGE,page2.getPackage());
　　properties.setProperty(InvokatronDocument.SUPERCLASS,page2.getSuperclass());
　　properties.setProperty(InvokatronDocument.INTERFACES,page2.getInterfaces());
　　
　　//现在调用完成（finish）方法
　　IRunnableWithProgress op =new IRunnableWithProgress() {
　　public void run(IProgressMonitor monitor)
　　throws InvocationTargetException {
　　try {
　　doFinish(containerName, fileName,properties,monitor);
　　} catch (CoreException e) {
　　throw new InvocationTargetException(e);
　　} finally {
　　monitor.done();
　　}
　　}
　　};
　　try {
　　getContainer().run(true, false, op);
　　} catch (InterruptedException e) {
　　return false;
　　} catch (InvocationTargetException e) {
　　Throwable realException =e.getTargetException();
　　MessageDialog.openError(getShell(),"Error",realException.getMessage());
　　return false;
　　}
　　return true;
　　}
　　
　　为了保存数据，我们必须做一个后台事务。该事务是由向导的容器（Eclipse工作台）来执行的，并且必须实现IRunnableWithProgress接口，包含（唯一）一个run()方法。传递进来的IProgressMonitor允许我们报告事务的进度。实际的数据保存工作在一个辅助方法（doFinish()）中进行：
　　
　　private void doFinish(String containerName,String fileName, Properties properties,
　　IProgressMonitor monitor)
　　throws CoreException {
　　// 建立一个示例文件
　　monitor.beginTask("Creating " + fileName, 2);
　　IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
　　IResource resource = root.findMember(new Path(containerName));
　　if (!resource.exists() || !(resource instanceof IContainer)) {
　　throwCoreException("Container \"" + containerName + "\" does not exist.");
　　}
　　IContainer container =(IContainer)resource;
　　final IFile iFile = container.getFile(new Path(fileName));
　　final File file =iFile.getLocation().toFile();
　　try {
　　OutputStream os = new FileOutputStream(file, false);
　　properties.store(os, null);
　　os.close();
　　} catch (IOException e) {
　　e.printStackTrace();
　　throwCoreException("Error writing to file " + file.toString());
　　}
　　
　　//确保项目已经刷新了，该文件在Eclipse API 之外建立
　　container.refreshLocal(IResource.DEPTH_INFINITE, monitor);
　　
　　monitor.worked(1);
　　
　　monitor.setTaskName("Opening file for editing...");
　　getShell().getDisplay().asyncExec(new Runnable() {
　　public void run() {
　　IWorkbenchPage page =PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
　　try {
　　IDE.openEditor(page,iFile,true);
　　} catch (PartInitException e) {
　　}
　　}
　　});
　　monitor.worked(1);
　　}
　　
　　我们还做了很多工作：
　　
　　· 我们检索了自己希望保存文件的位置（用Eclipse的IFile类）。
　　
　　· 我们还获取了该File。
　　
　　· 我们把属性保存到了这个位置。
　　
　　· 接着我们让Eclipse工作台刷新项目，这样就可以显示该文件了。
　　
　　· 我们最后调度了一个事务，它在以后执行。这个事务包括在编辑器中打开那个新文件。
　　
　　· 在整个过程中，我们通过调用IProgressMonitor对象（它是作为参数传递进来的）的方法来提示用户目前的进展情况。
　　
　　最后一个方法是一个辅助的方法，当该文件保存失败的时候，它在向导中显示错误信息：
　　
　　private void throwCoreException(String message) throws CoreException {
　　IStatus status =new Status(IStatus.ERROR,"Invokatron",IStatus.OK,message,null);
　　throw new CoreException(status);
　　}
　　}
　　
　　向导可以捕获CoreException异常，接着可以把它所包含的Status对象显示给用户看。向导不会被关闭。
　　
　　编写新的向导页面的代码
　　
　　下一步，我们编写InvokatronWizardPage2。它的整个类都是全新的：
　　
　　public class InvokatronWizardPage2 extends WizardPage {
　　private Text packageText;
　　private Text superclassText;
　　private Text interfacesText;
　　
　　private ISelection selection;
　　
　　public InvokatronWizardPage2(ISelection selection) {
　　super("wizardPage2");
　　setTitle("Invokatron Wizard");
　　setDescription("This wizard creates a new"+" file with *.invokatron extension.");
　　this.selection = selection;
　　}
　　
　　private void updateStatus(String message) {
　　setErrorMessage(message);
　　setPageComplete(message == null);
　　}
　　
　　public String getPackage() {
　　return packageText.getText();
　　}
　　public String getSuperclass() {
　　return superclassText.getText();
　　}
　　public String getInterfaces() {
　　return interfacesText.getText();
　　}
　　
　　上面的构造函数设置了页面的标题（在标题栏下方高亮度显示）和描述（在页面标题的下方显示）。我们还有一些辅助方法。 updateStatus处理页面特定的错误信息的显示。如果没有错误信息，就意味着页面完成了；因此，"下一步"按钮就可以使用了。还有数据字段内容的getter（获取）方法。下面是createControl()方法，它建立了页面的所有可视化组件：
　　
　　public void createControl(Composite parent) {
　　Composite controls =new Composite(parent, SWT.NULL);
　　GridLayout layout = new GridLayout();
　　controls.setLayout(layout);
　　layout.numColumns = 3;
　　layout.verticalSpacing = 9;
　　
　　Label label =new Label(controls, SWT.NULL);
　　label.setText("&amp;Package:");
　　
　　packageText = new Text(controls,SWT.BORDER | SWT.SINGLE);
　　GridData gd = new GridData(GridData.FILL_HORIZONTAL);
　　packageText.setLayoutData(gd);
　　packageText.addModifyListener(
　　new ModifyListener() {
　　public void modifyText(ModifyEvent e) {
　　dialogChanged();
　　}
　　});
　　
　　label = new Label(controls, SWT.NULL);
　　label.setText("Blank = default package");
　　
　　label = new Label(controls, SWT.NULL);
　　label.setText("&amp;Superclass:");
　　
　　superclassText = new Text(controls,SWT.BORDER | SWT.SINGLE);
　　gd = new GridData(GridData.FILL_HORIZONTAL);
　　superclassText.setLayoutData(gd);
　　superclassText.addModifyListener(new ModifyListener() {
　　public void modifyText(ModifyEvent e) {
　　dialogChanged();
　　}
　　});
　　
　　label = new Label(controls, SWT.NULL);
　　label.setText("Blank = Object");
　　
　　label = new Label(controls, SWT.NULL);
　　label.setText("&amp;Interfaces:");
　　
　　interfacesText = new Text(controls,SWT.BORDER | SWT.SINGLE);
　　gd = new GridData(GridData.FILL_HORIZONTAL);
　　interfacesText.setLayoutData(gd);
　　interfacesText.addModifyListener(
　　new ModifyListener() {
　　public void modifyText(ModifyEvent e) {
　　dialogChanged();
　　}
　　});
　　
　　label = new Label(controls, SWT.NULL);
　　label.setText("Separated by ','");
　　
　　dialogChanged();
　　setControl(controls);
　　}
　　
　　为了编写这段代码，你必须了解SWT（请你自己查看一些这方面的资料）。基本上，这个方法建立了标签和字段，并把它们放置到网格布局上。字段发生改变的时候，就调用dialogChanged()来验证它的数据：
　　
　　private void dialogChanged() {
　　String aPackage = getPackage();
　　String aSuperclass = getSuperclass();
　　String interfaces = getInterfaces();
　　
　　String status = new PackageValidator().isValid(aPackage);
　　if(status != null) {updateStatus(status);
　　return;
　　}
　　
　　status = new SuperclassValidator().isValid(aSuperclass);
　　if(status != null) {updateStatus(status);
　　return;
　　}
　　
　　status = new InterfacesValidator().isValid(interfaces);
　　if(status != null) {updateStatus(status);
　　return;
　　}
　　
　　updateStatus(null);
　　}
　　
　　}
　　
　　这个工作是在三个工具类--PackageValidator、SuperclassValidator和 InterfacesValidator的帮助下完成的。接下来我们编写这些类。
　　
　　验证类
　　
　　验证可以在插件的用户输入数据的任何部分中进行。因此，把验证代码放入可重复使用的类中是有意义的，这样就不用把它复制到多个位置。下面是一个验证类的例子。
　　
　　public class InterfacesValidator implements ICellEditorValidator
　　{
　　public String isValid(Object value)
　　{
　　if( !( value instanceof String) )
　　return null;
　　
　　String interfaces = ((String)value).trim();
　　if( interfaces.equals(""))
　　return null;
　　
　　String[] interfaceArray = interfaces.split(",");
　　for (int i = 0; i &lt; interfaceArray.length; i++)
　　{
　　IStatus status = JavaConventions.validateJavaTypeName(interfaceArray[i]);
　　if (status.getCode() != IStatus.OK)
　　return "Validation of interface " + interfaceArray[i] + ": " + status.getMessage();
　　}
　　return null;
　　}
　　}
　　
　　其它的验证类与它非常类似。
　　
　　Eclipse类库中的另外一个极好的类是JavaConventions，它为我们验证数据！它包含了很多验证方法，例如：
　　
　　· validateJavaTypeName() 检查类和接口的名称。
　　
　　· validatePackageName() 检查程序包的名称。
　　
　　· validateFieldName() 检查数据成员的名称。
　　
　　· validateMethodName() 检查方法的名称。
　　
　　· validateIdentifierName() 检查变量的名称。
　　
　　现在我们不需要ICellEditorValidator接口，但是在以后的文章中，我们是需要它的。
　　
　　结果
　　
　　到目前为止，我们拥有了一个可以工作的向导，它拥有一张图片和两个页面，第二个页面建立了原来的Invokatron文档。图2显示了结果：
　　
　

　　2：定制的向导
　　
　　闪亮的发明
　　
　　我们可以看到，通常是数据驱动应用程序的。外表（Presentation）也是很重要的。丑陋的发明难以出售，但是闪亮的发明可能容易出售。但是数据是我们这些程序员实现的非常本质的东西。
　　
　　在本文中，我们首先决定了自己将处理的数据。然后，我们以定制向导的方式来获取这些数据。下一篇文章将继续讲解显示的问题，包括定制的编辑器和属性页面。</pre>
<img src ="http://www.blogjava.net/xixidabao/aggbug/47164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-20 13:18 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/20/47164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>尝鲜：最新版Eclipse3.1及插件介绍 </title><link>http://www.blogjava.net/xixidabao/archive/2006/05/03/44486.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 03 May 2006 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/03/44486.html</guid><description><![CDATA[
		<br />　　笔者使用Eclipse有些时日了，从Eclipse2.0使用到现在，今天从　http://www.eclipse.org岗站上下载了最新版的Eclipse3.1，使用之后犹感它的强大，Eclipse在平时的工作中给笔者带来了非常的方便，更兼 如此今天 使用Eclipse3.1后更感觉它的得心和应手，使人耳目一新，因此笔记将它的新特性及使用后感写出来。希望 Eclipse能给更多的JAVA和C开发者带来工作中的方便。<br />　　<br />　　<b>一、新特性</b><br />　　<br />　　1.速度更快，效率更高。我们打开Eclipse3.1一看，包括启动，开发的速度都 比3.0快很多了，我大约测试一下，同一个环境下，比3.0启动快了几十秒。<br />　　<br />　　2.组件功能更强大，并带有非常强大图形编辑功能，支持可视化的Applet,Swing,AWT等图形组件的开发。<br />　　<br />　　3.支持EJB3.0.<br />　　<br />　　4.支持UML2.0，并带有UML2.0模型编辑器。<br />　　<br />　　5.带有商业智能的报表项目和报表开发。<br />　　<br />　　6.支持新版的AOP插件用于可视化的开发AOP应用程序和调试AOP的应用程序。<br />　　<br />　　7.不像3.0一定需要JDK5.0的JRE，它只需要JDK1.4.1以上就可以了。<br />　　<br />　　<b>二、各插件介绍</b><br />　　<br />　　1.JDT（Java Development Tools）:Java设计工具,最新版3.1RC4,需求Eclipse3.1支持.<br />　　<br />　　2.PDE（Plugin Development Environment）:插件设计环境，用于设计自定义插件,最新版3.1RC4,需求Eclipse3.1支持&amp; nbsp;<br />　　<br />　　3.Platform: Eclipse的核心运行平台，目前最新版3.1.<br />　　<br />　　4. C/C++ IDE: 一看就知道，用于设计C/C++项目。<br />　　<br />　　5.EMF（Eclipse Modeling Framework）:Eclipse模型框架，目前最新版2.1.0,支持 Eclipse3.1及更新版<br />　　<br />　　6.GEF (Graphical Editor Framework):图形编辑框架，用于辅助图形设计，目前最新版3.1RC4,支持Eclipse3.1.<br />　　<br />　　7、UML2: UML编辑器，最新版1.1RC4,支持Eclipse3.1,需求EMF2.1RC1<br />　　<br />　　8.VE(Visual Editor):可视化图形编辑组件，用于提供AWT/SWT/Swing的图形编辑，最新版1.1M2，支持Eclipse3.1.&lt; br&gt;<br />　　<br />　　9. J2EE Standard Tools:用于设计J2EE应用程序的插件，最新版1.0M5,支持Eclipse3.1. &amp; nbsp;<br />　　<br />　　10.WST - Web Standards Tools: 用于设计Web应用程序的插件，最新版1.0M5,支持Eclipse3.1.<br />　　<br />　　11.Eclipse Test and Performance Tools Platform：用于调试，单元测试和测试项目的插件。<br />　　<br />　　12.Business Intelligence and Reporting Tools (BIRT)：商业智能和商业报表开发插件，它包括Chart Engine（图形引擎），Report Framework(报表框架），Runtime ENV(运行时环境）。<br />　　<br />　　13. AJDT - AspectJ Development Tools：用于开发AOP（面向方面编程）的开发ECLIPSE插件。<br />　　<br />　　14.AspectJ: 用于开发AOP的开发环境。<br />　　<br />　　15.CME - Concern Manipulation Environment:用于开发AOP的一组可视化工具插件。<br />　　<br />　　<b>三、下载和安装</b><br />　　<br />　　1.下载，从Eclipse的网站http://www.eclipse.org/downloads下载上述插件。并解压压缩。<br />　　<br />　　2.安装有多种方法，我推荐用Eclipse环境中Help菜单中的安装并更新。<br />　　<br />　　（1）将解压后的Eclipse-sdk-platform-win32-3.1目录挎贝一个你要做为安装的目录如C：\&amp; nbsp;<br />　　<br />　　（2）将JDK1.4.1及以上的JDK的JRE挎贝到eclipse.exe所在的目录。 &amp; nbsp;<br />　　<br />　　（3）点击eclipse.exe运行，启动eclipse<br />　　<br />　　（4）我们发现非常快的速度就启动了eclipse3.1,莘进入它一个欢迎界面。<br />　　<br />　　（5）我们选择Help/SoftWare Update/Search and Installer菜单，选择。<br />　　<br />　　（6）依提示一个个完成安装。<br />　　<br />　　<b>四、总结</b><br />　　<br />　　&amp; nbsp;　Eclipse是一款免费的IDE，支持JAVA和C/C++开发，非常方便与快捷，有强大而又灵活扩展的插件功能，目前Borland也加入该社团的开 发，因此我们相信eclipse将成为IDE 的饺饺者了。 <br /><br /><br /><img src ="http://www.blogjava.net/xixidabao/aggbug/44486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-03 23:57 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/03/44486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Eclipse进行可视化Java界面设计(1) </title><link>http://www.blogjava.net/xixidabao/archive/2006/05/03/44485.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 03 May 2006 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/03/44485.html</guid><description><![CDATA[
		<br />　　　<img src="/imgfiles/2005.4.2.9.44.23.1.jpg" /><br />　　<b>前言</b><br />　　<br />　　最近，Eclipse开源项目终于推出了期待已久的Visual Editor Project(VEP)。VE项目使得功能强大的eclipse平台在java开发方面又增加了一个可视化java组件开发利器。它让java开发者再也不用依赖其它的IDE产品来做GUI界面方面的工作。所有的开发，从应用程序界面到业务逻辑的开发，现在都可以在eclipse平台上完成。本文将引导开发者如何安装配置并使用Visual Editor。<br />　　<br />　　关于Visual Editor<br />　　<br />　　开始介绍之前，来看一个笔者用Visual Editor(以下简称VE)设计的一个java程序界面：<br />　　　<img src="/imgfiles/2005.4.2.9.44.32.2.jpg" /><br />　　怎么样，其可视化的界面设计，一点也不逊于其它的Java可视化界面开发工具。<br />　　<br />　　Visual Editor是一个开源的eclipse编辑器。它同JDT、PDE等其它eclipse的工具项目一样，是一个全新的eclipse工具项目。它可以进行可视化的编辑java GUI程序，也能编辑可视化的Java Bean组件。它能与eclipse的Java Editor集成在一起，当在Visual Editor中编辑图形界面时，会立即反馈到java Editor中的代码。反之亦然。<br />　　<br />　　VE是一个可视化开发的一个framework，当前版本的VE是0.5.0RC1版，本版本的VE支持Swing和AWT的可视Java组件开发。由于这个framework设计的具有通用性，它也可以很容易的实现C++或其它语言下可视化开发。其将来的版本(从1.0开始)，将会支持SWT的开发。更多的关于Visual Editor的信息，请看参考资料的相关链接。<br />　　<br />　　<b>下载与安装</b><br />　　<br />　　由于Visual Editor是用纯java编写的，所以它应该可以在任何操作系统上运行。但当前的VE版本是0.5.0RC1，只在windows和linux平台上经过测试。所以如果你使用的是这两种操作系统之外的其它操作系统，你应该先阅读VE的readme文件，安装和使用VE前，必须先安装以下版本的eclipse和相关支持类库：<br />　　<br />　　Eclipse build 2.1.2 (build page) (download zip)<br />　　EMF build 1.1.1: (build page) (download zip)<br />　　GEF Build 2.1.2: (build page) (download zip)<br />　　<br />　　为了方便中国的开发者，eclipse也提供了一个中文语言包，下载安装后，elcipse环境将变成全中文的界面。在本文中，笔者用的eclipse也安装了此中文语言包。之后就可以从以下地址下载Visual Editor了：<br />　　<br />　　http://download.eclips.org/vep….<br />　　<br />　　下载后的VE是一个zip档案，请将其压缩包中plugins和features目录下的内容解压到eclipse安装目录的相应目录中即可。如果你的eclipse是运行着的，请关闭并重新启动eclipse。<br />　　<br />　　<b>开始一个设计任务</b><br />　　<br />　　现在，所有程序安装完成，笔者将用一个例子，来讲解Visual Editor的使用。在这个例子中，笔者要设计一个邮件发送面板，下面是它的草图：<br />　　　<img src="/imgfiles/2005.4.2.9.44.48.3.jpg" /><br />　　此面板包括发送人，接收人，邮件主题，邮件内容以及发送和清除按钮，<br />　　<br />　　<b>进入Visual Editor</b><br />　　<br />　　启动eclipse平台。刚开始，你可能觉得eclipse并没有什么变化。先别急，请新建一个项目，点击"文件"菜单下的"新建"子菜单，选择并建立一个新的"java项目"。然后在工具栏上的"新建Java类" 图标上，点击右边的小箭头　<img src="/imgfiles/2005.4.2.9.44.56.4.jpg" />，将展开如下图的菜单：<br />　　　<img src="/imgfiles/2005.4.2.9.45.4.5.jpg" /><br />　　在此菜单上，多了一个"Visual Calss"的子菜单,这就是进入Visual Editor的入口之一。点击"Visual Class"，弹出如下的对话框：<br />　　　<img src="/imgfiles/2005.4.2.9.45.13.6.jpg" /><br />　　在此对话框中，要求输入类的名称（如标记○1）位置），在这里我们输入"MessagePanel"，以及你想要继承的可视类（如标记○2位置）。你可以选择继承来自swing或AWT的任何界面组件，如要继承其它类型的类，请选择"other"并点击"浏览"按钮来选择你要继承的类。在此处，我们选择"panel"和Swing选项，继承JPanel，然后点击"完成"按钮，大家就可以见到Visual Editor的界面了：<br />　　　<img src="/imgfiles/2005.4.2.9.45.22.7.jpg" /><br />　　由于eclipse工作台高度的可定制性，读者现在看到的界面并非VE初始的布局，而是经过笔者按喜好的方式重新布局过的透视图，但是这并不会影响读者理解本文内容。<br />　　<br />　　如图中1所示，是VE的工具面板，提供"选取"、"框选"等选择工具。还有Swing组件，Swing容器，Swing菜单以及AWT控件设计工具。在面板下方有"Design"和"Source"两个页签，用来切换设计界面和Java源代码视图。<br />　　<br />　　图中2是VE的工具栏，包括工具面板中的一些常用按钮。<br />　　<br />　　图中3是"Java Beans"视图和"属性"视图，两个视图可以切换显示。"Java Beans"视图用树形结构即时显示设计中用到的各种Java Bean组件层次。而"属性"视图显示显示当前所选中的Java bean组件的属性值列表，你可以在此列表中编辑各项Java Bean的属性值。<br />　　图中灰色矩形区域即是我们最开始选择的JPanel，所有的工作就从它开始。<br />　　<br />　　<b>摆设Swing组件</b><br />　　<br />　　做过Swing GUI界面设计的人都知道，Java应用程序界面上的元素位置是用LayoutManager来管理的。JPanel的预设布局管理器是FlowLayout。VE目前支持所有的传统的布局管理器（这里所指的传统布局管理器是指JDK1.4之前的布局管理器。可惜的是VE目前还不支持从JDK1.4开始有的SpringLayout）。<br />　　<br />　　要设置JPanel的layout，请先在设计界面中选中JPanel，再切换到"属性"视图，找到"layout"属性，如下图所示：<br />　　　<img src="/imgfiles/2005.4.2.9.45.33.8.jpg" /><br />　　图中显示了JPanel的预设LayoutManager。在"layout"属性的右边，可以通过点击组合框来指定不同类型的LayoutManager。不同的LayoutManager会在属性编辑器中显示不同的参数，如果选择GridLayout，属性编辑器中的layout属性将显示另外几种不同的参数，如下图如示：<br />　　<img src="/imgfiles/2005.4.2.9.45.42.9.jpg" /><br /><br /><br /><img src ="http://www.blogjava.net/xixidabao/aggbug/44485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-03 23:56 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/03/44485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Eclipse进行可视化Java界面设计(2) </title><link>http://www.blogjava.net/xixidabao/archive/2006/05/03/44484.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 03 May 2006 15:55:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/03/44484.html</guid><description><![CDATA[
		<br />　　先前的FlowLayout的三个参数alignment, horizontal gap和vertical gap变成了GridLayout的另外四种参数：columns, horizontal gap, rows, vertical gap。<br />　　<br />　　为了方便设计，笔者在这个例子中将采用null，即不用任何LayoutManager来设计界面。<br />　　<br />　　布局设置好后，就可以在JPanel上摆置各种Swing组件了。按照我们最开始设计的草图，界面上要摆上四个Label：From, To, Subject, Message。以及四个文本组件，其第四个应该是TextArea, 用于编辑多行文本。我们在工具面板上选好相关组件，然后在JPanel上拖选出一个矩形，组件即按相应大小和位置显示在此矩形区域。再在"属性"视图中编辑每个JLabel和JButton的"text"属性为相应的值。现在来看看下面笔者"画"出来的界面：<br />　　　<img src="/imgfiles/2005.4.2.9.46.57.10.jpg" /><br />　　看看，设计的如何？笔者不是画家，"画"出来的界面显得有些凌乱。没关系，VE也提供一些工具按钮来让我们调整各个组件的位置。请点击VE工具栏上的"Show alignment window"按钮：<br />　　　<img src="/imgfiles/2005.4.2.9.47.24.11.jpg" /><br />　　显示如下图的视窗：<br />　　　<img src="/imgfiles/2005.4.2.9.47.32.12.jpg" /><br />　　通过此视窗，可以将所选组件向上下左右各个方向对齐。还可以使所选组件具有相同高度和宽度。来看看下图经过调整位置后的界面布局：<br />　　　<img src="/imgfiles/2005.4.2.9.47.39.13.jpg" /><br />　　现在看起来是不是美观多了？<br />　　<br />　　<b>添加事件处理</b><br />　　<br />　　经过前面的步骤，VE的可视化设计的任务就基本上完成了。在我们设计的界面中，有"Send"和"Clear"按钮。我们再来看看VE是如何为它们添加事件处理的。<br />　　<br />　　在设计界面的"Send"按钮上点击鼠标右键，弹出菜单，如下图：<br />　　　<img src="/imgfiles/2005.4.2.9.47.48.14.jpg" /><br />　　在"Event"菜单项中，可以看到一个"actionPerformed"事件。如果要添加其它类型的事件，可以点击"Add Events"选择其它类型的事件。我们点击"actionPerformed"事件后，在"Java Beans"视图的"jButton-"Send""组件下面，多了一个"actionPerformed"事件类型，如下图所示：<br />　　　<img src="/imgfiles/2005.4.2.9.47.56.15.jpg" /><br />　　在"Java Beans"视图中，选中"actionPerformed"事件，再VE的窗口中，从"Design"切换到"Source"视图。<br />　　　<img src="/imgfiles/2005.4.2.9.48.6.16.jpg" /><br />　　在上图标记1的代码区域，就是我们刚刚添加的按钮事件。笔者在事件中调用了一个send方法，如图中标记2代码区域。具体的发送邮件的代码笔者在这里就不实现了。<br />　　<br />　　同样的方法，一样可以为另一个按钮"Clear"添加事件。<br />　　<br />　　<b>在程序中使用自定义的组件</b><br />　　<br />　　在前面我们设计好了自己的Java组件，现在我们来看看如何在自己的程序中――一个窗口中来调用这个组件。<br />　　<br />　　使用前面介绍的方法，在工具栏上点击"新建Java类"按钮，建立一个JFrame的Visual Class类。你也可以在通过菜单"文件"-&gt;"新建"-&gt;"Visual Class"来寻一个JFrame类。在这里，我们将这个类命名为"MyApp"。<br />　　<br />　　当VE窗口出现时，可以看到一个空白的JFrame显示在设计视图中。此时，点击VE的工具面板上的" Choose Bean"按钮，然后在弹出的对话框中输入我们设计的Java组件的类名"MessagePane"，再点击"确定"。这时，当我们的鼠标移到JFrame上时，JFrame会用绿色的线条切分成五份，如下图所示：<br />　　<img src="/imgfiles/2005.4.2.9.48.16.17.jpg" /><br />　　这是因为JFrame的预设LayoutManager是BorderLayout，在VE中，如果在工具面板上选好Java组件，当鼠标移到有特定LayoutManager的容器组件上时（在上图中容器组件是一个JFrame），VE会用适当的形式指示你当前鼠标悬停的位置。在上图在VE告诉我们现在处在BorderLayout的中心位置，此时再在该位置点击一次，我们选好的Java组件即安放到此位置。<br />　　<br />　　用VE设计好程序界面，就可以切换到"Source"视图进行具体的代码的编码了。在此我们就不累述了。<br />　　<br />　　<b>定制VE的环境</b><br />　　<br />　　之前的讲解，大家学到了如何用VE来进行可视化的Java界面设计。为了适应不同的开发者，VE也提供了一些选项来让开发者设计自己喜好的VE环境。<br />　　<br />　　请打开菜单"窗口"-&gt;"首选项"-&gt;"Java"-&gt;"Visual Editor"，此时出现VE的各种首选项界面。由于笔者安装的eclipse中文语言包早于VE发布，所以此界面仍然是英文界面。在这里，VE的首选项分为三类："Appearance"，"Code Generation"，"Pattern Style"。下面结合图形分别介绍：<br />　　<br />　　1．外观(Appearance)设置：<br />　　<br />　　此面板中可以设置这此内容：<br />　　<br />　　(1) 设置可视编辑器和源代码编辑器的布局，一种是上下分隔的布局，另一种是用页答进行切换的布局(即本文例图中所见到的样式)。<br />　　<br />　　(2) 设置是否显示"属性"视图和"Java Beans"视图。<br />　　<br />　　(3) 设置设计时Swing的界面风格。<br />　　<br />　　2．代码生成(Code Generation)设置<br />　　<br />　　此面板包括以下内容：<br />　　<br />　　(1) 设置是否为新表达式生成注释和try{}…catch()块。<br />　　<br />　　(2) 设置可视设计界面和代码编辑器之间的代码同步时间。<br />　　<br />　　3．代码模板风格(Pattern Style)设置<br />　　<br />　　此面板包括以下内容：<br />　　<br />　　(1) VE所用的存取Java Bean的代码风格。<br />　　<br />　　(2) VE初始化时尝试使用的初始化方法。VE目前已提供了对Jbuilder、NetBean等其它IDE产品可视编辑器生成的Java组件代码初始化方式的支持。<br />　　<br />　　<b>总结</b><br />　　<br />　　行文至此，我们从VE的安装到Java组件设计以及VE环境的设置，基本上已对eclipse的全新工具Visual Editor作了一个全面的了解。有了Visual Editor，我们所有的开发工作，从图形用户界面到业务逻辑，全部可以在eclipse平台上完成。 <br /><br /><br /><img src ="http://www.blogjava.net/xixidabao/aggbug/44484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-03 23:55 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/03/44484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT代码研究(2) </title><link>http://www.blogjava.net/xixidabao/archive/2006/05/03/44483.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 03 May 2006 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/03/44483.html</guid><description><![CDATA[
		<br />　　import org.eclipse.swt.*;<br />　　import org.eclipse.swt.widgets.*;<br />　　public class SWTHello {<br />　　public static void main(String[] args) {<br />　　/*<br />　　* Display的实例用于管理SWT与底层操作系统的连接，其<br />　　* 最重要的功能是根据平台的事件处理模型实现SWT的event<br />　　* loop，一般来说，只要一个Display的实例就可以了。<br />　　* 注意，在创建任何window前（Shell实例）需创建Display实例，<br />　　* 在Shell实例关闭时除掉Display实例<br />　　*/<br />　　Display display = new Display();<br />　　<br />　　/*<br />　　*Shell是作为主窗口 <br />　　*/<br />　　Shell shell = new Shell(display);<br />　　/*<br />　　* SWT.NONE是Sytle bit，用于表明widget的style<br />　　*/<br />　　Label label = new Label(shell,SWT.NONE);<br />　　label.setText("Hello");<br />　　shell.pack();<br />　　label.pack();<br />　　shell.open();<br />　　while(!shell.isDisposed())<br />　　{<br />　　if(!display.readAndDispatch())<br />　　display.sleep();<br />　　}<br />　　shell.dispose();<br />　　}<br />　　}<br />　　<br />　　<b>关于Resource的Disposal</b><br />　　1、如果你用构造函数创建了widget或者graphic对象，当你不需要时你必须手动地dispose掉它;<br />　　2、如果你不是使用构造函数得到这个widget或者graphic对象，由于不是你allocate的，你不需要手动来dispose掉它;<br />　　3、如果你传递一个widget或者graphic对象的reference给另一个对象，那么你必须小心，不要在它仍在被使用中就dispose掉它;<br />　　4、当你close掉一个shell，那么这个shell及其子widget会被递归dispose掉的，虽然你不需再dispose掉那些widget，但是你必须free掉与这些widget相关的图像资源;<br />　　5、如果在一个widget的生命期中创建了graphic对象，可以通过注册一个dispose listener来free这个graphic对象，不过数据对象如Rectangle和Point没有使用操作系统资源，不用手动dispose(它们也没有dispose方法). <br /><br /><br /><img src ="http://www.blogjava.net/xixidabao/aggbug/44483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-03 23:50 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/03/44483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java桌面应用程序设计：SWT 简介 </title><link>http://www.blogjava.net/xixidabao/archive/2006/05/03/44482.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 03 May 2006 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/03/44482.html</guid><description><![CDATA[&lt;!--转载-&gt;<br /><br /><br />　　Java语言的声望和它在桌面应用程序（GUI程序）所取得的成就显然极不相符，至今仍然很少能看到非常成功Java桌面程序。虽然有JBuilder，Netbean，JProbe等大型软件作为代表，但这仍不能证明Java的GUI程序是成功的：它们的外观总是和同一操作系统平台下的其它软件显得格格不入。对机器配置的需求也似乎永无止境，这使得它们只能被一些总是拥有当前最高性能PC的程序员们所容忍，或是那些不在乎金钱和时间的专业用户所接受。对绝大多数计算机使用者来说，AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget Toolkit（SWT）或许是Java这一噩梦的终结者，广大Java程序员终于可以开发出高效率的GUI程序，它们拥有标准的外观，几乎没有人能看出你的程序是用Java写出来的，更为重要的是，这些程序是跨平台的。<br />　　<br />　　SWT本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。或许是无心插柳，或是有意为之，至今为止，SWT无论是在性能和外观上，都超越了SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到了2.1版本，SWT已经十分稳定。这里指的稳定应该包含两层意思：<br />　　<br />　　一是指性能上的稳定，其中的关键是源于SWT的设计理念。SWT最大化了操作系统的图形构件API，就是说只要操作系统提供了相应图形的构件，那么SWT只是简单应用JNI技术调用它们，只有那些操作系统中不提供的构件，SWT才自己去做一个模拟的实现。可以看出SWT的性能上的稳定大多时候取决于相应操作系统图形构件的稳定性。<br />　　<br />　　另一个稳定是指SWT API包中的类、方法的名称和结构已经少有改变，程序员不用担心由于Eclipse组织开发进度很快（Eclipse IDE每天都会有一个Nightly版本的发布），而导致自己的程序代码变化过大。从一个版本的SWT更新至另一版本，通常只需要简单将SWT包换掉就可以了。<br />　　<br />　　<b>第一个SWT程序</b><br />　　下面让我们开始一个SWT程序。（注意：以下的例子和说明主要针对Windows平台，其它的操作系统应该大同小异）。首先要在Eclipse安装文件中找到SWT包，Eclipse组织并不提供单独的SWT包下载，必须下载完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse开发环境的一个插件形式存在，可以在$｛你的eclipse安装路径｝\plugins路径下的众多子目录下去搜索SWT.JAR文件，在找到的JAR文件中包含了SWT全部的Java类文件。因为SWT应用了JNI技术，因此同时也要找到相对应的JNI本地化库文件，由于版本和操作平台的不同，本地化库文件的名称会有些差别，比如SWT-WIN32-2116.DLL是Window平台下Eclipse Build 2116的动态库，而在Unix平台相应版本的库文件的扩展名应该是.so，等等。注意的是，Eclipse是一个开放源代码的项目，因此你也可以在这些目录中找到SWT的源代码，相信这会对开发很有帮助。下面是一段打开空窗口的代码(只有main方法)。<br />　　<br />　　import com.e2one.example;<br />　　public class OpenShell{<br />　　public static void main(String [] args) {<br />　　Display display = new Display();<br />　　Shell shell = new Shell(display);<br />　　shell.open();<br />　　// 开始事件处理循环，直到用户关闭窗口<br />　　while (!shell.isDisposed()) {<br />　　if (!display.readAndDispatch())<br />　　display.sleep();<br />　　}<br />　　display.dispose();<br />　　}<br />　　}<br />　　<br />　　确信在CLASSPATH中包括了SWT.JAR文件，先用Javac编译例子程序。编译无错后可运行java -Djava.library.path=${你的SWT本地库文件所在路径} com.e2one.example.OpenShell，比如SWT-WIN32-2116.DLL件所在的路径是C:\swtlib，运行的命令应该是java -Djava.library.path=c:\swtlib com.e2one.example.OpenShell。成功运行后，系统会打开了一个空的窗口。<br />　　<br />　　<b>剖析SWT API</b><br />　　下面再让我们进一步分析SWT API的组成。所有的SWT类都用org.eclipse.swt做为包的前缀，下面为了简化说明，我们用*号代表前缀org.eclipse.swt，比如*.widgets包，代表的是org.eclipse.swt.widgets包。<br />　　<br />　　我们最常用的图形构件基本都被包括在*.widgets包中，比如Button，Combo，Text，Label，Sash，Table等等。其中两个最重要的构件当数Shell和Composite。Shell相当于应用程序的主窗口框架，上面的例子代码中就是应用Shell构件打开一个空窗口。Composite相当于SWING中的Panel对象，充当着构件容器的角色，当我们想在一个窗口中加入一些构件时，最好到使用Composite作为其它构件的容器，然后再去*.layout包找出一种合适的布局方式。SWT对构件的布局也采用了SWING或AWT中Layout和Layout Data结合的方式，在*.layout包中可以找到四种Layout和与它们相对应的布局结构对象（Layout Data）。在*.custom包中，包含了对一些基本图形构件的扩展，比如其中的CLabel，就是对标准Label构件的扩展，上面可以同时加入文字和图片，也可以加边框。StyledText是Text构件的扩展，它提供了丰富的文本功能，比如对某段文字的背景色、前景色或字体的设置。在*.custom包中也可找到一个新的StackLayout布局方式。<br />　　<br />　　SWT对用户操作的响应，比如鼠标或键盘事件，也是采用了AWT和SWING中的Observer模式，在*.event包中可以找到事件监听的Listener接口和相应的事件对象，例如常用的鼠标事件监听接口MouseListener，MouseMoveListener和MouseTrackListener，及对应的事件对象MouseEvent。<br />　　<br />　　*.graphics包中可以找到针对图片、光标、字体或绘图的API。比如可通过Image类调用系统中不同类型的图片文件。通过GC类实现对图片、构件或显示器的绘图功能。<br />　　<br />　　对不同平台，Eclipse还开发了一些富有针对性的API。例如，在Windows平台，可以通过*.ole.win32包很容易的调用ole控件，这使Java程序内嵌IE浏览器或Word、Excel等程序成为可能！<br />　　<br />　　<b>更复杂的程序</b><br />　　下面让我们展示一个比上面例子更加复杂一些的程序。这个程序拥有一个文本框和一个按键，当用户点击按键的时候，文本框显示一句欢迎信息。<br />　　<br />　　为了文本框和按键有比较合理的大小和布局，这里采用了GradLayout布局方式。这种布局是SWT中最常用也是最强大的布局方式，几乎所有的格式都可能通过GradLayout去达到。下面的程序也涉及到了如何应用系统资源(Color)，以及如何释放系统资源。<br />　　<br />　　private void initShell(Shell shell) {<br />　　//为Shell设置布局对象<br />　　GridLayout gShellLay = new GridLayout();<br />　　shell.setLayout(gShellLay);<br />　　//构造一个Composite构件作为文本框和按键的容器<br />　　Composite panel = new Composite(shell,SWT.NONE);<br />　　//为Panel指定一个布局结构对象。<br />　　这里让Panel尽可能的占满Shell，<br />　　也就是全部应用程序窗口的空间。<br />　　GridData gPanelData = new GridData(GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);<br />　　panel.setLayoutData(gPanelData);<br />　　//为Panel也设置一个布局对象。文本框和按键将按这个布局对象来显示。<br />　　GridLayout gPanelLay = new GridLayout();<br />　　panel.setLayout(gPanelLay);<br />　　//为Panel生成一个背景色<br />　　final Color bkColor = new Color(Display.getCurrent(),200,0,200);<br />　　panel.setBackground(bkColor);<br />　　//生成文本框<br />　　final Text text = new Text(panel,SWT.MULTI|SWT.WRAP);<br />　　//为文本框指定一个布局结构对象，<br />　　这里让文本框尽可能的占满Panel的空间。<br />　　GridData gTextData = new GridData (GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);<br />　　text.setLayoutData(gTextData);<br />　　//生成按键<br />　　Button butt = new Button(panel,SWT.PUSH);<br />　　butt.setText("Push");<br />　　//为按键指定鼠标事件<br />　　butt.addMouseListener(new MouseAdapter(){<br />　　public void mouseDown(MouseEvent e){<br />　　//当用户点击按键的时候，显示信息<br />　　text.setText("Hello SWT");<br />　　}<br />　　});<br />　　//当主窗口关闭时，会触发DisposeListener。这里用来释放Panel的背景色。<br />　　shell.addDisposeListener(new DisposeListener(){<br />　　public void widgetDisposed(DisposeEvent e) {<br />　　bkColor.dispose();<br />　　}<br />　　});<br />　　}<br />　　<br />　　把这段代码中的方法initShell()加入到第一个打开空窗口的例子中，得到的是一段能成功运行的完整GUI应用程序。运行方法可参考第一个例子。<br />　　<br />　　<b>系统资源的管理</b><br />　　在一个图形化的操作系统中开发程序，都要调用系统中的资源，如图片、字体、颜色等。通常这些资源都是有限的，程序员务必非常小心的使用这些资源：当不再使用它们时，就请尽快释放，不然操作系统迟早会油尽灯枯，不得不重新启动，更严重的会导致系统崩溃。<br />　　<br />　　SWT是用Java开发的，Java语言本身的一大优势就是JVM的"垃圾回收机制"，程序员通常不用理会变量的释放，内存的回收等问题。那么对SWT而言，系统资源的操作是不是也是如此？答案是一个坏消息，一个好消息。<br />　　<br />　　坏消息是SWT并没采用JVM的垃圾回收机制去处理操作系统的资源回收问题，一个关键的因素是因为JVM的垃圾回收机制是不可控的，也就是说程序员不能知道，也不可能做到在某一时刻让JVM回收资源！这对系统资源的处理是致命的，试想你的程序希望在一个循环语句中去查看数万张图片，常规的处理方式是每次调入一张，查看，然后就立即释放该图片资源，而后在循环调入下一张图片，这对操作系统而言，任何时刻程序占用的仅仅是一张图片的资源。但如果这个过程完全交给JVM去处理，也许会是在循环语句结束后，JVM才会去释放图片资源，其结果可 <br /><br /><br /><img src ="http://www.blogjava.net/xixidabao/aggbug/44482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-03 23:49 <a href="http://www.blogjava.net/xixidabao/archive/2006/05/03/44482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JFace和SWT构建简单的应用程序(2) </title><link>http://www.blogjava.net/xixidabao/archive/2006/05/03/44481.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 03 May 2006 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/05/03/44481.html</guid><description><![CDATA[
		<br />　　<b>实现顶级 Explorer 类</b><br />　　我们将采用 Hello, World 程序，更改其名称，然后用 createContents() 方法创建 TreeViewer（而不是创建一个按钮），将其内容提供程序设置为我们的文件树内容提供程序，然后将输入设置到某个文件夹。在这个例子中，我选择的文件夹是 C: 驱动器中的顶级文件夹。<br />　　<br />　　注：需要从 createContents() 返回 SWT 窗口构件。正如前面提到的，JFace Tree Viewer 不是 SWT 窗口构件，因此我们不能将它返回。我们需要从树查看器获取真正的窗口构件。我们通过使用 getTree() 做到这一点。我们的主窗口类现在看起来与下面相似：<br />　　<br />　　清单 5. Explorer（版本 1）<br />　　<br />　　import java.io.*;<br />　　import org.eclipse.jface.viewers.*;<br />　　import org.eclipse.jface.window.*;<br />　　import org.eclipse.swt.*;<br />　　import org.eclipse.swt.widgets.*;<br />　　public class Explorer extends ApplicationWindow<br />　　{<br />　　public Explorer()<br />　　{<br />　　super(null);<br />　　}<br />　　protected Control createContents(Composite parent)<br />　　{<br />　　TreeViewer tv = new TreeViewer(parent);<br />　　tv.setContentProvider(new FileTreeContentProvider());<br />　　tv.setInput(new File("C:\\"));<br />　　return tv.getTree();<br />　　}<br />　　public static void main(String[] args)<br />　　{<br />　　Explorer w = new Explorer();<br />　　w.setBlockOnOpen(true);<br />　　w.open();<br />　　Display.getCurrent().dispose();<br />　　}<br />　　}<br />　　<br />　　运行该程序，您将看到与图 8 相似的结果。<br />　　
<center>　<img src="/imgfiles/2005.3.4.10.51.50.8.gif" /></center><br />　　
<center>图 8. Explorer（版本 1）</center><br />　　<br />　　除了样板文件代码，我们只需向 Hello, World 程序添加 9 行代码就可做到这一点。正如您可能猜想的那样，程序用 File 的 toString() 方法来显示这些文件，这不是我们真正想要的。要改变这一点，我们需要提供一个标签提供程序。<br />　　<br />　　<b>实现标签提供程序</b><br />　　正如有一个内容提供程序对象可用来获取树节点的子元素一样，当需要实际显示这些节点时，树查看器有另一个助手对象：标签提供程序。和前面一样，我们需要设置它：<br />　　<br />　　public void setLabelProvider(IBaseLabelProvider labelProvider)<br />　　<br />　　而且需要实现下面的方法以返回要为每个元素显示的文本：<br />　　<br />　　public String getText(Object element)<br />　　<br />　　如果我们将标签提供程序添加到树查看器图中，就会得到图 9。<br />　　
<center>　<img src="/imgfiles/2005.3.4.10.52.8.9.gif" /></center><br />　　
<center>图 9. 显示内容提供程序和标签提供程序的树查看器</center><br />　　<br />　　我们可以实现接口 ILabelProvider，但将缺省实现 LabelProvider 子类化更容易（如果没有显式地设置标签提供程序，则使用的就是这个类）。我们希望利用 getText() 做的事是返回文件名最后的部分 — 相对文件名而非 toString() 缺省使用的绝对文件名。图 6 演示了代码。<br />　　<br />　　图 6. FileTreeLabelProvider（版本 1）<br />　　<br />　　import java.io.*;<br />　　import org.eclipse.jface.viewers.*;<br />　　public class FileTreeLabelProvider extends LabelProvider<br />　　{<br />　　public String getText(Object element)<br />　　{<br />　　return ((File) element).getName();<br />　　}<br />　　}<br />　　<br />　　而且我们必须记得使树查看器使用这个标签提供程序，如清单 7 所示。<br />　　<br />　　清单 7. Explorer（版本 2）<br />　　<br />　　import java.io.*;<br />　　import org.eclipse.jface.viewers.*;<br />　　import org.eclipse.jface.window.*;<br />　　import org.eclipse.swt.*;<br />　　import org.eclipse.swt.widgets.*;<br />　　public class Explorer extends ApplicationWindow<br />　　{<br />　　public Explorer()<br />　　{<br />　　super(null);<br />　　}<br />　　protected Control createContents(Composite parent)<br />　　{<br />　　TreeViewer tv = new TreeViewer(parent);<br />　　tv.setContentProvider(new FileTreeContentProvider());<br />　　tv.setLabelProvider(new FileTreeLabelProvider());<br />　　tv.setInput(new File("C:\\"));<br />　　return tv.getTree();<br />　　}<br />　　public static void main(String[] args)<br />　　{<br />　　Explorer w = new Explorer();<br />　　w.setBlockOnOpen(true);<br />　　w.open();<br />　　Display.getCurrent().dispose();<br />　　}<br />　　}<br />　　<br />　　这一次运行该程序时，我们会获得更清楚的视觉效果，如图 10 所示。<br />　　
<center>　<img src="/imgfiles/2005.3.4.10.54.24.10.gif" /></center><br />　　
<center>图 10. Explorer（版本 2）</center><br />　　<br />　　我们现在要做的是将树查看器移到左边，将一个表查看器放在右边，以显示在树查看器中已选中的文件夹中的文件列表。<br />　　<br />　　<b>使用表查看器</b><br />　　为了处理表，JFace 有一个 TableViewer。和 TreeViewer 一样，它有输入（根对象）、内容提供程序和标签提供程序。它比树查看器简单，因为它不需要处理树。图 11 演示了内容提供程序和标签提供程序。<br />　　
<center>　<img src="/imgfiles/2005.3.4.10.54.33.11.gif" /></center><br />　　
<center>图 11. 显示内容提供程序和标签提供程