??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲中文字幕无码久久精品1,大桥未久亚洲无av码在线,日韩精品亚洲专区在线观看http://www.tkk7.com/xixidabao/category/15385.htmlGROW WITH JAVAzh-cnSun, 06 May 2007 03:57:49 GMTSun, 06 May 2007 03:57:49 GMT60Eclips使用U技(l对l典)http://www.tkk7.com/xixidabao/archive/2007/05/06/115509.htmlJAVA之\JAVA之\Sun, 06 May 2007 02:16:00 GMThttp://www.tkk7.com/xixidabao/archive/2007/05/06/115509.html
Eclips使用U技(l对l典)

 

 

AuthorQsungo 

 

前言Q?nbsp;

本来我都是用JBuilderX当主力IDE、但使用?jin)Eclipse?nbsp;

发现...Eclipse原来也这么好?..渐渐的就׃?jin)?..... 

Eclipse优点Q免贏V程序代码排版功能、有中文化包、可?nbsp;

设许多功能强大的外挂、支持多U操作系l?Windows?nbsp;

Linux、Solaris、Mac OSX)..{等?nbsp;

 

开此篇讨论串的目的Q是希望能将Eclipse的一些用技巧集 

合v?..Ƣ迎大家l箋(hu)补充下去...׃Eclipse的版本众?nbsp;

Q希望补充的先进们能Z说明一下?zhn)所使用的版本~ 

 

Eclipse|站Qhttp://www.eclipse.org/ ;

Eclipse中文化教学:(x)JavaWorld站内文章参?nbsp;

 

(使用版本QEclipse 2.1.2 Release + 中文? 

 

热键:(x) 

TemplateQAlt + / 

修改处:(x)H口->喜好讑֮->工作?>按键->~辑->内容辅助?nbsp;

个h?fn)惯QShift+SPACE(I白)?nbsp;

易说明:(x)~辑E序代码Ӟ打sysout +Template启动键,?nbsp;

?x)自动出玎ͼ?x)System.out.println(); ?nbsp;

讑֮Template的格式:(x)H口->喜好讑֮->Java->~辑?>模板?nbsp;

 

E序代码自动排版QCtrl+Shift+F 

修改处:(x)H口->喜好讑֮->工作?>按键->E序代码->格式?nbsp;

个h?fn)惯QAlt+Z?nbsp;

自动排版讑֮Q窗?>喜好讑֮->Java->E序代码格式制作E序?nbsp;

样式面->插入tab(而非I格?以内~,该选项取消N?nbsp;

Q下面空格数目填4Q这样在自动~排时会(x)以空?作羃排?nbsp;

 

快速执行程序:(x)Ctrl + F11 

个h?fn)惯QALT+X 

修改处:(x)H口->喜好讑֮->工作?>按键->执行->启动前一ơ的启动作业?nbsp;

易说明:(x)W一ơ执行时Q它?x)询问(zhn)执行模式Q?nbsp;

讄好后Q以后只要按q个热键Q它?yu)׃?x)快速执行?nbsp;

<ALT+Z(排版?、ATL+X(执行)>..我觉得很手^___^ 

 

自动汇入所需要的cdQCtrl+Shift+O 

易说明:(x) 

假设我们没有ImportMcdӞ当我们在E序里打入:(x) 

 

BufferedReader buf = 

new BufferedReader(new InputStreamReader(System.in)); 

 

此时Eclipse?x)警C没有汇入cdQ这时我们只要按下Ctrl+Shift+O 

Q它?yu)׃?x)自动帮我们Importcd?nbsp;

 

查看使用cd的原始码QCtrl+鼠标左键点击 

易说明:(x)可以看到(zhn)所使用cd的原始码?nbsp;

 

选取的文字批注v来:(x)Ctrl+/ 

易说明:(x)Debug时很方便?nbsp;

修改处:(x)H口->喜好讑֮->工作?>按键->E序代码->Ҏ(gu) 

 

视景切换QCtrl+F8 

个h?fn)惯QAlt+S?nbsp;

修改处:(x)H口->喜好讑֮->工作?>按键->H口->下一个视景?nbsp;

易说明:(x)可以方便我们快速切换编辑、除错等视景?nbsp;

 

密技:(x) 

一套Eclipse可同时切换,英文、繁体、简体显C:(x) 

1.首先要先安装完中文化包?nbsp;

2.在桌面的快捷方式后面加上参数卛_Q?nbsp;

英文-> -nl "zh_US" 

J体-> -nl "zh_TW" 

?> -nl "zh_CN"?nbsp;

(其它语系以此cL) 

像我2.1.2中文化后Q我在我桌面的Eclipse快捷方式加入参数-n1 "zh_US"?nbsp;

"C:Program Fileseclipseeclipse.exe" -n "zh_US" 

接口׃(x)变回英文语系噜?nbsp;

 

利用EclipseQ在Word~辑文书时可不必程序代码重新编排:(x) 

EclipseE序~辑区的E序代码整个复制下来(Ctrl+C)Q直接脓(chung)(Ctrl+V)?nbsp;

Word或WordPad上,(zhn)将?x)发现在Word里的E序代码格式Q跟Eclipse 

所讑֮的完全一P包括字型、羃排、关键词颜色。我曾试qJBuilder 

、GEL、NetBeans...使用复制贴上Ӟ只有~排格式一P字型、颜 

色等都不?x)改变?nbsp;

 

外挂:(x) 

外挂安装Q将外挂包下载回来后Q将其解压羃后,(zhn)会(x)发现features?nbsp;

pluginsq?个数据夹Q将里面的东襉K复制或移动到Eclipse的features 

、plugins数据夹内后,重新启动Eclipse卛_?nbsp;

 

让Eclipse可以像JBuilderX一样用拖拉方式徏构GUI的外挂:(x) 

1.Jigloo SWT/Swing GUI Builder Q?nbsp;

http://cloudgarden.com/jigloo/index.html ;

下蝲此版本:(x)Jigloo plugin for Eclipse (using Java 1.4 or 1.5) 

安装后即可由档案->新徏->其它->GUI Form选取要徏构的GUIcd?nbsp;

 

2.Eclipse Visual Editor ProjectQ?nbsp;

http://www.eclipse.org/vep/ ;

炚w下方Download PageQ再炚wLatest Release 0.5.0q入下蝲?nbsp;

除了(jin)VE-runtime-0.5.0.zip要下载外Q以下这2个也要:(x) 

EMF build 1.1.1: (build page) (download zip) 

GEF Build 2.1.2: (build page) (download zip) 

 

3.0 M8版本Q请下蝲Q?nbsp;

EMF build I200403250631 

GEF Build I20040330 

VE-runtime-1.0M1 

 

安装成功后,便可由File->New->Visual Class开始UI设计?nbsp;

安装成功后,卛_由新?>Java->AWT与Swing里选择 

所要徏构的GUIcd开始进行设计。VE必须配合着对应 

版本Q才能正怋用,否则即安装成功Q用上仍会(x) 

有问题?nbsp;

 

使用Eclipse来开发JSPE序Q?nbsp;

外挂名称Qlomboz(下蝲面) 

http://forge.objectweb.org/project/showfiles.php?group_id=97 ;

请选择适合自己版本的lomboz下蝲Qlomboz.212.p1.zip表示2.1.2版, 

lomboz.3m7.zip表示M7版本....以此cL?nbsp;

lomboz安装以及(qing)讄教学Q?nbsp;

Eclipse开发JSP-教学文g 

 

Java转exe:(x) 

实现方式QEclipse搭配JSmooth(免费)?nbsp;

1.先由Eclipse制作包含Manifest的JAR?nbsp;

制作教学 

2.使用JSmooth做好的JAR包装成EXE?nbsp;

JSmooth下蝲面Q?nbsp;

http://jsmooth.sourceforge.net/index.php ;

3.制作完成的exe文gQ可在有装置JRE的Windows上执行?nbsp;

 

Eclipse-Java~辑器最佌定:(x) 

~辑器字型设定:(x)工作?>字型->Java~辑器文字字型?nbsp;

(讑֮Courier New -regular 10) 

 

~辑器相兌定:(x)H口->喜好讑֮->Java->~辑?nbsp;

 

外观Q显C受强调对U显C的Ҏ(gu)受强调显C现行行?nbsp;

昄打印边距Q将其勾选,Tab宽度?Q打印编距字D设80?nbsp;

E序代码协助Q采预设卛_?nbsp;

语法Q可讑֮关键词、字W串{等的显C颜艌Ӏ?nbsp;

附注Q采预设卛_?nbsp;

输入Q全部字D都N?nbsp;

动说明Q采预设卛_?nbsp;

DQ采预设卛_?nbsp;

 

使自动排版排出来的效果,最W合Java设计惯例的设定:(x) 

自动排版讑֮Q窗?>喜好讑֮->Java->E序代码制作格式?nbsp;

 

换行Q全部不N?nbsp;

分行Q行长度上限设:(x)80?nbsp;

样式Q只强制{型后插入I白N?nbsp;

内羃I格数目Q设??nbsp;

 

Eclipse的教学文Ӟ(x) 

Eclipse 3.0pd热键?- 中英对照解说?(by sungo) ~New~ 

Window+GCC+CDT用Eclipse开发C、C++ (by sungo) ~New~ 

 

其它Q?nbsp;

扩充Eclipse的Java 开发工?中文) 

使用Eclipse开发J2EE 应用E序(中文) 

使用Eclipseq_q行除错(中文) 

用Eclipseq行XML 开?中文) 

开发Eclipse外挂E序(中文) 

国际化?zhn)的Eclipse外挂E序(英文) 

Swing~辑器加入Eclipse(英文) 

如何试你的Eclipse plug-inW合国际?jng)场需?英文) 

 

Eclipse的相关网站:(x) 

http://eclipse-plugins.2y.net/eclipse/index.jsp ;

http://www.eclipseplugincentral.com/ ;

Eclipse相关教学[体] 

 

  

 

  

 

写程序写到很累了(jin)Q想休息一下?Q玩玩小Game?nbsp;

不错的选择Q下面介l用Eclipse玩Game的Plug-in?nbsp;

 

补充外挂:(x) 

Eclipse-GamesQ?nbsp;

http://eclipse-games.sourceforge.net/ ;

版本选:(x)Latest Release 3.0.1 (Release Notes) Sat, 3 Jan 2004 

 

外挂安装完后Q重新开启Eclipse?nbsp;

H口->自订视景->其它->NGame Actions?nbsp;

再将Eclipse关闭Q重新再启动Q就可以开始玩噜?nbsp;

(共有4U:(x)采地雷I、采地雷II、贪食蛇、仓库番? 

 

(Eclipse 2.1.2 +中文?玩Game -仓库?   

 

补充Q?于Eclipse使用assertion机制) 

Eclipse版本Q?.1.3 release?nbsp;

 

JDK1.4版新加入的assertion机制(关键词:(x)assert)Q由于JDK1.4~译?nbsp;

预设是兼?.3Q所以要使用assert必须在编译时加上-source 1.4的参数?nbsp;

 

C:>javac -source 1.4 XXX.java

执行时则必须?ea ?enableassertions参数启动?nbsp;

 

C:>java -ea XXX

 

如要在Eclipse中用assertion机制Q请作以下设定:(x) 

讑֮一Q?~译讑֮) 

Windows->Preferance->Java->Compiler->Compliance and Classfiles 

面。将..JDK Compliance level->Compiler compliance level调成1.4?nbsp;

 

讑֮二:(x)(执行讑֮) 

Run->Run->(x)=Arguments面Q在VM arguments加入-da参数Q按?nbsp;

Run button便可看到启动assertion后的执行l果?nbsp;

 

(Eclipse 2.1.3 release + assertion试) 

<assert判别为falseQ所以show出AssertionError>   

 

新版(m8+)的eclipse可以设vm arguments 

另外提供一U设法,是在eclipse启动时加入vm arguments(跟加大eclipse预设内存大小的方式一? 

q样׃用每ơrun都得需去设vm arguments  
 



更多资源Q?br>参与论坛讨论: http://www.java-cn.com/forum/index.jsp
更多技术文? http://www.java-cn.com/technology/index.jsp
更多JAVA博客: http://www.54bk.com/
JAVA中文?/strong>:  我们要做中国最好的JAVA门户|站,C我们的域? JAVA-CN.COM | JAVA-CN.NET | JAVA-CN.ORG
本文|址: http://www.java-cn.com/technology/technology_detail.jsp?id=4015
?nbsp;   ? 转蝲此文?d显著位置注明 JAVA中文?/font> 的原文网址;
          若是本站的{载文?h明原文出?q保留作者信?/font>



JAVA之\ 2007-05-06 10:16 发表评论
]]>
Eclipse?qing)其插g介绍和下?/title><link>http://www.tkk7.com/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.tkk7.com/xixidabao/archive/2007/01/11/93040.html</guid><description><![CDATA[ <p>一QEclipse?qing)其插g介绍和下?/p> <p>0.Eclipse下蝲<br />EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在q里下蝲<br /><a >http://www.eclipse.org/downloads/index.php</a><br /> (tng)<br />0.5.lomboz J2EE插g,开发JSP,EJB<br /><a >http://forge.objectweb.org/projects/lomboz</a><br />1.MyEclipse J2EE开发插Ӟ支持SERVLET/JSP/EJB/数据库操U늭 <br /><a >http://www.myeclipseide.com</a><br /> (tng)<br />2.Properties Editor (tng) ~辑java的属性文Ӟq可以自动存盘(sh)ؓ(f)Unicode格式 <br /><a >http://propedit.sourceforge.jp/index_en.html</a><br /> (tng) <br />3.Colorer Take (tng) Z癄cd的文件按语法着?<br /><a >http://colorer.sourceforge.net/</a><br /> (tng) <br />4.XMLBuddy ~辑xml文g<br /><a >http://www.xmlbuddy.com</a><br /> (tng) <br />5.Code Folding (tng) 加入多种代码折叠功能Q比eclipse自带的更多)(j) <br /><a >http://www.coffee-bytes.com/servlet/PlatformSupport</a><br /> (tng) <br />6.Easy Explorer (tng) 从eclipse中访问选定文g、目录所在的文g?<br /><a >http://easystruts.sourceforge.net/</a><br /> (tng) <br />7.Fat Jar 打包插gQ可以方便的完成各种打包dQ可以包含外部的包等 <br /><a >http://fjep.sourceforge.net/</a><br /> (tng) <br />8.RegEx Test 试正则表达?<br /><a >http://brosinski.com/stephan/archives/000028.php</a><br /> (tng) <br />9.JasperAssistant 报表插gQ强Q要qQ?<br /><a >http://www.jasperassistant.com/</a><br /> (tng) <br />10.Jigloo GUI Builder QAQӞ的GQテ~辑插g <br /><a >http://cloudgarden.com/jigloo/</a><br /> (tng) <br />11.Profiler 性能跟踪、测量工P能跟t、测量Q程?<br /><a >http://sourceforge.net/projects/eclipsecolorer/</a><br /> (tng) <br />12.AdvanQas 提供对if/else{条件语句的提示和快捷帮助(自动更改l构{)(j) <br /><a >http://eclipsecolorer.sourceforge.net/advanqas/index.html</a><br /> (tng) <br />13.Log4E Log4j插gQ提供各U和Log4j相关的Q务,如ؓ(f)Ҏ(gu)、类d一个logger{?<br /><a >http://log4e.jayefem.de/index.php/Main_Page</a><br /> (tng) <br />14.VSSPlugin VSS插g <br /><a >http://sourceforge.net/projects/vssplugin</a><br /> (tng) <br />15.Implementors 提供跌{C个方法的实现c,而不是接中的功能Q实?Q?<br /><a >http://eclipse-tools.sourceforge.net/implementors/</a><br /> (tng) <br />16.Call Hierarchy 昄一个方法的调用层次Q被哪些Ҏ(gu)调,调了(jin)哪些Ҏ(gu)Q?<br /><a >http://eclipse-tools.sourceforge.net/call-hierarchy/index.html</a><br /> (tng) <br />17.EclipseTidy (g)查和格式化HTML/XML文g <br /><a >http://eclipsetidy.sourceforge.net/</a><br /> (tng) <br />18.Checkclipse (g)查代码的风格、写法是否符合规?<br /><a >http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm</a><br /> (tng) <br />19.Hibernate Synchronizer Hibernate插gQ自动映等 <br /><a >http://www.binamics.com/hibernatesync/</a><br /> (tng) <br />20.VeloEclipse (tng) Velocity插g <br /><a >http://propsorter.sourceforge.net/</a><br /> (tng) <br />21.EditorList 方便的列出所有打开的Editor <br /><a >http://editorlist.sourceforge.net/</a><br /> (tng) <br />22.MemoryManager 内存占用率的监视 <br /><a >http://cloudgarden.com/memorymanager/</a><br /> (tng)<br />23.swt-designer java的GUI插g<br /><a >http://www.swt-designer.com/</a><br /> (tng)<br />24.TomcatPlugin 支持Tomcat插g <br /><a >http://www.sysdeo.com/eclipse/tomcatPlugin.html</a><br /> (tng)<br />25.XML Viewer <br /><a >http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html</a><br /> (tng)<br />26.quantum 数据库插?br /><a >http://quantum.sourceforge.net/</a><br /> (tng)<br />27.Dbedit 数据库插?br /><a >http://sourceforge.net/projects/dbedit</a><br /> (tng)<br />28.clay.core 可视化的数据库插?<br /><a >http://www.azzurri.jp/en/software/index.jsp</a><br /><a >http://www.azzurri.jp/eclipse/plugins</a><br /> (tng)<br />29.hiberclipse hibernate插g <br /><a >http://hiberclipse.sourceforge.net</a><br /><a >http://www.binamics.com/hibernatesync</a><br /> (tng)<br />30.struts-console Struts插g<br /><a >http://www.jamesholmes.com/struts/console/</a><br /> (tng)<br />31.easystruts Struts插g<br /><a >http://easystruts.sourceforge.net</a><br /> (tng)<br />32.veloedit Velocity插g<br /><a >http://veloedit.sourceforge.net/</a><br /> (tng)<br />33.jalopy 代码整理插g<br /><a >http://jalopy.sourceforge.net/</a><br /> (tng)<br />34.JDepend 包关pd?br /><a >http://andrei.gmxhome.de/jdepend4eclipse/links.html</a><br /> (tng)<br />35.Spring IDE Spring插g<br /><a >http://springide-eclip.sourceforge.net/updatesite/</a><br /> (tng)<br />36.doclipse 可以产生xdoclet 的代码提C?br /><a >http://beust.com/doclipse/</a><br />0.Eclipse下蝲<br />EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在q里下蝲<br /><a ><font color="#002c99">http://www.eclipse.org/downloads/index.php</font></a><br /> (tng)<br />0.5.lomboz J2EE插g,开发JSP,EJB<br /><a ><font color="#002c99">http://forge.objectweb.org/projects/lomboz</font></a><br />1.MyEclipse J2EE开发插Ӟ支持SERVLET/JSP/EJB/数据库操U늭 <br /><a ><font color="#002c99">http://www.myeclipseide.com</font></a><br /> (tng)<br />2.Properties Editor (tng) ~辑java的属性文Ӟq可以自动存盘(sh)ؓ(f)Unicode格式 <br /><a ><font color="#002c99">http://propedit.sourceforge.jp/index_en.html</font></a><br /> (tng) <br />3.Colorer Take (tng) Z癄cd的文件按语法着?<br /><a ><font color="#002c99">http://colorer.sourceforge.net/</font></a><br /> (tng) <br />4.XMLBuddy ~辑xml文g<br /><a ><font color="#002c99">http://www.xmlbuddy.com</font></a><br /> (tng) <br />5.Code Folding (tng) 加入多种代码折叠功能Q比eclipse自带的更多)(j) <br /><a ><font color="#002c99">http://www.coffee-bytes.com/servlet/PlatformSupport</font></a><br /> (tng) <br />6.Easy Explorer (tng) 从eclipse中访问选定文g、目录所在的文g?<br /><a ><font color="#002c99">http://easystruts.sourceforge.net/</font></a><br /> (tng) <br />7.Fat Jar 打包插gQ可以方便的完成各种打包dQ可以包含外部的包等 <br /><a ><font color="#002c99">http://fjep.sourceforge.net/</font></a><br /> (tng) <br />8.RegEx Test 试正则表达?<br /><a ><font color="#002c99">http://brosinski.com/stephan/archives/000028.php</font></a><br /> (tng) <br />9.JasperAssistant 报表插gQ强Q要qQ?<br /><a ><font color="#002c99">http://www.jasperassistant.com/</font></a><br /> (tng) <br />10.Jigloo GUI Builder QAQӞ的GQテ~辑插g <br /><a ><font color="#002c99">http://cloudgarden.com/jigloo/</font></a><br /> (tng) <br />11.Profiler 性能跟踪、测量工P能跟t、测量Q程?<br /><a ><font color="#002c99">http://sourceforge.net/projects/eclipsecolorer/</font></a><br /> (tng) <br />12.AdvanQas 提供对if/else{条件语句的提示和快捷帮助(自动更改l构{)(j) <br /><a ><font color="#002c99">http://eclipsecolorer.sourceforge.net/advanqas/index.html</font></a><br /> (tng) <br />13.Log4E Log4j插gQ提供各U和Log4j相关的Q务,如ؓ(f)Ҏ(gu)、类d一个logger{?<br /><a ><font color="#002c99">http://log4e.jayefem.de/index.php/Main_Page</font></a><br /> (tng) <br />14.VSSPlugin VSS插g <br /><a ><font color="#002c99">http://sourceforge.net/projects/vssplugin</font></a><br /> (tng) <br />15.Implementors 提供跌{C个方法的实现c,而不是接中的功能Q实?Q?<br /><a ><font color="#002c99">http://eclipse-tools.sourceforge.net/implementors/</font></a><br /> (tng) <br />16.Call Hierarchy 昄一个方法的调用层次Q被哪些Ҏ(gu)调,调了(jin)哪些Ҏ(gu)Q?<br /><a ><font color="#002c99">http://eclipse-tools.sourceforge.net/call-hierarchy/index.html</font></a><br /> (tng) <br />17.EclipseTidy (g)查和格式化HTML/XML文g <br /><a ><font color="#002c99">http://eclipsetidy.sourceforge.net/</font></a><br /> (tng) <br />18.Checkclipse (g)查代码的风格、写法是否符合规?<br /><a ><font color="#002c99">http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm</font></a><br /> (tng) <br />19.Hibernate Synchronizer Hibernate插gQ自动映等 <br /><a ><font color="#002c99">http://www.binamics.com/hibernatesync/</font></a><br /> (tng) <br />20.VeloEclipse (tng) Velocity插g <br /><a ><font color="#002c99">http://propsorter.sourceforge.net/</font></a><br /> (tng) <br />21.EditorList 方便的列出所有打开的Editor <br /><a ><font color="#002c99">http://editorlist.sourceforge.net/</font></a><br /> (tng) <br />22.MemoryManager 内存占用率的监视 <br /><a ><font color="#002c99">http://cloudgarden.com/memorymanager/</font></a><br /> (tng)<br />23.swt-designer java的GUI插g<br /><a ><font color="#002c99">http://www.swt-designer.com/</font></a><br /> (tng)<br />24.TomcatPlugin 支持Tomcat插g <br /><a ><font color="#002c99">http://www.sysdeo.com/eclipse/tomcatPlugin.html</font></a><br /> (tng)<br />25.XML Viewer <br /><a ><font color="#002c99">http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html</font></a><br /> (tng)<br />26.quantum 数据库插?br /><a ><font color="#002c99">http://quantum.sourceforge.net/</font></a><br /> (tng)<br />27.Dbedit 数据库插?br /><a ><font color="#002c99">http://sourceforge.net/projects/dbedit</font></a><br /> (tng)<br />28.clay.core 可视化的数据库插?<br /><a ><font color="#002c99">http://www.azzurri.jp/en/software/index.jsp</font></a><br /><a ><font color="#002c99">http://www.azzurri.jp/eclipse/plugins</font></a><br /> (tng)<br />29.hiberclipse hibernate插g <br /><a ><font color="#002c99">http://hiberclipse.sourceforge.net</font></a><br /><a ><font color="#002c99">http://www.binamics.com/hibernatesync</font></a><br /> (tng)<br />30.struts-console Struts插g<br /><a ><font color="#002c99">http://www.jamesholmes.com/struts/console/</font></a><br /> (tng)<br />31.easystruts Struts插g<br /><a ><font color="#002c99">http://easystruts.sourceforge.net</font></a><br /> (tng)<br />32.veloedit Velocity插g<br /><a ><font color="#002c99">http://veloedit.sourceforge.net/</font></a><br /> (tng)<br />33.jalopy 代码整理插g<br /><a ><font color="#002c99">http://jalopy.sourceforge.net/</font></a><br /> (tng)<br />34.JDepend 包关pd?br /><a ><font color="#002c99">http://andrei.gmxhome.de/jdepend4eclipse/links.html</font></a><br /> (tng)<br />35.Spring IDE Spring插g<br /><a ><font color="#002c99">http://springide-eclip.sourceforge.net/updatesite/</font></a><br /> (tng)<br />36.doclipse 可以产生xdoclet 的代码提C?br /><a ><font color="#002c99">http://beust.com/doclipse/</font></a><br /></p> <p>二:(x)</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.tkk7.com/xixidabao/aggbug/93040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixidabao/" target="_blank">JAVA之\</a> 2007-01-11 02:42 <a href="http://www.tkk7.com/xixidabao/archive/2007/01/11/93040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZEclipse 3.0的SWT~程http://www.tkk7.com/xixidabao/archive/2006/05/21/47340.htmlJAVA之\JAVA之\Sun, 21 May 2006 14:50:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/21/47340.html 一、SWT?   Java语言的声望和它在桌面应用E序QGUIE序Q所取得的成显然极不相W,至今仍然很少能看到非常成功Java桌面E序。虽然有JBuilderQNetbeanQJProbe{大型Y件作Z表,但这仍不能证明Java的GUIE序是成功的Q它们的外观L和同一操作pȝq_下的其它软g昑־格格不入。对机器配置的需求也g永无止境Q这使得它们只能被一些L拥有当前最高性能PC的程序员?sh)所容忍Q或是那些不在乎金钱和时间的专业用户所接受。对l大多数计算Z用者来_(d)AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget ToolkitQSWTQ或许是Javaq一噩梦的终l者,q大JavaE序员终于可以开发出高效率的GUIE序Q它们拥有标准的外观Q几乎没有h能看Z的程序是用Java写出来的Q更为重要的是,q些E序是跨q_的?   SWT本n仅仅是Eclipsel织Z(jin)开发Eclipse IDE环境所~写的一l底层图形界?API。或许是无心(j)插柳Q或是有意ؓ(f)之,至今为止QSWT无论是在性能和外观上Q都越?jin)SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到?.1版本QSWT已经十分E_。这里指的稳定应该包含两层意思:(x)   一是指性能上的E_Q其中的关键是源于SWT的设计理c(din)SWT最大化?jin)操作系l的囑Ş构gAPIQ就是说只要操作pȝ提供?jin)相应图形的构gQ那么SWT只是单应用JNI技术调用它们,只有那些操作pȝ中不提供的构ӞSWT才自己去做一个模拟的实现。可以看出SWT的性能上的E_大多时候取决于相应操作pȝ囑Ş构g的稳定性?   另一个稳定是指SWT API包中的类、方法的名称和结构已l少有改变,E序员(sh)用担?j)由于Eclipsel织开发进度很快(Eclipse IDE每天都会(x)有一个Nightly版本的发布)(j)Q而导致自qE序代码变化q大。从一个版本的SWT更新臛_一版本Q通常只需要简单将SWT包换掉就可以?jin)?   二、Eclipse3.0的SWT~程   1.SWT比AWT和Swing要快多,因ؓ(f)它是利用操作pȝ的界面组件生成UI的,在java桌面设计领域掀起一场革?   2.环境配置Q?   windowspȝ+eclipse3.0   3.具体操作Q?   (1).新徏一java目Q命名SWT,文gl构如下Q?   +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原代码如下:(x) 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); } }

JAVA之\ 2006-05-21 22:50 发表评论
]]>
开发Eclipse下的自定义控?/title><link>http://www.tkk7.com/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.tkk7.com/xixidabao/archive/2006/05/20/47222.html</guid><description><![CDATA[ <pre>  本文首先介绍模型转换的基本概念,然后介绍RSA模型转换框架Q之后本文以两个具体的例子介l如何在RSA开发^C以模型{换框架ؓ(f)基础创徏和扩展模型{换?   现在ZEclipse的应用越来越多,很多桌面应用都是用Eclipse开发的。Eclipse提供?jin)一套SWT/JFACE的控件库,使得Z开发界面应用极大的方便。但是,SWT/JFACE的控件库毕竟有限Q在应用开发是我们不可避免地要自己开发一些自定义的控件。本文通过开发一个颜色列表控件的实例介绍?jin)Eclipse自定义控件开发中所要用到的技术?   目标读者必ȝ(zhn)Java开发,q且有一定的Eclipse开发经验?   在Eclipse|站上有一相关的文章"Creating Your Own Widgets using SWT"Q该文介l了(jin)开发自己控件的很多基本概念、方法,q且通过实例q行?jin)介l,非常好。但是其所用的实例比较单,q有很多控g开发中所要涉?qing)到的内容,例如键盘、鼠标事件的处理Q滚动条、焦点的处理{等没有提及(qing)。本文通过开发一个自定义的颜色列表控件的实例Q全面地介绍?jin)自定义控g所涉及(qing)的技术。同Ӟ读者也可以对该实例q行扩展Q实现自q列表控g。    SWT中提供的标准列表控g非常单,只能提供字符串的选择。我们经帔R要提供一些图形列表供用户选择Q这需要自己开发自定义的列表控件。颜色选择列表是我们常用的一U图形列表,我们׃此ؓ(f)例进行介l。以下是我们要开发的颜色列表?   我们在开发自定义控g时主要考虑以下问题Q?   1?自定义控件的l制Q通常我们需要自己对控g的Ş状或图案q行l制Q?   2?控g寚w盘(sh)件的响应Q当焦点q入控gQ用戯行键盘操作,通过键盘Ҏ(gu)件进行控制时Q我们需要让控g对用L(fng)操作q行响应。例如在列表中,用户?x)通过上下头改变列表的选择;   3?控g寚w标事件的响应Q当用户用鼠标选中控gQ进行操作时Q控件必M出相应的反应Q?   4?控g对焦点事件的响应Q当界面焦点q入或移出控Ӟ通常我们需要将控gl制成得到或失去焦点的Ş状。例如,当焦点进入列表时Q一般被选中的列表项?x)有虚框表示选中?   5?响应TAB键:(x)对于一个可操纵的控Ӟ用户可以用TAB键将焦点Ud或移出?   6?响应滚动条事Ӟ(x)当控件有滚动条时Q我们需要响应用户对滚动条的操作Q完成对控g的绘制工作?   7?提供事g监听机制Q程序员?sh)用你的控g旉常需要监听控件中发生的一些事Ӟq样当事件发生时Q他们能够进行相应处理?   8?提供辅助功能QAccessibilityQ:(x)辅助功能是方便残(hu)障h士用时必须的,标准控g都会(x)提供相应的支持,我们自定义的控g也不例外?   9?提供功能接口方便E序员访问:(x)通常为方便程序员?sh)用时获取控件中的信息或q行讄Q我们需要提供一些接口?   首先我们要开发的列表控g是一个基本控Ӟ所以我们选择Canvas作ؓ(f)我们开发的基类? public class ColorList extends Canvas { Vector colors = new Vector(); // 用于保存我们颜色控g中的颜色? Vector colorNames = new Vector(); // 用于保存颜色控g中的颜色名字 int rowSel = -1; // 用于保存当前选中的行? int oldRowSel = -1; // 用于保存?sh)一ơ选中的行? int maxX, maxY; // 用于保存列表的宽度和高度 int lineHeight; // 用于讄行高 int cx = 0; // 滚动条滚动后Q控件的囑Ş相对于控件可见区域左上角的x坐标 int cy = 0; // 滚动条滚动后Q控件的囑Ş相对于控件可见区域左上角的y坐标 }   控g开发最重要的就是控件的l制?jin)。控件的l制可以通过dPaintListenerQ在它的paintControlҎ(gu)中进行? 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 > getItemCount()) endLine = getItemCount(); for (int i = beginLine; i < endLine; i++) { boolean selected = false; if (i == rowSel) selected = true; onPaint(gc, i, cx, beginy + (i - beginLine) * lineHeight, selected); } } });   q里要注意的是从PaintEvent中获取的x,y,height,width是需要重l的区域Qx,y是以控g的左上角为原点的坐标。在我们的程序中Qؓ(f)?jin)性能赯Q我们先Ҏ(gu)需要重l的区域计算出需要重l的行数Q只重绘相应的行Q而不是将整个控g重绘。我们程序中用到的onPaint用于l制一行?   接下来,我们要让我们的控件响应键盘(sh)下键对列表项q行选择。我们已对向上键的处理ؓ(f)例,首先当用h?jin)向上键Ӟ我们需要改变选择Qƈ且重l旧的和新的选择V如果选择已l到?jin)列表的剙Q我们还需要同时滚动滚动条? 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) { //发送消息让控g重绘 ((Canvas) event.widget).redraw(cx, (rowSel + cy / lineHeight) * lineHeight, maxX, lineHeight*2, false); } if (rowSel < -cy / lineHeight) { //如果需要,滚动滚动? ScrollBar bar = ((Canvas) event.widget) .getVerticalBar(); bar.setSelection(bar.getSelection() - lineHeight); scrollVertical(bar); } selectionChanged(); // 发送selectionChanged事g } break; case SWT.ARROW_DOWN: // down arror key ? break; } } });   接下来,我们要让我们的控件响应鼠标对列表进行选择。首先我们要计算出鼠标选中的行P注意MouseEvent中的y值只是相对于控g左上角的坐标Q我们需要加上滚动出?jin)控件的部分? addMouseListener(new MouseListener() { public void mouseDoubleClick(MouseEvent e) { } public void mouseDown(MouseEvent e) { int row = (e.y - cy) / lineHeight; //计算选中的行 if (row >= 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) { } });   当我们的控g获得焦点Ӟ选中的列表项需要有虚框表示控g得到焦点。当获得或失ȝҎ(gu)Q我们这里只需要简单的通知选中的项重画? 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); } });   我们在绘制每一个列表项时可以加入判断当前控件是否得到焦点,如果控g得到?jin)焦点,我们在选中的项目上M个虚框。下面是我们l制一个列表项的代码,注意在代码的最后绘制焦点的虚框? 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() && isSelected) gc.drawFocus(cx, beginy, maxX, lineHeight); }   作ؓ(f)一个可操作的控ӞTAB键的支持也是很重要的。由于我们的控g是从Canvasl承q来的,不支持TAB键。下面的代码使我们的控g有TAB键的支持Q? addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } }; });   很多时候,我们需要有滚动条的支持。对于滚动条Q我们只要在上面加上selectionListenerQ处理它的widgetSelected事g可以? bar = getVerticalBar(); if (bar != null) { bar.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { scrollVertical((ScrollBar) event.widget); } }); }   下面是函数scrollVertical的代码。一旦用户对滚动条操作,我们可以计出要滚动的区域Q然后调用scroll函数。对函数scroll函数的调用会(x)D相应区域的重l? void scrollVertical(ScrollBar scrollBar) { Rectangle bounds = getClientArea(); int y = -scrollBar.getSelection(); if (y + maxY < 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; }   现在我们的程序已l基本成形了(jin)Q我们来q一步完善它。由于我们开发的控g是提供给E序员的Q我们需要提供接口,让外部知道控件中发生的事件。其中最重要的是列表的选中事g。我们需要提供接口让E序员能够添加事件监控器(listener)来监控发生的事gQƈ且一旦发生事Ӟ我们需要通知监控器?   首先Q我们添加一个成员来保存d的事件监控器Q? Vector selectionListeners = new Vector();   我们再增加一个函数addSelectionListenerQ让E序员可以添加监控器 public void addSelectionListener(SelectionListener listener) { selectionListeners.addElement(listener); }   在我们前面的代码中,我们注意到每ơ选择Ҏ(gu)变,我们都会(x)调用selectionChanged函数。下面是selectionChanged函数代码。这里,我们?x)生成一个SelectionEvent事gQƈ且逐个调用事g监控器的widgetSelectedҎ(gu)。这样别人就可以监听到我们的事g?jin)? public void selectionChanged() { Event event = new Event(); event.widget = this; SelectionEvent e = new SelectionEvent(event); for (int i = 0; i < selectionListeners.size(); i++) { SelectionListener listener = (SelectionListener) selectionListeners.elementAt(i); listener.widgetSelected(e); } }   现在辅助功能QAccessibilityQ也日益成ؓ(f)软g重要的部分,它是的残(hu)疾h也能够方便的使用我们的Y件。美国已l立法,不符合Accessibility规范的Y件不能够在政府部门销售。我们开发的控g也需要支持Accessibility.下面的代码我们的控件有Accessibility支持。其中最重要的是getRole和getValue函数。我们的控g是从Canvasl承Q我们在getRole函数中返回ACC.ROLE_LIST,q样我们的控件才能让屏幕阅读软g我们的控g作ؓ(f)列表控g对待? 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 >= 0 && childID < 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 >= 0 && childID < 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 >= 0 && childID < 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 >= 0 && childID < 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;  } }); 最后,我们需要提供一些方法方便程序员?sh)用我们的控件? public void setSelection(int index) { if (index >= getItemCount() || index < 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)); } 我们开发的控g的用也是非常简单的? 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)); 以上我们介绍?jin)如何开发一个简单的自定义控件所需要涉?qing)的技术。这里我们只以一个简单的颜色控gZQ但是一旦我们掌握了(jin)Ҏ(gu)Q我们很Ҏ(gu)可以开发出各种不同的漂亮控件? </pre> <img src ="http://www.tkk7.com/xixidabao/aggbug/47222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixidabao/" target="_blank">JAVA之\</a> 2006-05-20 21:43 <a href="http://www.tkk7.com/xixidabao/archive/2006/05/20/47222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Eclipse插g开发之定制向导http://www.tkk7.com/xixidabao/archive/2006/05/20/47164.htmlJAVA之\JAVA之\Sat, 20 May 2006 05:18:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/20/47164.htmlInvokatron的历?      首先Q我们详l说明一下Invokatron本n。在前面的文章中我们讨论q,Invokatron是一个生成Java代码的的囑Ş工具。你可以单地通过拖放操作建立cȝҎ(gu)。拖入的Ҏ(gu)被编辑的Ҏ(gu)Q也是插gQ?调用"。我们将让数据来驱动应用E序的设计。在后面一文章中Q我们将开发这个GUI。现在我们需要做的是Q找到插件将输入和存储的重要数据。它通常被称为应用程序的模型QmodelQ。在设计q个pȝ的时候,我们需要考虑下面一些内容:(x)      · 哪些l节数据需要保存?      · q些数据在内存(sh)用什么来表现QPOJO、JavaBeanq是EJBQ?      · q些数据的存储格式是怎样的?数据库表、XML文g、属性文件还是串行二q制文gQ?      · 输入数据的方式有哪几U??新徏文g"向导q是在文档属性页面上使用弹出对话框、用~辑器绘制、在文本~辑器中输入的其它向|      在我们l工作之前必d{这些问题。不可能有适合所有项目的{案Q它完全依赖于你的需求。在我们的例子中Q我做出?jin)一些随意的、可能有问题的决定,如下所C:(x)      · 一个Javac,它包含类名、程序包、超c(superclassQ和实现接口。我们以它ؓ(f)基础Q在后面的文章中d更多数据?      · 我将把数据表Cؓ(f)扩展PropertiescȝcR它建立?jin)编辑器?文档c??      · 我将使用的格式是属性文Ӟ很容易用PropertiescL分析它?      · ?新徏文g"向导中,我将先寻找数据,接着让用h变属性窗口或文本~辑器中的数据。这个步骤将在下一文章中完成?      DocumentQ文档)(j)c?      下一步是~写文档cR徏立一个新E序包(invokatron.modelQ和一个新c(InvokatronDocumentQ。下面是我们的文档类的开_(d)(x)      public class InvokatronDocument   extends Properties   {   public static final String PACKAGE = "package";   public static final String SUPERCLASS = "superclass";   public static final String INTERFACES = "interfaces";   }      使用Propertiescd以更单地分析和保存我们的数据。Getter?setter不是必须的,但是如果你想要,也可以加上它们。这个类q没有完成;我们添加一个接口,在后面的部分中Eclipse需要用它?      有了(jin)q个cM后,我们要获取一个属性就非常单了(jin)Q?      String package =document.getProperty(InvokatronDocument.PACKAGE);      定制向导      L(fng)一看前面的文章中所出现的向对{你应该记得Q我们可以通过点击Q我们自己添加的Q工h按钮或者菜单项来访问它。图1是它的界面:(x)        ?Q旧的向?      它只有一个页面,右上角没有图片。我们想输入更多的信息,q提供一个很好的囄。换句话_(d)我们希望定制q个向导?      我们来分析一下这个向对{请打开InvokatronWizard.java文g。请注意q个cL如何扩展Wizardq实现INewWizard接口的。你应该理解它里面的很多Ҏ(gu)。ؓ(f)?jin)定制向|我们单地调用或重载其中的某些Ҏ(gu)。下面是一些重要的Ҏ(gu)Q?      生命周期Ҏ(gu)      我们应该重蝲q些Ҏ(gu)Q把初始化和析构QdestructionQ代码插入向gQ?      · ConstructorQ构造函敎ͼ(j)Q向导实例化的时候、在Eclipsel它传递信息之前调用。向导的一般初始化实现。通常你希望调?化Ҏ(gu)"Q后面有描述Qƈ讄对话框的默认倹{?      · init(IWorkbench workbench, IStructuredSelection editorSelection): Eclipse调用它ؓ(f)向导提供工作台的信息。请重蝲它,保存I(y)Workbench和对象的句柄供以后用。如果它是一个编辑器向导而不是新向导Q我们最好把当前的编辑器选项作ؓ(f)W二个参数?      · dispose()QEclipse调用它执行清理工作。重载它来清除向g用的资源?      · finalize()Q清除代码,可能使用dispose()代替?      化Ҏ(gu)      q些Ҏ(gu)都是用于装饰向导H体的?      · setWindowTitle(String title)Q设|窗体的标题行字W串?      · setDefaultPageImageDescriptor(ImageDescriptor image)Q用于提供显C在向导的所有页面右上方的图片?      · setTitleBarColor(RGB color)Q指定标题栏用什么颜艌Ӏ?      按钮Ҏ(gu)      q些Ҏ(gu)控制着向导按钮的实用性和行ؓ(f)?      · boolean canFinish()Q重载它用于指定FinishQ完成)(j)按钮是否Ȁz(Ҏ(gu)向导的状态)(j)?      · boolean performFinish()Q重载它来实现向导的Ҏ(gu)的业务逻辑。如果向导没有完成(错误的条Ӟ(j)Q就q回false?      · boolean performCancel()Q重载它Q在用户点击CancelQ取消)(j)按钮的时候进行清除操作。如果向g能终止,则返回false?      · boolean isHelpAvailable()Q重载它用于指定HelpQ帮助)(j)按钮是否可视?      · boolean needsPreviousAndNextButtons()Q重载它来指定PreviousQ前一步)(j)和NextQ后一步)(j)按钮是否可视?      · boolean needsProgressMonitor()Q重载它来指定进度条部g是否可视。当点击Finish按钮调用performFinish()Ҏ(gu)的时候,它就?x)出现?      面Ҏ(gu)      q些Ҏ(gu)控制着面的外观?      · addPages()Q向导显C的时候调用。重载它l向导插入新面?      · createPageControls(Composite pageContainer)QEclipse调用它来实例化所有的向导面Q用前面的addPages()Ҏ(gu)已经d的页面)(j)。重载它l向导添加持l可视的H体部Ӟ除页面之外的部gQ?      · IWizardPage getStartingPage()Q重载它来检哪个页面是向导的第一个页面?      · IWizardPage getNextPage(IWizardPage nextPage)Q在默认情况下,点击Next按钮进入addPages()所提供的数l中的下一个页面。你可能希望Ҏ(gu)用户选择q入不同的页面。重载它来计后一个页面?      · IWizardPage getPreviousPage(IWizardPage previousPage)Q与getNextPage()cMQ用于计前一个页面?      · int getPageCount()Q检索addPages()d的页面的数量。在典型情况下,你不必重载它Q除非你希望昄面的数量和形式?      其它有用的方?      q些都是有用的辅助方法:(x)      · setDialogSettings(IDialogSettings settings)Q你可以载入对话框的状态,q过在init()中调用这个方法来讄q些倹{在典型情况下,q些讄可以作ؓ(f)向导字段的默认倹{请查看DialogSettingscM(jin)解更详细的信息?      · IDialogSettings getDialogSettings()Q当我们需要数据的时候,p用这个方法来(g)索它。在performFinish()的对话框的末,你再ơ可以把数据保存到文件中?      · IWizardContainer getContainer()Q对于检索Shell、运行的后台U程、刷新窗口等非常有用?      向导面Ҏ(gu)      你已l看C(jin)Q向导是׃个或多个面l成的。这些页面扩展了(jin)WizardPagec,q实C(jin)IWizardPage接口。ؓ(f)?jin)定制单独的面Q你必须?jin)解很多?gu)。下面是一些重要的Ҏ(gu)Q?      · ConstructorQ用于实例化面?      · dispose()Q重载它用于实现清除代码?      · createControl(Composite parent)Q重载它来给面d控g?      · IWizard getWizard()Q用于获取父向导对象。对于调用getDialogSettings()是有用处的?      · setTitle(String title)Q调用它来设|显C在向导标题区域中的字符丌Ӏ?      · setDescription(String description)Q调用它来提供标题(sh)面显C的文本内容?      · setImageDescriptor(ImageDescriptor image)Q调用它来提供页面右上方出现的图片(用于代替默认的图片)(j)?      · setMessage(String message)Q调用它来显C描q字W串下方的消息文本。这些文本是用于警告或提C用L(fng)?      · setErrorMessage(String error)Q调用它来高?sh)度昄描述字符串下方的消息文本。它一般意味着向导不能l箋(hu)Q除非错误被修正?      · setPageComplete(boolean complete)Q如果ؓ(f)trueQNext按钮可视?      · performHelp()Q重载它来提供内Ҏ(gu)感的帮助信息。当点击Help按钮的时候向g(x)调用它?      ~写向导的代?      有了(jin)q些Ҏ(gu)之后Q我们就能够开发出h极大的灵zL的向导?jin)。我们现在修改以前徏立的Invokatron向导Q给它添加一个页面来h用户输入初始的文档数据。我们还l向导添加了(jin)一个图片。新代码是粗体的Q?      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;   }      在构造函CQ我们打开?jin)进度条Qƈ讄?jin)向导的囄。你可以下蝲q保存(sh)面的囄Q?        hq个囄保存在Invokatron/icons文g夹之下。ؓ(f)?jin)更?gu)载入q个囄Q我们用了(jin)便捷的AbstractUIPlugin.imageDescriptorFromPlugin()Ҏ(gu)?      h意:(x)你应该知道,管q个向导是INewWizardcd的,但是q所有的向导都是用于建立新文档的。你可以参考其它一些资料来?jin)解如何建?独立?向导的信息?      下面是addPages()Ҏ(gu)Q?      public void addPages() {   page=new InvokatronWizardPage(selection);   addPage(page);   page2 = new InvokatronWizardPage2(selection);   addPage(page2);   }      在这个方法中Q我们添加了(jin)一个新面QInvokatronWizardPage2Q,我们在后面编辑它。下面是用户点击向导?完成"按钮的时候执行的一些方法:(x)      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());      //现在调用完成QfinishQ方?   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;   }      Z(jin)保存数据Q我们必d一个后C务。该事务是由向导的容器(Eclipse工作収ͼ(j)来执行的Qƈ且必d现IRunnableWithProgress接口Q包含(唯一Q一个run()Ҏ(gu)。传递进来的IProgressMonitor允许我们报告事务的进度。实际的数据保存工作在一个辅助方法(doFinish()Q中q行Q?      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());   }      //保?rn)目已经h?jin),该文件在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);   }      我们q做?jin)很多工作?x)      · 我们(g)索了(jin)自己希望保存文g的位|(用Eclipse的IFilec)(j)?      · 我们q获取了(jin)该File?      · 我们把属性保存到?jin)这个位|?      · 接着我们让Eclipse工作台刷新项目,q样可以显C文g?jin)?      · 我们最后调度了(jin)一个事务,它在以后执行。这个事务包括在~辑器中打开那个新文件?      · 在整个过E中Q我们通过调用IProgressMonitor对象Q它是作为参C递进来的Q的Ҏ(gu)来提C用L(fng)前的q展情况?      最后一个方法是一个辅助的Ҏ(gu)Q当该文件保存失败的时候,它在向导中显C错误信息:(x)      private void throwCoreException(String message) throws CoreException {   IStatus status =new Status(IStatus.ERROR,"Invokatron",IStatus.OK,message,null);   throw new CoreException(status);   }   }      向导可以捕获CoreException异常Q接着可以把它所包含的Status对象昄l用L(fng)。向g?x)被关闭?      ~写新的向导面的代?      下一步,我们~写InvokatronWizardPage2。它的整个类都是全新的:(x)      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();   }      上面的构造函数设|了(jin)面的标题(在标题栏下方高(sh)度显C)(j)和描qͼ在页面标题的下方昄Q。我们还有一些辅助方法?updateStatus处理面特定的错误信息的昄。如果没有错误信息,意味着面完成?jin);因此Q?下一?按钮可以用了(jin)。还有数据字D内容的getterQ获取)(j)Ҏ(gu)。下面是createControl()Ҏ(gu)Q它建立?jin)页面的所有可视化lgQ?      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("&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("&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("&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);   }      Z(jin)~写q段代码Q你必须?jin)解SWTQ请你自己查看一些这斚w的资料)(j)。基本上Q这个方法徏立了(jin)标签和字D,q把它们攄到网格布局上。字D发生改变的时候,p用dialogChanged()来验证它的数据:(x)      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);   }      }      q个工作是在三个工具c?-PackageValidator、SuperclassValidator?InterfacesValidator的帮助下完成的。接下来我们~写q些cR?      验证c?      验证可以在插件的用户输入数据的Q何部分中q行。因此,把验证代码放入可重复使用的类中是有意义的Q这样就不用把它复制到多个位|。下面是一个验证类的例子?      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 < interfaceArray.length; i++)   {   IStatus status = JavaConventions.validateJavaTypeName(interfaceArray[i]);   if (status.getCode() != IStatus.OK)   return "Validation of interface " + interfaceArray[i] + ": " + status.getMessage();   }   return null;   }   }      其它的验证类与它非常cM?      Eclipsecd中的另外一个极好的cLJavaConventionsQ它为我们验证数据!它包含了(jin)很多验证Ҏ(gu)Q例如:(x)      · validateJavaTypeName() (g)查类和接口的名称?      · validatePackageName() (g)查程序包的名U?      · validateFieldName() (g)查数据成员的名称?      · validateMethodName() (g)查方法的名称?      · validateIdentifierName() (g)查变量的名称?      现在我们不需要ICellEditorValidator接口Q但是在以后的文章中Q我们是需要它的?      l果      到目前ؓ(f)止,我们拥有?jin)一个可以工作的向导Q它拥有一张图片和两个面Q第二个面建立?jin)原来的Invokatron文档。图2昄?jin)结果?x)        2Q定制的向导      闪亮的发?      我们可以看到Q通常是数据驱动应用程序的。外表(PresentationQ也是很重要的。丑陋的发明难以出售Q但是闪亮的发明可能Ҏ(gu)出售。但是数据是我们q些E序员实现的非常本质的东ѝ?      在本文中Q我们首先决定了(jin)自己处理的数据。然后,我们以定制向导的方式来获取这些数据。下一文章将l箋(hu)讲解昄的问题,包括定制的编辑器和属性页面?/pre>

JAVA之\ 2006-05-20 13:18 发表评论
]]>
鲜Q最新版Eclipse3.1?qing)插件介l?http://www.tkk7.com/xixidabao/archive/2006/05/03/44486.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:57:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44486.html  W者用Eclipse有些时日?jin),从Eclipse2.0使用到现在,今天从 http://www.eclipse.org岗站上下载了(jin)最新版的Eclipse3.1Q用之后犹感它的强大,Eclipse在^时的工作中给W者带来了(jin)非常的方便,更兼 如此今天 使用Eclipse3.1后更感觉它的得心(j)和应手,使h耳目一斎ͼ因此W记它的新Ҏ(gu)及(qing)使用后感写出来。希?Eclipse能给更多的JAVA和C开发者带来工作中的方ѝ?br />  
  一、新Ҏ(gu)?/b>
  
  1.速度更快Q效率更高。我们打开Eclipse3.1一看,包括启动Q开发的速度??.0快很多了(jin)Q我大约试一下,同一个环境下Q比3.0启动快了(jin)几十U?br />  
  2.lg功能更强大,q带有非常强大图形编辑功能,支持可视化的Applet,Swing,AWT{图形组件的开发?br />  
  3.支持EJB3.0.
  
  4.支持UML2.0Qƈ带有UML2.0模型~辑器?br />  
  5.带有商业的报表项目和报表开发?br />  
  6.支持新版的AOP插g用于可视化的开发AOP应用E序和调试AOP的应用程序?br />  
  7.不像3.0一定需要JDK5.0的JREQ它只需要JDK1.4.1以上可以了(jin)?br />  
  二、各插g介绍
  
  1.JDTQJava Development ToolsQ?Java设计工具,最新版3.1RC4,需求Eclipse3.1支持.
  
  2.PDEQPlugin Development EnvironmentQ?插g设计环境Q用于设计自定义插g,最新版3.1RC4,需求Eclipse3.1支持& nbsp;
  
  3.Platform: Eclipse的核?j)运行^収ͼ目前最新版3.1.
  
  4. C/C++ IDE: 一看就知道Q用于设计C/C++目?br />  
  5.EMFQEclipse Modeling FrameworkQ?Eclipse模型框架Q目前最新版2.1.0,支持 Eclipse3.1?qing)更新?br />  
  6.GEF (Graphical Editor Framework):囑Ş~辑框架Q用于辅助图形设计,目前最新版3.1RC4,支持Eclipse3.1.
  
  7、UML2: UML~辑器,最新版1.1RC4,支持Eclipse3.1,需求EMF2.1RC1
  
  8.VE(Visual Editor):可视化图形编辑组Ӟ用于提供AWT/SWT/Swing的图形编辑,最新版1.1M2Q支持Eclipse3.1.< br>
  
  9. J2EE Standard Tools:用于设计J2EE应用E序的插Ӟ最新版1.0M5,支持Eclipse3.1. & nbsp;
  
  10.WST - Web Standards Tools: 用于设计Web应用E序的插Ӟ最新版1.0M5,支持Eclipse3.1.
  
  11.Eclipse Test and Performance Tools PlatformQ用于调试,单元试和测试项目的插g?br />  
  12.Business Intelligence and Reporting Tools (BIRT)Q商业智能和商业报表开发插Ӟ它包括Chart EngineQ图形引擎)(j)QReport Framework(报表框架Q,Runtime ENV(q行时环境)(j)?br />  
  13. AJDT - AspectJ Development ToolsQ用于开发AOPQ面向方面编E)(j)的开发ECLIPSE插g?br />  
  14.AspectJ: 用于开发AOP的开发环境?br />  
  15.CME - Concern Manipulation Environment:用于开发AOP的一l可视化工具插g?br />  
  三、下载和安装
  
  1.下蝲Q从Eclipse的网站http://www.eclipse.org/downloads下蝲上述插g。ƈ解压压羃?br />  
  2.安装有多U方法,我推荐用Eclipse环境中Help菜单中的安装q更新?br />  
  Q?Q将解压后的Eclipse-sdk-platform-win32-3.1目录挎贝一个你要做为安装的目录如CQ\& nbsp;
  
  Q?Q将JDK1.4.1?qing)以上的JDK的JRE挎贝到eclipse.exe所在的目录?& nbsp;
  
  Q?Q点击eclipse.exeq行Q启动eclipse
  
  Q?Q我们发现非常快的速度启动了(jin)eclipse3.1,莘进入它一个欢q界面?br />  
  Q?Q我们选择Help/SoftWare Update/Search and Installer菜单Q选择?br />  
  Q?Q依提示一个个完成安装?br />  
  四、ȝ
  
  & nbsp; Eclipse是一Ƒօ费的IDEQ支持JAVA和C/C++开发,非常方便与快P有强大而又灉|扩展的插件功能,目前Borland也加入该C֛的开 发,因此我们怿eclipse成为IDE 的饺了(jin)?




JAVA之\ 2006-05-03 23:57 发表评论
]]>
用Eclipseq行可视化Java界面设计(1) http://www.tkk7.com/xixidabao/archive/2006/05/03/44485.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:56:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44485.html   
  前言
  
  最q,Eclipse开源项目终于推Z(jin)期待已久的Visual Editor Project(VEP)。VE目使得功能强大的eclipseq_在java开发方面又增加?jin)一个可视化javalg开发利器。它让java开发者再也不用依赖其它的IDE产品来做GUI界面斚w的工作。所有的开发,从应用程序界面到业务逻辑的开发,现在都可以在eclipseq_上完成。本文将引导开发者如何安装配|ƈ使用Visual Editor?br />  
  关于Visual Editor
  
  开始介l之前,来看一个笔者用Visual Editor(以下UVE)设计的一个javaE序界面Q?br />   
  怎么P其可视化的界面设计,一点也不逊于其它的Java可视化界面开发工兗?br />  
  Visual Editor是一个开源的eclipse~辑器。它同JDT、PDE{其它eclipse的工具项目一P是一个全新的eclipse工具目。它可以q行可视化的~辑java GUIE序Q也能编辑可视化的Java Beanlg。它能与eclipse的Java Editor集成在一P当在Visual Editor中编辑图形界面时Q会(x)立即反馈到java Editor中的代码。反之亦然?br />  
  VE是一个可视化开发的一个frameworkQ当前版本的VE?.5.0RC1版,本版本的VE支持Swing和AWT的可视Javalg开发。由于这个framework设计的具有通用性,它也可以很容易的实现C++或其它语a下可视化开发。其来的版??.0开?Q将?x)支持SWT的开发。更多的关于Visual Editor的信息,L(fng)参考资料的相关链接?br />  
  下蝲与安?/b>
  
  ׃Visual Editor是用Ujava~写的,所以它应该可以在Q何操作系l上q行。但当前的VE版本?.5.0RC1Q只在windows和linuxq_上经q测试。所以如果你使用的是q两U操作系l之外的其它操作pȝQ你应该先阅读VE的readme文gQ安装和使用VE前,必须先安装以下版本的eclipse和相x(chng)持类库:(x)
  
  Eclipse build 2.1.2 (build page) (download zip)
  EMF build 1.1.1: (build page) (download zip)
  GEF Build 2.1.2: (build page) (download zip)
  
  Z(jin)方便中国的开发者,eclipse也提供了(jin)一个中文语a包,下蝲安装后,elcipse环境?yu)变成全中文的界面。在本文中,W者用的eclipse也安装了(jin)此中文语a包。之后就可以从以下地址下蝲Visual Editor?jin)?x)
  
  http://download.eclips.org/vep?
  
  下蝲后的VE是一个zip档案Q请其压羃包中plugins和features目录下的内容解压到eclipse安装目录的相应目录中卛_。如果你的eclipse是运行着的,请关闭ƈ重新启动eclipse?br />  
  开始一个设计Q?/b>
  
  现在Q所有程序安装完成,W者将用一个例子,来讲解Visual Editor的用。在q个例子中,W者要设计一个邮件发送面板,下面是它的草图:(x)
   
  此面板包括发送hQ接收hQ邮件主题,邮g内容以及(qing)发送和清除按钮Q?br />  
  q入Visual Editor
  
  启动eclipseq_。刚开始,你可能觉得eclipseq没有什么变化。先别急,hZ个项目,点击"文g"菜单下的"新徏"子菜单,选择q徏立一个新?java目"。然后在工具栏上?新徏Javac? 图标上,点击双的小头 Q将展开如下囄菜单Q?br />   
  在此菜单上,多了(jin)一?Visual Calss"的子菜单,q就是进入Visual Editor的入口之一。点?Visual Class"Q弹出如下的对话框:(x)
   
  在此对话框中Q要求输入类的名Uͼ如标记○1Q位|)(j)Q在q里我们输入"MessagePanel"Q以?qing)你惌l承的可视类Q如标记?位置Q。你可以选择l承来自swing或AWT的Q何界面组Ӟ如要l承其它cd的类Q请选择"other"q点?览"按钮来选择你要l承的类。在此处Q我们选择"panel"和Swing选项Q承JPanelQ然后点?完成"按钮Q大家就可以见到Visual Editor的界面了(jin)Q?br />   
  ׃eclipse工作台高度的可定制性,读者现在看到的界面qVE初始的布局Q而是l过W者按喜好的方式重新布局q的透视图,但是qƈ不会(x)影响读者理解本文内宏V?br />  
  如图?所C,是VE的工具面板,提供"选取"?框?{选择工具。还有SwinglgQSwing容器QSwing菜单以及(qing)AWT控g设计工具。在面板下方?Design"?Source"两个늭Q用来切换设计界面和Java源代码视图?br />  
  图中2是VE的工hQ包括工具面板中的一些常用按钮?br />  
  图中3?Java Beans"视图?属?视图Q两个视囑֏以切换显C?Java Beans"视图用树(wi)形结构即时显C计中用到的各UJava Beanlg层次。?属?视图昄昄当前所选中的Java beanlg的属性值列表,你可以在此列表中~辑各项Java Bean的属性倹{?br />  图中灰色矩Ş区域x(chng)我们最开始选择的JPanelQ所有的工作׃它开始?br />  
  摆设Swinglg
  
  做过Swing GUI界面设计的h都知道,Java应用E序界面上的元素位置是用LayoutManager来管理的。JPanel的预讑ָ局理器是FlowLayout。VE目前支持所有的传统的布局理器(q里所指的传统布局理器是指JDK1.4之前的布局理器。可惜的是VE目前q(sh)支持从JDK1.4开始有的SpringLayoutQ?br />  
  要设|JPanel的layoutQ请先在设计界面中选中JPanelQ再切换?属?视图Q找?layout"属性,如下图所C:(x)
   
  图中昄?jin)JPanel的预设LayoutManager。在"layout"属性的双Q可以通过点击l合框来指定不同cd的LayoutManager。不同的LayoutManager?x)在属性编辑器中显CZ同的参数Q如果选择GridLayoutQ属性编辑器中的layout属性将昄另外几种不同的参敎ͼ如下囑֦C:(x)
  




JAVA之\ 2006-05-03 23:56 发表评论
]]>
用Eclipseq行可视化Java界面设计(2) http://www.tkk7.com/xixidabao/archive/2006/05/03/44484.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:55:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44484.html  先前的FlowLayout的三个参数alignment, horizontal gap和vertical gap变成?jin)GridLayout的另外四U参敎ͼ(x)columns, horizontal gap, rows, vertical gap?br />  
  Z(jin)方便设计Q笔者在q个例子中将采用nullQ即不用MLayoutManager来设计界面?br />  
  布局讄好后Q就可以在JPanel上摆|各USwinglg?jin)。按照我们最开始设计的草图Q界面上要摆上四个LabelQFrom, To, Subject, Message。以?qing)四个文本组Ӟ其第四个应该是TextArea, 用于~辑多行文本。我们在工具面板上选好相关lgQ然后在JPanel上拖选出一个矩形,lgx(chng)相应大小和位|显C在此矩形区域。再?属?视图中编辑每个JLabel和JButton?text"属性ؓ(f)相应的倹{现在来看看下面W??出来的界面:(x)
   
  看看Q设计的如何Q笔者不是画Ӟ"?出来的界面显得有些凌乱。没关系QVE也提供一些工h钮来让我们调整各个组件的位置。请点击VE工具栏上?Show alignment window"按钮Q?br />   
  昄如下囄视窗Q?br />   
  通过此视H,可以所选组件向上下左右各个方向寚w。还可以使所选组件具有相同高度和宽度。来看看下图l过调整位置后的界面布局Q?br />   
  现在看v来是不是观多了(jin)Q?br />  
  d事g处理
  
  l过前面的步骤,VE的可视化设计的Q务就基本上完成了(jin)。在我们设计的界面中Q有"Send"?Clear"按钮。我们再来看看VE是如何ؓ(f)它们d事g处理的?br />  
  在设计界面的"Send"按钮上点击鼠标右键,弹出菜单Q如下图Q?br />   
  ?Event"菜单中Q可以看C?actionPerformed"事g。如果要d其它cd的事Ӟ可以点击"Add Events"选择其它cd的事件。我们点?actionPerformed"事g后,?Java Beans"视图?jButton-"Send""lg下面Q多?jin)一?actionPerformed"事gcdQ如下图所C:(x)
   
  ?Java Beans"视图中,选中"actionPerformed"事gQ再VE的窗口中Q从"Design"切换?Source"视图?br />   
  在上图标?的代码区域,是我们刚刚d的按钮事件。笔者在事g中调用了(jin)一个sendҎ(gu)Q如图中标记2代码区域。具体的发送邮件的代码W者在q里׃实现?jin)?br />  
  同样的方法,一样可以ؓ(f)另一个按?Clear"d事g?br />  
  在程序中使用自定义的lg
  
  在前面我们设计好?jin)自qJavalgQ现在我们来看看如何在自qE序中――一个窗口中来调用这个组件?br />  
  使用前面介绍的方法,在工h上点?新徏Javac?按钮Q徏立一个JFrame的Visual ClasscR你也可以在通过菜单"文g"->"新徏"->"Visual Class"来寻一个JFramecR在q里Q我们将q个cd名ؓ(f)"MyApp"?br />  
  当VEH口出现Ӟ可以看到一个空白的JFrame昄在设计视图中。此Ӟ点击VE的工具面板上? Choose Bean"按钮Q然后在弹出的对话框中输入我们设计的Javalg的类?MessagePane"Q再点击"定"。这Ӟ当我们的鼠标UdJFrame上时QJFrame?x)用l色的线条切分成五䆾Q如下图所C:(x)
  
  q是因ؓ(f)JFrame的预设LayoutManager是BorderLayoutQ在VE中,如果在工具面板上选好JavalgQ当鼠标Ud有特定LayoutManager的容器组件上Ӟ在上图中容器lg是一个JFrameQ,VE?x)用适当的Ş式指CZ当前鼠标(zhn)停的位|。在上图在VE告诉我们现在处在BorderLayout的中?j)位|,此时再在该位|点Mơ,我们选好的Javalg卛_攑ֈ此位|?br />  
  用VE设计好程序界面,可以切换到"Source"视图q行具体的代码的~码?jin)。在此我们就不篏qC(jin)?br />  
  定制VE的环?/b>
  
  之前的讲解,大家学到?jin)如何用VE来进行可视化的Java界面设计。ؓ(f)?jin)适应不同的开发者,VE也提供了(jin)一些选项来让开发者设计自己喜好的VE环境?br />  
  h开菜单"H口"->"首选项"->"Java"->"Visual Editor"Q此时出现VE的各U首选项界面。由于笔者安装的eclipse中文语言包早于VE发布Q所以此界面仍然是英文界面。在q里QVE的首选项分ؓ(f)三类Q?Appearance"Q?Code Generation"Q?Pattern Style"。下面结合图形分别介l:(x)
  
  1Q外?Appearance)讄Q?br />  
  此面板中可以讄q此内容Q?br />  
  (1) 讄可视~辑器和源代码编辑器的布局Q一U是上下分隔的布局Q另一U是用页{进行切换的布局(x(chng)文例图中所见到的样??br />  
  (2) 讄是否昄"属?视图?Java Beans"视图?br />  
  (3) 讄设计时Swing的界面风根{?br />  
  2Q代码生?Code Generation)讄
  
  此面板包括以下内容:(x)
  
  (1) 讄是否为新表达式生成注释和try{}…catch()块?br />  
  (2) 讄可视设计界面和代码编辑器之间的代码同步时间?br />  
  3Q代码模杉K?Pattern Style)讄
  
  此面板包括以下内容:(x)
  
  (1) VE所用的存取Java Bean的代码风根{?br />  
  (2) VE初始化时试使用的初始化Ҏ(gu)。VE目前已提供了(jin)对Jbuilder、NetBean{其它IDE产品可视~辑器生成的Javalg代码初始化方式的支持?br />  
  ȝ
  
  行文x(chng)Q我们从VE的安装到Javalg设计以及(qing)VE环境的设|,基本上已对eclipse的全新工具Visual Editor作了(jin)一个全面的?jin)解。有?jin)Visual EditorQ我们所有的开发工作,从图形用L(fng)面到业务逻辑Q全部可以在eclipseq_上完成?




JAVA之\ 2006-05-03 23:55 发表评论
]]>
SWT代码研究(2) http://www.tkk7.com/xixidabao/archive/2006/05/03/44483.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:50:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44483.html  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  public class SWTHello {
  public static void main(String[] args) {
  /*
  * Display的实例用于管理SWT与底层操作系l的q接Q其
  * 最重要的功能是Ҏ(gu)q_的事件处理模型实现SWT的event
  * loopQ一般来_(d)只要一个Display的实例就可以?jin)?br />  * 注意Q在创徏Mwindow前(Shell实例Q需创徏Display实例Q?br />  * 在Shell实例关闭旉掉Display实例
  */
  Display display = new Display();
  
  /*
  *Shell是作ZH口
  */
  Shell shell = new Shell(display);
  /*
  * SWT.NONE是Sytle bitQ用于表明widget的style
  */
  Label label = new Label(shell,SWT.NONE);
  label.setText("Hello");
  shell.pack();
  label.pack();
  shell.open();
  while(!shell.isDisposed())
  {
  if(!display.readAndDispatch())
  display.sleep();
  }
  shell.dispose();
  }
  }
  
  关于Resource的Disposal
  1、如果你用构造函数创Z(jin)widget或者graphic对象Q当你不需要时你必L动地dispose掉它;
  2、如果你不是使用构造函数得到这个widget或者graphic对象Q由于不是你allocate的,你不需要手动来dispose掉它;
  3、如果你传递一个widget或者graphic对象的referencel另一个对象,那么你必d?j),不要在它仍在被用中dispose掉它;
  4、当你close掉一个shellQ那么这个shell?qing)其子widget?x)被递归dispose掉的Q虽然你不需再dispose掉那些widgetQ但是你必须free掉与q些widget相关的图像资?
  5、如果在一个widget的生命期中创Z(jin)graphic对象Q可以通过注册一个dispose listener来freeq个graphic对象Q不q数据对象如Rectangle和Point没有使用操作pȝ资源Q不用手动dispose(它们也没有disposeҎ(gu)).




JAVA之\ 2006-05-03 23:50 发表评论
]]>
Java桌面应用E序设计QSWT ?http://www.tkk7.com/xixidabao/archive/2006/05/03/44482.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:49:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44482.html

  Java语言的声望和它在桌面应用E序QGUIE序Q所取得的成显然极不相W,至今仍然很少能看到非常成功Java桌面E序。虽然有JBuilderQNetbeanQJProbe{大型Y件作Z表,但这仍不能证明Java的GUIE序是成功的Q它们的外观L和同一操作pȝq_下的其它软g昑־格格不入。对机器配置的需求也g永无止境Q这使得它们只能被一些L拥有当前最高性能PC的程序员?sh)所容忍Q或是那些不在乎金钱和时间的专业用户所接受。对l大多数计算Z用者来_(d)AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget ToolkitQSWTQ或许是Javaq一噩梦的终l者,q大JavaE序员终于可以开发出高效率的GUIE序Q它们拥有标准的外观Q几乎没有h能看Z的程序是用Java写出来的Q更为重要的是,q些E序是跨q_的?br />  
  SWT本n仅仅是Eclipsel织Z(jin)开发Eclipse IDE环境所~写的一l底层图形界?API。或许是无心(j)插柳Q或是有意ؓ(f)之,至今为止QSWT无论是在性能和外观上Q都越?jin)SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到?.1版本QSWT已经十分E_。这里指的稳定应该包含两层意思:(x)
  
  一是指性能上的E_Q其中的关键是源于SWT的设计理c(din)SWT最大化?jin)操作系l的囑Ş构gAPIQ就是说只要操作pȝ提供?jin)相应图形的构gQ那么SWT只是单应用JNI技术调用它们,只有那些操作pȝ中不提供的构ӞSWT才自己去做一个模拟的实现。可以看出SWT的性能上的E_大多时候取决于相应操作pȝ囑Ş构g的稳定性?br />  
  另一个稳定是指SWT API包中的类、方法的名称和结构已l少有改变,E序员(sh)用担?j)由于Eclipsel织开发进度很快(Eclipse IDE每天都会(x)有一个Nightly版本的发布)(j)Q而导致自qE序代码变化q大。从一个版本的SWT更新臛_一版本Q通常只需要简单将SWT包换掉就可以?jin)?br />  
  W一个SWTE序
  下面让我们开始一个SWTE序。(注意Q以下的例子和说明主要针对Windowsq_Q其它的操作pȝ应该大同异Q。首先要在Eclipse安装文g中找到SWT包,Eclipsel织q不提供单独的SWT包下载,必须下蝲完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse开发环境的一个插件Ş式存在,可以??jng)你的eclipse安装路径}\plugins路径下的众多子目录下L索SWT.JAR文gQ在扑ֈ的JAR文g中包含了(jin)SWT全部的JavacL件。因为SWT应用?jin)JNI技术,因此同时也要扑ֈ相对应的JNI本地化库文gQ由于版本和操作q_的不同,本地化库文g的名UC(x)有些差别Q比如SWT-WIN32-2116.DLL是Windowq_下Eclipse Build 2116的动态库Q而在Unixq_相应版本的库文g的扩展名应该?soQ等{。注意的是,Eclipse是一个开放源代码的项目,因此你也可以在这些目录中扑ֈSWT的源代码Q相信这?x)对开发很有帮助。下面是一D|开I窗口的代码(只有mainҎ(gu))?br />  
  import com.e2one.example;
  public class OpenShell{
  public static void main(String [] args) {
  Display display = new Display();
  Shell shell = new Shell(display);
  shell.open();
  // 开始事件处理@环,直到用户关闭H口
  while (!shell.isDisposed()) {
  if (!display.readAndDispatch())
  display.sleep();
  }
  display.dispose();
  }
  }
  
  信在CLASSPATH中包括了(jin)SWT.JAR文gQ先用Javac~译例子E序。编译无错后可运行java -Djava.library.path=${你的SWT本地库文件所在\径} com.e2one.example.OpenShellQ比如SWT-WIN32-2116.DLL件所在的路径是C:\swtlibQ运行的命o(h)应该是java -Djava.library.path=c:\swtlib com.e2one.example.OpenShell。成功运行后Q系l会(x)打开?jin)一个空的窗口?br />  
  剖析SWT API
  下面再让我们q一步分析SWT API的组成。所有的SWTc都用org.eclipse.swt做ؓ(f)包的前缀Q下面ؓ(f)?jin)简化说明,我们?号代表前~org.eclipse.swtQ比?.widgets包,代表的是org.eclipse.swt.widgets包?br />  
  我们最常用的图形构件基本都被包括在*.widgets包中Q比如ButtonQComboQTextQLabelQSashQTable{等。其中两个最重要的构件当数Shell和Composite。Shell相当于应用程序的ȝ口框Ӟ上面的例子代码中是应用Shell构g打开一个空H口。Composite相当于SWING中的Panel对象Q充当着构g容器的角Ԍ当我们想在一个窗口中加入一些构件时Q最好到使用Composite作ؓ(f)其它构g的容器,然后再去*.layout包找ZU合适的布局方式。SWTҎ(gu)件的布局也采用了(jin)SWING或AWT中Layout和Layout Datal合的方式,?.layout包中可以扑ֈ四种Layout和与它们相对应的布局l构对象QLayout DataQ。在*.custom包中Q包含了(jin)对一些基本图形构件的扩展Q比如其中的CLabelQ就是对标准Label构g的扩展,上面可以同时加入文字和图片,也可以加Ҏ(gu)。StyledText是Text构g的扩展,它提供了(jin)丰富的文本功能,比如Ҏ(gu)D|字的背景艌Ӏ前景色或字体的讄。在*.custom包中也可扑ֈ一个新的StackLayout布局方式?br />  
  SWT对用h作的响应Q比如鼠标或键盘?sh)gQ也是采用了(jin)AWT和SWING中的Observer模式Q在*.event包中可以扑ֈ事g监听的Listener接口和相应的事g对象Q例如常用的鼠标事g监听接口MouseListenerQMouseMoveListener和MouseTrackListenerQ及(qing)对应的事件对象MouseEvent?br />  
  *.graphics包中可以扑ֈ针对囄、光标、字体或l图的API。比如可通过Imagec调用系l中不同cd的图片文件。通过GCcd现对囄、构件或昄器的l图功能?br />  
  对不同^収ͼEclipseq开发了(jin)一些富有针Ҏ(gu)的API。例如,在Windowsq_Q可以通过*.ole.win32包很Ҏ(gu)的调用ole控gQ这使JavaE序内嵌IE览器或Word、Excel{程序成为可能!
  
  更复杂的E序
  下面让我们展CZ个比上面例子更加复杂一些的E序。这个程序拥有一个文本框和一个按键,当用L(fng)?yn)L键的时候,文本框显CZ句欢q信息?br />  
  Z(jin)文本框和按键有比较合理的大小和布局Q这里采用了(jin)GradLayout布局方式。这U布局是SWT中最常用也是最强大的布局方式Q几乎所有的格式都可能通过GradLayout去达到。下面的E序也涉?qing)到了(jin)如何应用系l资?Color)Q以?qing)如何释攄l资源?br />  
  private void initShell(Shell shell) {
  //为Shell讄布局对象
  GridLayout gShellLay = new GridLayout();
  shell.setLayout(gShellLay);
  //构造一个Composite构g作ؓ(f)文本框和按键的容?br />  Composite panel = new Composite(shell,SWT.NONE);
  //为Panel指定一个布局l构对象?br />  q里让Panel可能的占满ShellQ?br />  也就是全部应用程序窗口的I间?br />  GridData gPanelData = new GridData(GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
  panel.setLayoutData(gPanelData);
  //为Panel也设|一个布局对象。文本框和按键将按这个布局对象来显C?br />  GridLayout gPanelLay = new GridLayout();
  panel.setLayout(gPanelLay);
  //为Panel生成一个背景色
  final Color bkColor = new Color(Display.getCurrent(),200,0,200);
  panel.setBackground(bkColor);
  //生成文本?br />  final Text text = new Text(panel,SWT.MULTI|SWT.WRAP);
  //为文本框指定一个布局l构对象Q?br />  q里让文本框可能的占满Panel的空间?br />  GridData gTextData = new GridData (GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
  text.setLayoutData(gTextData);
  //生成按键
  Button butt = new Button(panel,SWT.PUSH);
  butt.setText("Push");
  //为按键指定鼠标事?br />  butt.addMouseListener(new MouseAdapter(){
  public void mouseDown(MouseEvent e){
  //当用L(fng)?yn)L键的时候,昄信息
  text.setText("Hello SWT");
  }
  });
  //当主H口关闭Ӟ?x)触发DisposeListener。这里用来释放Panel的背景色?br />  shell.addDisposeListener(new DisposeListener(){
  public void widgetDisposed(DisposeEvent e) {
  bkColor.dispose();
  }
  });
  }
  
  把这D代码中的方法initShell()加入到第一个打开I窗口的例子中,得到的是一D能成功q行的完整GUI应用E序。运行方法可参考第一个例子?br />  
  pȝ资源的管?/b>
  在一个图形化的操作系l中开发程序,都要调用pȝ中的资源Q如囄、字体、颜色等。通常q些资源都是有限的,E序员务必非常小?j)的使用q些资源Q当不再使用它们Ӟp快释放Q不然操作系l迟早会(x)油尽灯枯Q不得不重新启动Q更严重的会(x)Dpȝ崩溃?br />  
  SWT是用Java开发的QJava语言本n的一大优势就是JVM?垃圾回收机制"Q程序员通常不用理会(x)变量的释放,内存的回收等问题。那么对SWT而言Q系l资源的操作是不是也是如此?{案是一个坏消息Q一个好消息?br />  
  坏消息是SWTq没采用JVM的垃圑֛收机制去处理操作pȝ的资源回攉题,一个关键的因素是因为JVM的垃圑֛收机制是不可控的Q也是说程序员?sh)能知道Q也不可能做到在某一时刻让JVM回收资源Q这对系l资源的处理是致命的Q试想你的程序希望在一个@环语句中L看数万张囄Q常规的处理方式是每ơ调入一张,查看Q然后就立即释放该图片资源,而后在@环调入下一张图片,q对操作pȝ而言QQ何时ȝ序占用的仅仅是一张图片的资源。但如果q个q程完全交给JVMd理,也许?x)是在@环语句结束后QJVM才会(x)去释攑֛片资源,其结果可




JAVA之\ 2006-05-03 23:49 发表评论
]]>
用JFace和SWT构徏单的应用E序(2) http://www.tkk7.com/xixidabao/archive/2006/05/03/44481.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:47:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44481.html  实现 Explorer c?/b>
  我们采?Hello, World E序Q更改其名称Q然后用 createContents() Ҏ(gu)创徏 TreeViewerQ而不是创Z个按钮)(j)Q将其内Ҏ(gu)供程序设|ؓ(f)我们的文件树(wi)内容提供E序Q然后将输入讄到某个文件夹。在q个例子中,我选择的文件夹?C: 驱动器中的顶U文件夹?br />  
  注:(x)需要从 createContents() q回 SWT H口构g。正如前面提到的QJFace Tree Viewer 不是 SWT H口构gQ因此我们不能将它返回。我们需要从?wi)查看器获取真正的窗口构件。我们通过使用 getTree() 做到q一炏V我们的ȝ口类现在看v来与下面怼Q?br />  
  清单 5. ExplorerQ版?1Q?br />  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  public class Explorer extends ApplicationWindow
  {
  public Explorer()
  {
  super(null);
  }
  protected Control createContents(Composite parent)
  {
  TreeViewer tv = new TreeViewer(parent);
  tv.setContentProvider(new FileTreeContentProvider());
  tv.setInput(new File("C:\\"));
  return tv.getTree();
  }
  public static void main(String[] args)
  {
  Explorer w = new Explorer();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  q行该程序,(zhn)将看到与图 8 怼的结果?br />  
 

  
?8. ExplorerQ版?1Q?/center>
  
  除了(jin)h文g代码Q我们只需?Hello, World E序d 9 行代码就可做到这一炏V正如?zhn)可能猜想的那PE序?File ?toString() Ҏ(gu)来显C些文Ӟq不是我们真正想要的。要改变q一点,我们需要提供一个标{提供程序?br />  
  实现标签提供E序
  正如有一个内Ҏ(gu)供程序对象可用来获取?wi)节点的子元素一P当需要实际显C些节Ҏ(gu)Q树(wi)查看器有另一个助手对象:(x)标签提供E序。和前面一P我们需要设|它Q?br />  
  public void setLabelProvider(IBaseLabelProvider labelProvider)
  
  而且需要实C面的Ҏ(gu)以返回要为每个元素显C的文本Q?br />  
  public String getText(Object element)
  
  如果我们标{提供程序添加到?wi)查看器图中Q就?x)得到?9?br />  
 

  
?9. 昄内容提供E序和标{提供程序的?wi)查看?/center>
  
  我们可以实现接口 ILabelProviderQ但缺省实?LabelProvider 子类化更Ҏ(gu)Q如果没有显式地讄标签提供E序Q则使用的就是这个类Q。我们希望利?getText() 做的事是q回文g名最后的部分 ?相对文g名而非 toString() ~省使用的绝Ҏ(gu)件名。图 6 演示?jin)代码?br />  
  ?6. FileTreeLabelProviderQ版?1Q?br />  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  public class FileTreeLabelProvider extends LabelProvider
  {
  public String getText(Object element)
  {
  return ((File) element).getName();
  }
  }
  
  而且我们必须记得使树(wi)查看器用这个标{提供程序,如清?7 所C?br />  
  清单 7. ExplorerQ版?2Q?br />  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  public class Explorer extends ApplicationWindow
  {
  public Explorer()
  {
  super(null);
  }
  protected Control createContents(Composite parent)
  {
  TreeViewer tv = new TreeViewer(parent);
  tv.setContentProvider(new FileTreeContentProvider());
  tv.setLabelProvider(new FileTreeLabelProvider());
  tv.setInput(new File("C:\\"));
  return tv.getTree();
  }
  public static void main(String[] args)
  {
  Explorer w = new Explorer();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  q一ơ运行该E序Ӟ我们?x)获得更清楚的视觉效果,如?10 所C?br />  
 

  
?10. ExplorerQ版?2Q?/center>
  
  我们现在要做的是树(wi)查看器移到左边,一个表查看器放在右边,以显C在?wi)查看器中已选中的文件夹中的文g列表?br />  
  使用表查看器
  Z(jin)处理表,JFace 有一?TableViewer。和 TreeViewer 一P它有输入Q根对象Q、内Ҏ(gu)供程序和标签提供E序。它比树(wi)查看器简单,因ؓ(f)它不需要处理树(wi)。图 11 演示?jin)内?gu)供程序和标签提供E序?br />  
 

  
?11. 昄内容提供E序和标{提供程序的表查看器

  讄输入对象的方法与前面相同Q?br />  
  TableViewer: void setInput(Object rootElement)
  
  实现文g表查看器内容提供E序
  让我们考虑内容提供E序。这一ơ,根元素比?wi)查看器根元素简单。表查看器仅仅期望根对象有许多子元素Q因此要实现的唯一有趣Ҏ(gu)是获取子元素的方法:(x)
  
  public Object[] getElements(Object rootElement)
  
  要实现的接口?IStructuredContentProvider?br />  
  根对象是一个文件夹Q其子元素是该文件夹包含的文Ӟ文g夏V因此我们的文g表内Ҏ(gu)供程序类与清?8 cM?br />  
  清单 8. FileTableContentProviderQ版?1Q?br />  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  public class FileTableContentProvider implements IStructuredContentProvider
  {
  public Object[] getElements(Object element)
  {
  Object[] kids = null;
  kids = ((File) element).listFiles();
  return kids == null ? new Object[0] : kids;
  }
  public void dispose()
  {
  }
  public void inputChanged(Viewer viewer, Object old_object, Object new_object)
  {
  }
  }
  
  因此我们现在有两个查看器Q树(wi)查看器和表查看器。ؓ(f)?jin)将它们盔R地安|在一P我们创徏?SWT SashForm H口构g。该H口构g用一个用户可以调节的Ҏ(gu)分隔其子元素。然后,我们树(wi)和表d到框D单(sash formQ(?12Q?br />  
 

  
?12. 包含?wi)查看器和表查看器的框格表?/center>
  
  接下来要做的是表查看器查看用户在树(wi)查看器中选中的每个文件夹。要做到q一点,我们必须侦听事g?br />  
  侦听事g
  当用户在?wi)查看器中选中一Ҏ(gu)Q树(wi)查看器发?SelectionChangedEvent 事g。我们需要侦听该事gQ当发出该事件时Q需要将表的输入讄为树(wi)查看器中当前选中的文件。ؓ(f)?jin)侦听来自?wi)查看器的选择更改事gQ我们用下面的Ҏ(gu)Q?br />  
  public void addSelectionChangedListener
  (ISelectionChangedListener listener)
  
  当用户选中Q取消选中?wi)查看器中的节点Ӟ用下面的?gu)调用选择更改侦听器:(x)
  
  public void selectionChanged(SelectionChangedEvent event)
  
  Z(jin)实现该侦听器c,我们在主资源管理器H口中编码一个匿名类。在 selectionChanged() Ҏ(gu)中,我们需要获得刚选中的对象,q其成查看器的输入。将所有的工作l合在一P得C(jin)清单 9?br />  
  清单 9. ExplorerQ版?3Q?br />  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.custom.*;
  import org.eclipse.swt.widgets.*;
  public class Explorer extends ApplicationWindow
  {
  public Explorer()
  {
  super(null);
  }
  protected Control createContents(Composite parent)
  {
  SashForm sash_form = new SashForm(parent, SWT.HORIZONTAL | SWT.NULL);
  TreeViewer tv = new TreeViewer(sash_form);
  tv.setContentProvider(new FileTreeContentProvider());
  tv.setLabelProvider(new FileTreeLabelProvider());
  tv.setInput(new File("C:\\"));
  final TableViewer tbv = new TableViewer(sash_form, SWT.BORDER);
  tbv.setContentProvider(new FileTableContentProvider());
  tv.addSelectionChangedListener(new ISelectionChangedListener()
  {
  public void selectionChanged(SelectionChangedEvent event)
  {
  IStructuredSelection selection =
  (IStructuredSelection) event.getSelection();





JAVA之\ 2006-05-03 23:47 发表评论
]]>用JFace和SWT构徏单的应用E序(1) http://www.tkk7.com/xixidabao/archive/2006/05/03/44480.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:44:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44480.html  ?/b>
  开放源?Eclipse 目?Java 领域中最有趣的新q开发项目之一。Eclipse 把自己描q成“一U通用的工具^??开攄可扩?IDEQ可用于M用途且没有Ҏ(gu)之处”。它的两个主要组件是名ؓ(f) SWT 的图形库和与其匹配的名ؓ(f) JFace 的实用程序框架?br />  
  SWT 是一个窗口构仉和图形库Q它集成于本机窗口系l但有独立于 OS ?API?br />  
  JFace 是用 SWT 实现?UI 工具,它简化了(jin)常见?UI ~程d。JFace 在其 API 和实现方面都是独立于H口pȝ的,它旨在?SWT 而不隐藏它。图 1 演示?Eclipse、JFace ?SWT 之间的关pR?br />  
 

  
?1. Eclipse Workbench、JFace ?SWT

  
  Hello, World
  
  让我们从我能惛_的最单的 JFace E序开始,逐步扩充它,其构徏为最常见的“Hello, World”程序?br />  
  清单 1. HelloQ版?1Q?br />  
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.widgets.*;
  public class Hello
  {
  public static void main(String[] args)
  {
  ApplicationWindow w = new ApplicationWindow(null);
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  q里我们创徏?jin)一个名?Hello 的类Q其?main Ҏ(gu)仅仅创徏?jin)一?ApplicationWindowQ然后打开它。setBlockOnOpen() ?open() dQ直到窗口关闭ؓ(f)止。在H口已关闭之后,我们获取当前?Display qd。这?x)释攑֜操作pȝ中用到的资源。当(zhn)运行该E序Ӟ(zhn)会(x)看到cM?2 的窗口:(x)
  
 

  
?2. HelloQ版?2Q?/center>
  
  是如此。它甚至没有说“Hello, World”。在修正它之前,让我们把话题转到 JFace H口?br />  
  JFace 应用E序H口
  H口是顶U窗口(换句话说Q由 OS H口理器管理的H口Q的 JFace cRJFace H口实际上不是顶U窗口的 GUI 对象QSWT 已经提供?jin)一个,名ؓ(f) ShellQ。相反,JFace H口是助手对象,它知道对应的 SWT Shell 对象Qƈ提供代码来帮助创建/~辑它,以及(qing)侦听它的事g{。图 3 演示?jin)(zhn)的代码、JFace ?SWT 之间的关pR?br />  
 

  
?3. (zhn)的代码、JFace Window ?SWT Shell 之间的关p?/center>
  
  事实上,q一模型是理?JFace 如何工作的关键。它q不真的?SWT 之上的层Q而且它没有试囑֐(zhn)隐?SWT。相反,JFace 意识到有几种使用 SWT 的常用模式,而且它提供了(jin)一些实用程序代码,以帮助?zhn)更方便地对这些模式编E。ؓ(f)?jin)做到这一点,JFace 提供可用的对象Q或提供可将其子cd的类Q有时它两者都提供Q?br />  
  管我们仅仅直接使用?jin)一?ApplicationWindowQ但实际上它们被设计为可以子cd也可以加入特定行为。它们有现成的菜单栏、工h、供(zhn)插入特定于应用E序的内容的区域和状态栏 ?全都是可选的。图 4 ?JFace File Explorer CZ本n演示?jin)这些区域?br />  
 

  
?4. 应用E序H口的各个部?/center>
  
  让我们改q?HelloQ它成?ApplicationWindow 的子cR更改的行在清单 2 中突出显C?br />  
  清单 2. HelloQ版?2Q?br />  
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.widgets.*;
  public class Hello extends ApplicationWindow
  {
  public Hello()
  {
  super(null);
  }
  public static void main(String[] args)
  {
  Hello w = new Hello();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  (zhn)编写的构造函数必调用超cL造函敎ͼ如往怸P(j)。让我们暂时不考虑该构造函数的参数。运行该E序的结果与前一个程序没有Q何不同。缺省情况下Q程序不?x)?f)我们昄M装饰性的东西。我们的E序要创Z个带有文本“Hello, World”的按钮。这个按钮要昄在内容(ContentsQ区域。要做到q一点,我们必须实现 Control createContents(Composite parent) Ҏ(gu)?br />  
  ApplicationWindow 在所有其它窗口构件已l创Z后但H口在屏q上昄之前调用该方法。参?parent 是代表内容区域的复合H口构g。这里的x(chng)是?zhn)创徏一个复合窗口构Ӟ其d?parentQ然后添加?zhn)的窗口构Ӟq返回?zhn)创徏的复合窗口构件。图 5 演示?jin)实例层ơ结构?br />  
 

  
?5. Application Window 的实例层ơ结?/center>
  
  我们的内容目前非常简单:(x)parent 下的单一按钮Q如清单 3 所C?br />  
  清单 3. HelloQ版?3Q?br />  
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  public class Hello extends ApplicationWindow
  {
  public Hello()
  {
  super(null);
  }
  protected Control createContents(Composite parent)
  {
  Button b = new Button(parent, SWT.PUSH);
  b.setText("Hello World");
  return b;
  }
  public static void main(String[] args)
  {
  Hello w = new Hello();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  l果是图 6
  
 

  
?6. HelloQ版?3Q?/center>
  
  q就是我们要实现的。我们?JFace 创徏的第一个“Hello, World”程序:(x)包含单一按钮的窗口。现在让我们l箋(hu)讨论文g资源理器这一话题。首先,我们创建显C文件夹层次l构的树(wi)查看器。?TreeViewer ?ApplicationWindow 一PTreeViewer 不是真正?SWT H口构gQ它也没有打向(zhn)隐?SWT H口构g。它使用 SWT ?wi)窗口构件来昄各项Qƈ且还?sh)用许多其它对象来协助它。不?ApplicationWindowQJFace TreeViewer q不旨在被子cd?br />  
  q里的想法是 TreeViewer 知道要显C的?wi)的根元素。当?dng)?zhn)必d诉它那个对象是什么:(x)TreeViewer: void setInput(Object rootElement)
  
  Z(jin)开始显C,?wi)查看器向根元素h子元素ƈ昄它们。然后,当用户展开其中的一个子元素Ӟ?wi)查看器向该节点h子元素,以此cL。实际上Qƈ不完全是那样。TreeViewer q不直接使用域对??而是使用另一个名?ContentProvider 的对象,q个对象才用域对象Q如?7 所C?br />  

  
?7. TreeViewer、ContentProvider 和域对象

  
  当然Q?zhn)必须实?ContentProvider。对?TreeViewerQ?zhn)的类必须实?ITreeContentProvider 接口。实?TreeContentProvider
  
  有六个方法需要实现。实际上我们不用做全部的工作Q只需实现其中的三个就行,因此Q本着“即时满意(instant gratificationQ”的_Q让我们暂时只考虑那几个方法吧。下面的代码演示?jin)?wi)查看器如何向内容提供E序h正好位于根元素下的顶U元素:(x)
  
  ITreeContentProvider: public Object[] getElements(Object element)
  
  随后Q每当它需要特定元素的子元素时Q它?yu)׃用以下方法?x)
  
  ITreeContentProvider: public Object[] getChildren(Object element)
  
  Z(jin)知道某个节点是否有子元素Q有的话?x)将加h到它旁边Q,?wi)查看器只需h该节点的子元素,然后?x)询问有多少子元素。万一(zhn)的代码需要更快捷的方法来做到q一点,则?zhn)必须实现另一个方法:(x)
  
  public boolean hasChildren(Object element)
  
  正如(zhn)所见,内容提供E序不持有对M域对象的引用。持有对q些域对象的引用的是?wi)查看器本nQ它把这些域对象作ؓ(f)参数传递给内容提供E序中的各个Ҏ(gu)。在我们的例子中Q节Ҏ(gu) File 对象。ؓ(f)获取子元素,我们使用 listFiles()。我们必记得要(g)?listFiles() 是否q回 nullQ然后其变成空数组。ؓ(f)?jin)获取顶U元素(正好位于根元素之下)(j)Q我们只需重用 getChildren() Ҏ(gu)?br />  
  getParent() Ҏ(gu)被用来实?reveal(Object element) Ҏ(gu)Q后者?wi)查看器滚动?SWT ?wi)窗口构Ӟ以便昄树(wi)中特定的节炏V问题是Q如果此d际上q没有显C那个节点,那么应该在哪里显C它QJFace ?x)寻扑օ父元素,以?qing)父元素的父元素等{,直到它达到已昄的节点,然后它再ơ回头寻找,直到目标节点已显C?br />  
  hasChildren() Ҏ(gu)只是做了(jin)显而易见(未优化)(j)的事情,最后我们有?jin)清?4 中所C的代码?br />  
  清单 4. FileTreeContentProviderQ版?1Q?br />  
  import java.io.*;
  import java.util.*;
  import org.eclipse.jface.viewers.*;
  public class FileTreeContentProvider implements ITreeContentProvider
  {
  public Object[] getChildren(Object element)
  {
  Ob




JAVA之\ 2006-05-03 23:44 发表评论
]]>用Eclipseq行可视化Java界面设计(1)http://www.tkk7.com/xixidabao/archive/2006/05/03/44479.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:38:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44479.html前言

  
  最q,Eclipse开源项目终于推Z(jin)期待已久的Visual Editor Project(VEP)。VE目使得功能强大的eclipseq_在java开发方面又增加?jin)一个可视化javalg开发利器。它让java开发者再也不用依赖其它的IDE产品来做GUI界面斚w的工作。所有的开发,从应用程序界面到业务逻辑的开发,现在都可以在eclipseq_上完成。本文将引导开发者如何安装配|ƈ使用Visual Editor?br />  
  关于Visual Editor
  
  开始介l之前,来看一个笔者用Visual Editor(以下UVE)设计的一个javaE序界面Q?br />   
  怎么P其可视化的界面设计,一点也不逊于其它的Java可视化界面开发工兗?br />  
  Visual Editor是一个开源的eclipse~辑器。它同JDT、PDE{其它eclipse的工具项目一P是一个全新的eclipse工具目。它可以q行可视化的~辑java GUIE序Q也能编辑可视化的Java Beanlg。它能与eclipse的Java Editor集成在一P当在Visual Editor中编辑图形界面时Q会(x)立即反馈到java Editor中的代码。反之亦然?br />  
  VE是一个可视化开发的一个frameworkQ当前版本的VE?.5.0RC1版,本版本的VE支持Swing和AWT的可视Javalg开发。由于这个framework设计的具有通用性,它也可以很容易的实现C++或其它语a下可视化开发。其来的版??.0开?Q将?x)支持SWT的开发。更多的关于Visual Editor的信息,L(fng)参考资料的相关链接?br />  
  下蝲与安?/b>
  
  ׃Visual Editor是用Ujava~写的,所以它应该可以在Q何操作系l上q行。但当前的VE版本?.5.0RC1Q只在windows和linuxq_上经q测试。所以如果你使用的是q两U操作系l之外的其它操作pȝQ你应该先阅读VE的readme文gQ安装和使用VE前,必须先安装以下版本的eclipse和相x(chng)持类库:(x)
  
  Eclipse build 2.1.2 (build page) (download zip)
  EMF build 1.1.1: (build page) (download zip)
  GEF Build 2.1.2: (build page) (download zip)
  
  Z(jin)方便中国的开发者,eclipse也提供了(jin)一个中文语a包,下蝲安装后,elcipse环境?yu)变成全中文的界面。在本文中,W者用的eclipse也安装了(jin)此中文语a包。之后就可以从以下地址下蝲Visual Editor?jin)?x)
  
  http://download.eclips.org/vep?
  
  下蝲后的VE是一个zip档案Q请其压羃包中plugins和features目录下的内容解压到eclipse安装目录的相应目录中卛_。如果你的eclipse是运行着的,请关闭ƈ重新启动eclipse?br />  
  开始一个设计Q?/b>
  
  现在Q所有程序安装完成,W者将用一个例子,来讲解Visual Editor的用。在q个例子中,W者要设计一个邮件发送面板,下面是它的草图:(x)
   
  此面板包括发送hQ接收hQ邮件主题,邮g内容以及(qing)发送和清除按钮Q?br />  
  q入Visual Editor
  
  启动eclipseq_。刚开始,你可能觉得eclipseq没有什么变化。先别急,hZ个项目,点击"文g"菜单下的"新徏"子菜单,选择q徏立一个新?java目"。然后在工具栏上?新徏Javac? 图标上,点击双的小头 Q将展开如下囄菜单Q?br />   
  在此菜单上,多了(jin)一?Visual Calss"的子菜单,q就是进入Visual Editor的入口之一。点?Visual Class"Q弹出如下的对话框:(x)
   
  在此对话框中Q要求输入类的名Uͼ如标记○1Q位|)(j)Q在q里我们输入"MessagePanel"Q以?qing)你惌l承的可视类Q如标记?位置Q。你可以选择l承来自swing或AWT的Q何界面组Ӟ如要l承其它cd的类Q请选择"other"q点?览"按钮来选择你要l承的类。在此处Q我们选择"panel"和Swing选项Q承JPanelQ然后点?完成"按钮Q大家就可以见到Visual Editor的界面了(jin)Q?br />   
  ׃eclipse工作台高度的可定制性,读者现在看到的界面qVE初始的布局Q而是l过W者按喜好的方式重新布局q的透视图,但是qƈ不会(x)影响读者理解本文内宏V?br />  
  如图?所C,是VE的工具面板,提供"选取"?框?{选择工具。还有SwinglgQSwing容器QSwing菜单以及(qing)AWT控g设计工具。在面板下方?Design"?Source"两个늭Q用来切换设计界面和Java源代码视图?br />  
  图中2是VE的工hQ包括工具面板中的一些常用按钮?br />  
  图中3?Java Beans"视图?属?视图Q两个视囑֏以切换显C?Java Beans"视图用树(wi)形结构即时显C计中用到的各UJava Beanlg层次。?属?视图昄昄当前所选中的Java beanlg的属性值列表,你可以在此列表中~辑各项Java Bean的属性倹{?br />  图中灰色矩Ş区域x(chng)我们最开始选择的JPanelQ所有的工作׃它开始?br />  
  摆设Swinglg
  
  做过Swing GUI界面设计的h都知道,Java应用E序界面上的元素位置是用LayoutManager来管理的。JPanel的预讑ָ局理器是FlowLayout。VE目前支持所有的传统的布局理器(q里所指的传统布局理器是指JDK1.4之前的布局理器。可惜的是VE目前q(sh)支持从JDK1.4开始有的SpringLayoutQ?br />  
  要设|JPanel的layoutQ请先在设计界面中选中JPanelQ再切换?属?视图Q找?layout"属性,如下图所C:(x)
   
  图中昄?jin)JPanel的预设LayoutManager。在"layout"属性的双Q可以通过点击l合框来指定不同cd的LayoutManager。不同的LayoutManager?x)在属性编辑器中显CZ同的参数Q如果选择GridLayoutQ属性编辑器中的layout属性将昄另外几种不同的参敎ͼ如下囑֦C:(x)
  




JAVA之\ 2006-05-03 23:38 发表评论
]]>Eclipse中用SWT和JFace开发入?/title><link>http://www.tkk7.com/xixidabao/archive/2006/05/03/44478.html</link><dc:creator>JAVA之\</dc:creator><author>JAVA之\</author><pubDate>Wed, 03 May 2006 15:33:00 GMT</pubDate><guid>http://www.tkk7.com/xixidabao/archive/2006/05/03/44478.html</guid><description><![CDATA[ <br /> <br /> <br />  可以使用标准H口部件工L(fng)QStandard Widget ToolkitQSWTQ和 JFace 库来开发用?Eclipse 环境的图形用L(fng)面,而且q可以将它们用于开发单独的 GUI 本机应用E序。在本文中,我将介绍一些基本的 SWTQ基?GUI 对象的名Uͼ(j)cdQƈ展示如何l合使用它们来创建有用的应用E序?br />  <br />  <b>关于 Eclipse、SWT ?JFace</b><br />  <br />  正如 Eclipse ?Web 站点上所提到的,Eclipse 是一U通用工具q_。它是一个开攄、可用于M东西的可扩展 IDEQ没什么特别之处,它ؓ(f)工具开发h员提供了(jin)灉|性以?qing)对软g技术的控制?br />  <br />  Eclipse 为开发h员提供了(jin)生大量 GUI 驱动的工具和应用E序的基。而这功能的基础是 GUI ?SWT ?JFace?br />  <br />  SWT 是一个库Q它创徏?jin)Java 版的本地L操作pȝ GUI 控g。它依赖于本机实现。这意味着Z SWT 的应用程序具有以下几个关键特性:(x)<br />  <br />  它们的外观、行为和执行cM于“本机”应用程序?br />  所提供的窗口小部gQwidgetQ反映了(jin)L操作pȝ上提供的H口部Ӟlg和控Ӟ(j)?br />  L GUI 库的MҎ(gu)行ؓ(f)都在 SWT GUI 中得到反映?br />  q些目标使得 SWT 不同?Java 技术的 SwingQSwing 的设计目标是消除操作pȝ的差异?br />  <br />  SWT 库反映了(jin)L操作pȝ的基本窗口小部g。在许多环境下,q种Ҏ(gu)太低U。JFace 库有助于?SWT 应用E序中添加大量服务。JFace q没有隐?SWTQ它只是扩展?SWT。正如?zhn)在q一pd的后面部分中看到的,SWT 最重要的扩展之一是,应用程序的数据模型与显C及(qing)更改它的 GUI 隔离开来?br />  <br />  在开始之前,我需要介l一?SWT 术语Q?br />  <br />  Widget —?基本?SWT GUI lgQ类g Java AWT 中的 Component ?Swing 中的 JComponentQ。Widget 是一个抽象类?br />  Control —?拥有操作pȝ的对{物的窗口小部gQ换句话_(d)在操作系l中h同一w䆾Q。Control 是一个抽象类?br />  Composite —?包含其他控g的控ӞcM?Java AWT 中的 Container ?Swing 中的 JPanelQ?br />  Item —?其他控g包含的窗口小部gQ该控g可能不是复合控gQ,比如列表和表。注意,包含一些项的控件很包含其他控Ӟ反之亦然。Item 是一个抽象类?br />  q些H口部件被安排在承层ơ结构中。参见图 1、图 2 和图 3Q了(jin)解它们是如何安排的。在?2 中,Basic1 cL来自本文的类Q而其他所有类都是标准?SWT H口部件?br />  <br />   <center>?1. SWT Widget ?/center><br />   <center> <img src="/imgfiles/2005.6.16.9.53.49.1.jpg" /></center><br />   <center>?2. SWT Composite ?/center><br />   <center> <img src="/imgfiles/2005.6.16.9.54.10.2.jpg" /></center><br />   <center>?3. SWT Item 列表</center><br />   <center> <img src="/imgfiles/2005.6.16.9.54.29.3.jpg" /></center><br />  注意QEclipse h跨^台特性(因此可以在许多操作^Cq行Q,本文Z Eclipse ?Microsoft? Windows? 版本。因此,本文包含的每个例子都应该能够不加M更改地在其他q_上用。还要注意的是,本文是基?Eclipse V3.0 的。Eclipse V3.1 中添加了(jin)许 GUI H口部件类型和Ҏ(gu)?br />  <br />  <b>基本控g</b><br />  <br />  几乎所?SWT GUI 都是从某些基部分开始创建的。所?SWT H口部仉可以?org.eclipse.swt.widget ?org.eclipse.swt.custom 包中扑ֈ。(一?Eclipse 插gq在其他包中提供?jin)定制的H口部件。)(j)H口部件包中包含一些基于操作系l控件的控gQ而定制包中则包含一些超出操作系l控仉之外的控件。一些定制的软g包控件类gH口部件包中的控g。ؓ(f)?jin)避免命名冲H,定制控g的名U都是以“C”开始的Q例如,比较 CLabel ?LabelQ?br />  <br />  ?SWT 中,所有控Ӟ除了(jin)一些高U控Ӟ比如 shellQ将在后面进行讨论)(j)在创建的时候都必须有一个父控gQ一个复合实例)(j)。在创徏的时候,q些控g被自动“添加”到父控件中Q这与必L添加到父控件中?AWT/Swing 中的控g有所不同Q自动添加生了(jin)一U“自上而下”地构?GUI 的方法。这P所有控仉可以采用一个复合父控gQ或者一个子c)(j)作ؓ(f)构造函数的参数?br />  <br />  大多数控仉有一些必d创徏时设|的标记选项。因此,大多数控件还有另外一个构造函数参敎ͼ我们通常UC为样式,该参数提供了(jin)讄q些选项的标记。所有这些参数值都?static final intQƈ且都是在 org.eclipse.swt 包的 SWT cM定义的。如果不需要Q何参敎ͼ则可以?SWT.NONE 倹{?br />  <br />  <b>标签</b><br />  <br />  标签可能是最单的控gQ标{?被用于显C纯文本Q没有颜艌Ӏ特D字体或样式的文本)(j)或称为图标的图像。标{不接受焦点Q换句话_(d)用户不能通过 Tab 键或鼠标Ud到标{)(j)Q因此,标签无法产生输入事g?br />  <br />  清单 1 展示?jin)如何创Z个简单的文本标签?br />  <br />  清单 1. 创徏一个带文本的标{?br />  <br />  import org.eclipse.swt.widget.*;<br />  :<br />  Composite parent = ...;<br />  :<br />  // create a center aligned label<br />  Label label = new Label(parent, SWT.CENTER);<br />  label.setText("This is the label text");<br />  <br />  注意Q该文本是采用不同于构造函数的单独的方法设|的。这是所?SWT 控g的一个典型象征。只有父控g和样式是在构造函C讄的,其他所有属性都是在已创建的对象上设|的?br />  <br />  ׃q_的限Ӟ标准标签控g不能同时拥有文本和图标。ؓ(f)?jin)支持同时拥有文本和图标Q可以?CLabel 控gQ如清单 2 中所C?br />  <br />  清单 2. 创徏一个包含文本和囑փ的标{?br />  <br />  import com.eclipse.swt.graphics.*;<br />  import org.eclipse.swt.widget.*;<br />  import org.eclipse.swt.custom.*;<br />  :<br />  Composite parent = ...;<br />  Image image = ...;<br />  :<br />  // create a left aligned label with an icon<br />  CLabel Clabel = new CLabel(parent, SWT.LEFT);<br />  label.setText("This is the imaged label text"");<br />  label.setImage(image);<br />  <br />  <b>文本</b><br />  <br />  在标{显C文本的同时Q?zhn)时常q想允许用户插入文本。文?控g是用于此目的的。文本可以是单行的(一个文本字D)(j)Q也可以是多行的Q一个文本区域)(j)。文本还可以是只ȝ。文本字D中没有描述Q因此,常常通过标签控g处理它们Q以定它们的用途。文本控件还可以包含一个“工hC”,提供关于控g用途的信息Q所有控仉支持q一Ҏ(gu))(j)?br />  <br />  清单 3 昄?jin)如何用允怋用的有限数量的特性来创徏一个简单的文本字段。选择默认文本是ؓ(f)?jin)便于擦除?br />  <br />  清单 3. 创徏一个包含选定的默认文本和一个限制条件的文本<br />  <br />  import org.eclipse.swt.widget.*;<br />  :<br />  Composite parent = ...;<br />  :<br />  // create a text field<br />  Text name = new Text(parent, SWT.SINGLE);<br />  name.setText("<none>");<br />  name.setTextLimit(50);<br />  name.setToolTipText("Enter your name -- Last, First");<br />  name.selectAll(); // enable fast erase<br />  <br />  <b>按钮</b><br />  <br />  通常Q?zhn)希望用户指出应该何时q行某项操作。最常见的做法是使用按钮 控g。存在以下几U样式的按钮Q?br />  ARROW —?昄Z个指向上、下、左、右方向的箭头?br />  CHECK —?已标记的复选标记?br />  FLAT —?没有凸v外观的按钮?br />  PUSH —?瞬时按钮Q最常见的事件源Q?br />  RADIO —?h排他性的_性标讎ͼsticky markQ,其他所有单选按钮都在相同的l中?br />  TOGGLE —?一个粘性按钮?br />  清单 4 创徏?jin)一个“Clear”按钮:(x)<br />  <br />  清单 4. 创徏一个按?br />  <br />  import org.eclipse.swt.widget.*;<br />  :<br />  Composite parent = ...;<br />  :<br />  // create a push button<br />  Button clear = new Button(parent, SWT.PUSH);<br />  clear.setText("Clea&r");<br />  <br />  名称中的 & D利用紧接着的一个字母创Z个加速器Q允?dng)R过 Ctrl+<字母> 序的方式按下按钮(控g序׃机操作系l决定)(j)?br />  <br />  <b>事g监听?/b><br />  <br />  通常Q?zhn)可能惛_选择按钮Q特别是某种推式按钮Q的时候执行一些操作。?zhn)可以通过向该按钮d一?SelectionListenerQ在 org.eclipse.swt.events 包中Q做到这一炏V当按钮状态发生改变时Q通常是按钮被按下Q,׃(x)生成事g。清?5 在单?Clear 按钮时输Z条消息?br />  <br />  清单 5. 按钮事g处理E序<br />  <br />  import org.eclipse.swt.events.*;<br />  :<br />  // Clear button pressed event handler<br />  clear.addSelectionListener(new SelectionListener() {<br />  public void widgetelected(selectionEvent e) {<br />  System.out.println("Clear pressed!");<br />  }<br />  public void widgetDefaultSelected(selectionEvent e) {<br />  widgetelected(e);<br />  }<br />  });<br />  <br />  <br />  此代码用了(jin)一个匿名的内部c,但?zhn)q可以用指定的内部cL单独的类作ؓ(f)监听器。多数包含两个或更多Ҏ(gu)?...Listener c还有一个类似的 ...Adapter c,q个cL供了(jin)一些空的方法实玎ͼq且可以减少(zhn)需要编写的代码数量。例如,q有一?SelectionAdapter c,q个cdC(jin) SelectionListener?br />  <br />  注意Q在q些Ҏ(gu)中执行的操作必须快速完成(通常不 ) <br /><br /><br /><strong>复合控g</strong><br /><br />  x(chng)Q我们已l讨Z(jin)一些单独的控g。在多数 GUI 中,许多控g被组合在一起以提供丰富的用户体验。在 SWT 中,q种l合是通过 Composite cd现的?<br /><br />  复合控g可以在Q何别上q行嵌套Qƈ且可以؜合和匚w控gQ将它们作ؓ(f)子控件进行组合。这样做可以极大地减?GUI 开发的复杂性,qؓ(f) GUI 代码重用Q通过装内部 GUIQ创造了(jin)Z(x)。复合控件可以是有边界的Qƈ且这些边界很Ҏ(gu)在视觉上产生hQ或者它们也可以是无边界的,无缝集成到更大的l中?<br /><br />  清单 6. 创徏一个有边界的复合控件?br /><br />  <b>?6. 创徏一个有边界的复合控?/b><br /><br /><table style="WIDTH: 902px; HEIGHT: 117px" bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code> import org.eclipse.swt.widget.*; : Composite parent = ...; : Composite border = new Composite(parent, SWT.BORDER); </code></pre></td></tr></tbody></table><br />  除了(jin)边界之外QGroup 复合子类q支持标题。在定义排他性按钮集合时Q组通常被用来包含单选类型的按钮?<br /><br />  清单 7 创徏?jin)一个有边界的组?br /><br />  <b>清单 7. 创徏一个有边界的组</b><br /><br /><table style="WIDTH: 905px; HEIGHT: 132px" bordercolor="#ffcc66" width="905" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code> import org.eclipse.swt.widget.*; : Composite parent = ...; : Group border = new Group(parent, SWT.SHADOW_OUT); border.setText("Group Description"); </code></pre></td></tr></tbody></table><br />  <strong>shell</strong><br /><br />  shell 是一U可能没有父复合控g的复合控Ӟ框架或窗口)(j)Q此外,它还有一个作为父控g?DisplayQ这通常也是默认讄。shell 有很多种样式Q但最常见的样式是 <code>SWT.SHELL_TRIM</code> ?<code>SWT.DIALOG_TRIM</code>。shell 可以是模态的Q也可以是非模态的。模?shell 常常用于对话框,防止?GUIQ如果有的话Q在关闭?shell 之前被处理?<br /><br />  清单 8 创徏?jin)一个框架样式的非模?shell?br /><br />  <b>清单 8. 创徏一个顶U?shell</b><br /><br /><table style="WIDTH: 910px; HEIGHT: 103px" bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code> import org.eclipse.swt.widget.*; : Shell frame = new Shell(SWT.SHELL_TRIM); : </code></pre></td></tr></tbody></table><br />  shell 可以有子 shell。这些子 shell 是与?shell 相关的独立桌面窗口(也就是说Q如果父 shell 关闭Q那么其所有子 shell 也将关闭Q?<br /><br />  清单 9 创徏?jin)一个对话框样式的子 shell?br /><br />  <b>清单 9. 创徏一个对话框 shell</b><br /><br /><table style="WIDTH: 918px; HEIGHT: 88px" bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code> : Shell dialog = new Shell(frame, SWT.DIALOG_TRIM); : </code></pre></td></tr></tbody></table><br />  参见?4 中具?SWT.SHELL_TRIMSee ?shellQ以?qing)?5 中具?SWT.DIALOG_TRIM ?shellQ了(jin)解这些值如何媄(jing)?shell 的整z性?<br /><br /><b>?4. h SWT.SHELL_TRIM ?shell</b><br /><img height="144" alt="h SWT.SHELL_TRIM ?shell" src="/imagelist/05/06/barh942b3t70.jpg" width="212" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /><br /><br /><b>?5. h SWT.DIALOG_TRIM ?shell</b><br /><img height="142" alt="h SWT.DIALOG_TRIM ?shell" src="/imagelist/05/06/799ln7o75050.jpg" width="183" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> (tng)<br /><br /><br /><strong>布局理?/strong><br /><br />  复合控g常常包含多个控g。可以用以下两U方法安排这些控Ӟ(x) <ol xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><li><b>l对定位</b> —?为每个控件设|明的 X ?Y 位置Qƈ通过代码讄一定的宽度和高度?<br /></li><li><b>托管定位</b> —?每个控g?X、Y、宽度和高度都是通过LayoutManager 讄的?</li></ol><br />  在多数情况下Q应该选择使用 LayoutManagersQ因为很Ҏ(gu)调整它们来适应可变大小?GUI。SWT 也提供了(jin)一些布局理器供(zhn)用;在这一期的pd文章中,我们讨ZU基本的布局理器:(x)FillLayout ?GridLayout。在q两U情况下Q每当重新设|复合控件的大小Q都需要进行定位?<br /><br />  一些布局理器常常是专ؓ(f)某一个复合控件分配的。一些布局理器只使用它们自n的参数就可以控制Q而另一些布局理器还需要其他参?—?LayoutDataQ该参数是在它们理的复合控件中的每个控件上指定的?<br /><br />  <strong>FillLayout</strong><br /><br />  FillLayout 以行或列的Ş式安排控件。每个控件所讄的大将与填充该复合控g所需的宽度和高度相同Q在q些控g之间Q空间是q_分配的。一U特D情冉|Q在仅有一个子控gӞ该控件的大小被设|ؓ(f)填充整个父复合控件的大小?br /><br />  <b>清单 10. 使用 FillLayout 创徏一列控?/b><br /><br /><table style="WIDTH: 881px; HEIGHT: 132px" bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code> import org.eclipse.swt.widget.*; import org.eclipse.swt.layouts.*; : Composite composite = ...; FillLayout fillLayout = new FillLayout(SWT.VERTICAL); composite.setLayout(fillLayout); </code></pre></td></tr></tbody></table><br />  <strong>GridLayout</strong><br /><br />  GridLayout 提供?jin)一个功能更强大的布局Ҏ(gu)Q该Ҏ(gu)cM于?HTML 表的Ҏ(gu)。它创徏?2-D |格的单元格。可以将控g攄在一个或多个单元gQ可以称之ؓ(f)单元D)(j)。单元格的大可以是相等的,或者是|格宽度或高度的某个l定可变癑ֈ比。可以将控gd到某一行的下一个可用列中,如果q一行中没有更多的列Q那么该控g移动到下一行的W一列中?<br /><br />  清单 11 创徏?jin)一个复合控Ӟ该控件有两行和两个列Q其中包含两个已标记的文本字Dc(din)这些列可以有不同的宽度?br /><br />  <b>清单 11. 创徏一个控件表</b><br /><br /><table style="WIDTH: 903px; HEIGHT: 222px" bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code> import org.eclipse.swt.widget.*; import org.eclipse.swt.layouts.*; : Composite composite = ...; GridLayout gridLayout = new GridLayout(2, false); composite.setLayout(gridLayout); Label l1 = new Label(composite, SWT.LEFT); l1.settext("First Name: "); Text first = new Text(composite, SWT.SINGLE); Label l1 = new Label(composite, SWT.LEFT); l2.setText("Last Name: "); Text last = new Text(composite, SWT.SINGLE); </code></pre></td></tr></tbody></table><br />  <strong>GridData</strong><br /><br />  考虑一下这U情况:(x)(zhn)需要指定每个控件如何用其单元g的剩余空间。ؓ(f)?jin)给每个单元格提供这U精控Ӟd?GridLayout 的托复合控件的控g可以拥有 GridData 实例QLayoutData 的子c)(j)?<br /><br />  清单 12 讄?jin)这些文本字D,以便采用所有可用的剩余I间Q根据前面的清单Q?br /><br />  <b>清单 12. 配置一个扩展到所有可用空间的布局</b><br /><br /><table style="WIDTH: 907px; HEIGHT: 72px" bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code>first.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); last.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); </code></pre></td></tr></tbody></table><br />  <strong>构徏一个运行程?/strong><br /><br />  现在是时候来看一下我们已l在单的可执行例?Basic1 中讨的所?SWT 控g?jin)。请参阅 参考资料,以获得该应用E序的完整源代码?br /><br />  SWT GUI 需要一个已配置好的环境来运行。这个环境是通过一个显C实例提供的Q该实例提供?jin)对L操作pȝ昄讑֤的访问。这个显C实例允许?zhn)处理每个用户输入Q鼠标或键盘Q来处理(zhn)的 GUI?<br /><br />  清单 13 创徏?jin)一个环境和一?GUIQƈ昄?jin)这?GUI?br /><br />  <b>清单 13. 创徏一?GUI 应用E序q启动它</b><br /><br /><table style="WIDTH: 891px; HEIGHT: 312px" bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td><pre><code> import org.eclipse.swt.widget.*; : Display display = new Display(); Shell shell = new Shell(display); shell.setText("Shell Title"); // *** construct Shell children here *** shell.open(); // open shell for user access // process all user input events while(!shell.isDisposed()) { // process the next event, wait when none available if(!display.readAndDispatch()) { display.sleep(); } } display.dispose(); // must always clean up </code></pre></td></tr></tbody></table><br />  此代码创Z(jin)一个类g?6 的窗口?<br /><br /><b>?6. CZ应用E序</b><br /><img height="223" alt="SWT 应用E序" src="/imagelist/05/06/7c8j2ho39iz6.jpg" width="362" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /><br /><br />  <b>l束?/b><br /><br />  ?<font face="System">SWT ?JFace</font> pd的第一期中Q我们介l了(jin)大多数基?SWT H口部件控Ӟ(x)标签、文本、按钮、复合控件和 shell。这些控Ӟ与显C类Qdisplay classQ相l合Q允许创建全功能?GUI?<img src ="http://www.tkk7.com/xixidabao/aggbug/44478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixidabao/" target="_blank">JAVA之\</a> 2006-05-03 23:33 <a href="http://www.tkk7.com/xixidabao/archive/2006/05/03/44478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>教你学会(x)Eclipse3.0的swt~程Ҏ(gu)http://www.tkk7.com/xixidabao/archive/2006/05/03/44476.htmlJAVA之\JAVA之\Wed, 03 May 2006 15:15:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/05/03/44476.html  Java语言的声望和它在桌面应用E序QGUIE序Q所取得的成显然极不相W,至今仍然很少能看到非常成功Java桌面E序。虽然有JBuilderQNetbeanQJProbe{大型Y件作Z表,但这仍不能证明Java的GUIE序是成功的Q它们的外观L和同一操作pȝq_下的其它软g昑־格格不入。对机器配置的需求也g永无止境Q这使得它们只能被一些L拥有当前最高性能PC的程序员?sh)所容忍Q或是那些不在乎金钱和时间的专业用户所接受。对l大多数计算Z用者来_(d)AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget ToolkitQSWTQ或许是Javaq一噩梦的终l者,q大JavaE序员终于可以开发出高效率的GUIE序Q它们拥有标准的外观Q几乎没有h能看Z的程序是用Java写出来的Q更为重要的是,q些E序是跨q_的?br />  
  SWT本n仅仅是Eclipsel织Z(jin)开发Eclipse IDE环境所~写的一l底层图形界?API。或许是无心(j)插柳Q或是有意ؓ(f)之,至今为止QSWT无论是在性能和外观上Q都越?jin)SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到?.1版本QSWT已经十分E_。这里指的稳定应该包含两层意思:(x)
  
  一、是指性能上的E_Q其中的关键是源于SWT的设计理c(din)?/b>
  
  SWT最大化?jin)操作系l的囑Ş构gAPIQ就是说只要操作pȝ提供?jin)相应图形的构gQ那么SWT只是单应用JNI技术调用它们,只有那些操作pȝ中不提供的构ӞSWT才自己去做一个模拟的实现。可以看出SWT的性能上的E_大多时候取决于相应操作pȝ囑Ş构g的稳定性?br />  
  另一个稳定是指SWT API包中的类、方法的名称和结构已l少有改变,E序员(sh)用担?j)由于Eclipsel织开发进度很快(Eclipse IDE每天都会(x)有一个Nightly版本的发布)(j)Q而导致自qE序代码变化q大。从一个版本的SWT更新臛_一版本Q通常只需要简单将SWT包换掉就可以?jin)?br />  
  二、Eclipse3.0的swt~程
  
  1.swt比awt和swing要快多,因ؓ(f)它是利用操作pȝ的界面组件生成UI的,在java桌面设计领域掀起一场革?br />  
  2.环境配置Q?br />  windowspȝ+eclipse3.0
  
  3.具体操作Q?br />  (1).新徏一java目Q命名swt,文gl构如下Q?br />  +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原代码如下:(x)
  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.BORD




JAVA之\ 2006-05-03 23:15 发表评论
]]>
在Eclipse中用SWT设计界面 http://www.tkk7.com/xixidabao/archive/2006/04/29/44071.htmlJAVA之\JAVA之\Sat, 29 Apr 2006 12:13:00 GMThttp://www.tkk7.com/xixidabao/archive/2006/04/29/44071.html

JAVA之\ 2006-04-29 20:13 发表评论
]]>
վ֩ģ壺 ޾Ʒ| ѹ18߹ۿ| Ӱѹۿ| ɫĻ߲| Ƶѹۿ| ޹av߲| ޾ƷƵ߹ۿ| һձþþ| ʮ˽վ| ƵƷ߹ۿ| ƷһƵ | պƷѵӰ| ޹Ʒ߹ۿ| һҹߴ| Ʒ޵һ| 91| aëƬ| ݺ޺ݺŷ2019| aëƬ100ѹۿ| vaþþþͬ | ޹þþۺ| һaɫëƬ| һĹ˾| ˳վ߹ۿ| þþŷղ| 99þ99ֻѷѾƷ| ޾Ʒ͵Բ | è˳վ߹ۿ| M ŷSSSS222| þѹۿƵ| þþþþaŷAV| 69xxѹۿƵ| ҹ˾Ʒɫ| ѹۿ˳վ| ˮƵwwwƵ| þþۺɫһ | Ļ޵һ| պëƬ޶Ƶۿ| A벥ëƬһ avavavëƬ | ޹Ƭ߹ۿ| ۲ӰԺѹۿ|