﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-BaNg-随笔分类-Java</title><link>http://www.blogjava.net/lifesting/category/29580.html</link><description>Just Do It!</description><language>zh-cn</language><lastBuildDate>Thu, 24 Feb 2011 05:09:01 GMT</lastBuildDate><pubDate>Thu, 24 Feb 2011 05:09:01 GMT</pubDate><ttl>60</ttl><item><title>开源项目诚招有偿兼职开发者(版主高抬贵手)</title><link>http://www.blogjava.net/lifesting/archive/2011/02/23/345015.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 23 Feb 2011 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2011/02/23/345015.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/345015.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2011/02/23/345015.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/345015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/345015.html</trackback:ping><description><![CDATA[各位Javaer，我最近在准备两个开源项目，一个是基于模板库的开发，另外一个是基于Linux的 CDN。工作量比较大，设计差不多已经完成，前期域名，服务器，分布式开发环境(Bug管理，持续集成，SVN，Wiki，Project Server等)也准备好了，预算也空出来了（开公司的钱)，现找热爱开源事业的理想主义者合作，团队成员如下： <br />
<br />
1 Java索引开发者1人 ：<br />
<br />
能够应用Apache Lucence 按照模型定义索引数据库（MySQL，Oracle，SQL Server)，XML文件，并调用相关接口能够以Web方式/XML方式呈现，熟悉中文分词，能够有合适的自定义词库最好。<br />
<br />
2 CDN管理控制端1人：<br />
因为CDN基于Linux下C/C++，管理控制将通过Java Socket完成管理控制程序与CDN的交互，所以要求你能够熟悉Java Socket，还能通过某种Java Web技术制作管理控制端Web界面。<br />
<br />
这两个项目将永久开源，但提供高级别的定制与咨询服务，如果你成为contributor，将有机会参与到项目分成中来。<br />
<br />
如果你对这两方面有很好的经验，比较闲，也愿意试水开源项目，欢迎报名，并附上你期望的报酬（按项目过程比例发放，可签协议)<br />
<br />
希望你最好在北京，这样我好经常请大家吃饭。<br />
<br />
动手后，将把开发过程中的点滴写成blog，放在blogjava.net，也算做一滴贡献:)<br />
<br />
联系<br />
mail: lifesting@gmail.com<br />
msn: step.in@hotmail.com<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/345015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2011-02-23 22:41 <a href="http://www.blogjava.net/lifesting/archive/2011/02/23/345015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个Java开发平台的考虑</title><link>http://www.blogjava.net/lifesting/archive/2009/07/06/285664.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Mon, 06 Jul 2009 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2009/07/06/285664.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/285664.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2009/07/06/285664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/285664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/285664.html</trackback:ping><description><![CDATA[1 工作流，包含工作流服务器与设计器，同时工作流与业务数据采用何种集成模式？<br />
<br />
2 数据库支持，支持DB-&gt;BO/DAO，也支持BO(模型)-&gt;DB，中间的映射过程采用何种技术？Annotation?XML Configuration?<br />
<br />
3 快速的项目向导，内置高度提炼的常规业务过程。<br />
<br />
4 友好的web支持，在平台确立开发流程之后，唯一飘忽不定的就是web front。这种支持的核心是将业务数据与前台技术通过某种方式绑定在一起，减少前台程序员的工作量/复工量。绑定的载体应该是一个 编辑器，WTP编辑器太烂。Dreamweaver应该是一个不错的选择。<br />
<br />
5 集成SPring+Hibernate，两个框架一是很优秀，再就是有很好的群众基础，绝大部分Java程序员都会一点。<br />
<br />
6 代码生成，提供一种可编程的代码生成机制，生成绝大部分可重用代码，同时强制某种代码实现模式，减少出错概率。<br />
<br />
7 上下文帮助，尽量提供类似于Visual Studio的帮助机制，减少平台操作陌生感。<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/285664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2009-07-06 12:05 <a href="http://www.blogjava.net/lifesting/archive/2009/07/06/285664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做了一个JSF表格组件，分享源代码！</title><link>http://www.blogjava.net/lifesting/archive/2009/07/04/285453.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Sat, 04 Jul 2009 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2009/07/04/285453.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/285453.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2009/07/04/285453.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/285453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/285453.html</trackback:ping><description><![CDATA[周二，我兴匆匆去老刘那演示RichFaces的Table控件，可老刘说了，RichFaces太复杂，不适合我们，且还有不少的bug(这些我无法考证:)。于是他拿出一个使用了一堆JSP+Servelet+Bean写的一个表格，跟说我，我很怀疑JSF能做出这个东西来，你使用纯JSF做一个一样的表格组件我就相信JSF能够用在开发平台(注:我是此Eclipse开发平台的兼职架构师)上。我心里琢磨，既然你是用JSP/Servlet搞出来的，而JSF是基于Servlet的技术，怎么可能实现不了呢？ 三天做出来！我一直相信，技术在于使用技术的人，而不是技术本身。<br />
<br />
<span style="font-size: 18pt;">
<span style="color: red;"><a href="http://gefexample.googlecode.com/files/jsftry.tar.gz">下载</a></span> </span><br />
<br />
先看图吧：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/09/table.jpg" border="1" height="761" width="625" /><br />
<br />
再看看对应的JSF标记<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;!</span><span style="color: rgb(255, 0, 255);">DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">html&nbsp;</span><span style="color: rgb(255, 0, 0);">xmlns</span><span style="color: rgb(0, 0, 255);">="http://www.w3.org/1999/xhtml"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:h</span><span style="color: rgb(0, 0, 255);">="http://java.sun.com/jsf/html"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:f</span><span style="color: rgb(0, 0, 255);">="http://java.sun.com/jsf/core"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:ui</span><span style="color: rgb(0, 0, 255);">="http://java.sun.com/jsf/facelets"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:cby</span><span style="color: rgb(0, 0, 255);">="http:/www.lifesting.com/jsf"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ui:composition&nbsp;</span><span style="color: rgb(255, 0, 0);">template</span><span style="color: rgb(0, 0, 255);">="/tpl.xhtml"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ui:define&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="pageTitle"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">表格展示</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">ui:define</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ui:define&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="pageHeader"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">国家</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">ui:define</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ui:define&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="body"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:form</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:panelGrid&nbsp;</span><span style="color: rgb(255, 0, 0);">columns</span><span style="color: rgb(0, 0, 255);">="1"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:message&nbsp;</span><span style="color: rgb(255, 0, 0);">for</span><span style="color: rgb(0, 0, 255);">="mytable"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">h:panelGrid</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:rns&nbsp;</span><span style="color: rgb(255, 0, 0);">text</span><span style="color: rgb(0, 0, 255);">="页面设置"</span><span style="color: rgb(255, 0, 0);">&nbsp;tableFor</span><span style="color: rgb(0, 0, 255);">="mytable"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:filter&nbsp;</span><span style="color: rgb(255, 0, 0);">text</span><span style="color: rgb(0, 0, 255);">="过滤策略"</span><span style="color: rgb(255, 0, 0);">&nbsp;tableFor</span><span style="color: rgb(0, 0, 255);">="mytable"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:delete&nbsp;</span><span style="color: rgb(255, 0, 0);">tableFor</span><span style="color: rgb(0, 0, 255);">="mytable"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:table&nbsp;</span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="mytable"</span><span style="color: rgb(255, 0, 0);">&nbsp;var</span><span style="color: rgb(0, 0, 255);">="rec"</span><span style="color: rgb(255, 0, 0);">&nbsp;checkable</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(255, 0, 0);">&nbsp;idField</span><span style="color: rgb(0, 0, 255);">="code"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean</span><span style="color: rgb(0, 0, 255);">="Country"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:column&nbsp;</span><span style="color: rgb(255, 0, 0);">field</span><span style="color: rgb(0, 0, 255);">="name"</span><span style="color: rgb(255, 0, 0);">&nbsp;sortable</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(255, 0, 0);">&nbsp;filterable</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: rgb(0, 0, 255);">="200"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="名称"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:outputText&nbsp;</span><span style="color: rgb(255, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">="#{rec.wrapped.name}"</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">h:outputText</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">cby:column</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:column&nbsp;</span><span style="color: rgb(255, 0, 0);">field</span><span style="color: rgb(0, 0, 255);">="region"</span><span style="color: rgb(255, 0, 0);">&nbsp;sortable</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(255, 0, 0);">&nbsp;filterable</span><span style="color: rgb(0, 0, 255);">="false"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: rgb(0, 0, 255);">="100"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="区域"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:outputText&nbsp;</span><span style="color: rgb(255, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">="#{rec.wrapped.region}"</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">h:outputText</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">cby:column</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:column&nbsp;</span><span style="color: rgb(255, 0, 0);">field</span><span style="color: rgb(0, 0, 255);">="surfaceArea"</span><span style="color: rgb(255, 0, 0);">&nbsp;sortable</span><span style="color: rgb(0, 0, 255);">="false"</span><span style="color: rgb(255, 0, 0);">&nbsp;filterable</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: rgb(0, 0, 255);">="150"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="表面积"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:outputText&nbsp;</span><span style="color: rgb(255, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">="#{rec.wrapped.surfaceArea}"</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">h:outputText</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">cby:column</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:column&nbsp;</span><span style="color: rgb(255, 0, 0);">field</span><span style="color: rgb(0, 0, 255);">="population"</span><span style="color: rgb(255, 0, 0);">&nbsp;sortable</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(255, 0, 0);">&nbsp;filterable</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: rgb(0, 0, 255);">="100"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="人口"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:outputText&nbsp;</span><span style="color: rgb(255, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">="#{rec.wrapped.population}"</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">h:outputText</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">cby:column</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">cby:ds&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">cby:table</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">h:form</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">ui:define</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">ui:composition</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">html</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
因为开发平台最终是以BO为核心，所以此表格组件是通过设置 bean，然后再通过Hibernate来获取数据的。<br />
<br />
这个组件除采用JSF +Facelet之外，没有其它页面技术，代码简洁，无抽象，且里面还有注释，初学者可以参考一下。<br />
<br />
主要功能：<br />
1 设置column的filterable属性(true/false)来过滤数据(目前实现为左匹配，比如输入Sa，就是Sa开头的)<br />
2 分页导航<br />
3 设置column的sortable属性(true/false)用来对某列进行 正/反 排序<br />
4 改变页记录大小，默认为20条/页<br />
5 设置table的checkable属性为true，表格将会多一列用来选择。<br />
6 可以批量删除被checked的记录。<br />
<br />
这个组件只考虑了功能，并没有考虑到美观，如果你觉得可以用，改改它的html属性设置。<br />
<br />
安装：<br />
<br />
1 附件是一个Maven项目，必须安装有maven。<br />
2 安装MySQL数据库，启动MySQL，运行 <br />
create database world<br />
3 找到项目下面的world.sql，假设其路径为/a/b/c/world.sql，使用MySQL的source命令<br />
use world<br />
source /a/b/c/world.sql<br />
4修改项目下的hibernate.cfg.xml中MySQL数据库用户名/密码。<br />
5 执行mvn jetty:run 启动<br />
6 浏览器输入 http://localhost:8080/jsftry/ 就可以看到效果了<br />
<br />
关于调试：<br />
1 下载一个Eclipse JEE版本<br />
2&nbsp; 在项目目录下执行 mvn eclipse:clean eclipse:eclipse -DdownloadSources=true -Dwtpversion=1.5<br />
3 在eclipse workspace中import此项目<br />
<br />
虽然工作中不用Java很久了，但拿起来玩玩还是觉得Java真的很有生产力。JSF，Hibernate，Maven，Eclipse一个比一个牛比。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/285453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2009-07-04 13:22 <a href="http://www.blogjava.net/lifesting/archive/2009/07/04/285453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hello, dreamweaver! (PART 2)</title><link>http://www.blogjava.net/lifesting/archive/2009/06/18/283073.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Thu, 18 Jun 2009 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2009/06/18/283073.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/283073.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2009/06/18/283073.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/283073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/283073.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 开发dreamweaver extension，即dreamweaver插件&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2009/06/18/283073.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/283073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2009-06-18 17:02 <a href="http://www.blogjava.net/lifesting/archive/2009/06/18/283073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hello, dreamweaver! (Part 1)</title><link>http://www.blogjava.net/lifesting/archive/2009/06/17/267958.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 17 Jun 2009 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2009/06/17/267958.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/267958.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2009/06/17/267958.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/267958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/267958.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 开发Dreamweaver extension&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2009/06/17/267958.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/267958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2009-06-17 17:24 <a href="http://www.blogjava.net/lifesting/archive/2009/06/17/267958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GEF社区捐献的一个图形旋转(Rotation)的例子</title><link>http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 20 Feb 2009 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/255789.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/255789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/255789.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 实现GEF开发中的图形旋转的一个解决方案&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/255789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2009-02-20 11:04 <a href="http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GMF中使用动态模板(dynamic templates)</title><link>http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Mon, 08 Dec 2008 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/245016.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/245016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/245016.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用动态模板定制GMF代码生成。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/245016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-12-08 13:54 <a href="http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在你眼中Java是什么？</title><link>http://www.blogjava.net/lifesting/archive/2008/12/02/243808.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Mon, 01 Dec 2008 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/12/02/243808.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/243808.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/12/02/243808.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/243808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/243808.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 说出你的看法，在你眼中Java是个什么东东。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/12/02/243808.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/243808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-12-02 00:04 <a href="http://www.blogjava.net/lifesting/archive/2008/12/02/243808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>插件开发之：Common Navigator View (CNV) 通用导航试图</title><link>http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Sat, 29 Nov 2008 17:28:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/242634.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/242634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/242634.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一个实例完整的演示了Common Navigator View的开发过程。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/242634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-11-30 01:28 <a href="http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>插件开发: 将View里面的对象托拽到Editor步骤</title><link>http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 21 Nov 2008 17:27:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/241723.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/241723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/241723.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通过一个完整例子，系统的讲述了在Eclipse开发中怎么讲table/tree view里面的东西拖拽到text/graphical editor上。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/241723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-11-22 01:27 <a href="http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>或许有用的特性 Eclipse 3.4 Templates View</title><link>http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 29 Aug 2008 15:20:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/225665.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/225665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/225665.html</trackback:ping><description><![CDATA[Eclipse3.4用了一段时间了，发现了很多新特性，API变化也很大，昨天凑巧发现了JDT Template View，Window-&gt;Show View-&gt;Templates View效果如下：<br />
<br />
<img height="571" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/tpl-view.JPG" width="1172" border="0" /><br />
<br />
看得出来它是在JDT UI里面定义的，综合了jdt text editor template 如 Java开头的category 和custom editor template如SWT开头的category。对于我来说，SWT/Draw2d/Plugin的大量重复性代码就可以通过这个来完成了。将模板的代码插入到编辑器有两种方法，一种是直接拖拽到编辑器中，另一种是输入简写入如"execute"，按Contxt Assist快捷键(一般为Ctrl+Space)。<br />
<br />
除此之外，Templates View还可以维护template比如add/remove。Template的值以XML字串存放在.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.jdt.ui.prefs文件的org.eclipse.jdt.ui.text.custom_templates项<br />
起初我以为Template View好像还没有提供什么NB功能，在Window-&gt;Preferences-&gt;Java-&gt;-Editor-&gt;Templates可以做同样的事情，但稍微看了一下代码，发现我错了：<br />
<br />
Templates View是PageBookView，意味着它跟Properties View/Outline View一样，可以根据不同的Editor来显示不同的Page，比如上图JDT就是JavaTemplatesPage，如果编写一个DSL Editor需要用到Templates View，继承AbstractTemplatesPage，然后在Editor的getAapter()返回page，看Java Editor示例：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_90_625_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_625_Open_Text.style.display='none'; Codehighlighter1_90_625_Closed_Image.style.display='inline'; Codehighlighter1_90_625_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_625_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_90_625_Closed_Text.style.display='none'; Codehighlighter1_90_625_Open_Image.style.display='inline'; Codehighlighter1_90_625_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CompilationUnitEditor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;JavaEditor&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;IJavaReconcilingListener&nbsp;</span><span id="Codehighlighter1_90_625_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_90_625_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img id="Codehighlighter1_138_624_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_624_Open_Text.style.display='none'; Codehighlighter1_138_624_Closed_Image.style.display='inline'; Codehighlighter1_138_624_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_138_624_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_138_624_Closed_Text.style.display='none'; Codehighlighter1_138_624_Open_Image.style.display='inline'; Codehighlighter1_138_624_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getAdapter(Class&nbsp;required)&nbsp;</span><span id="Codehighlighter1_138_624_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_138_624_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_192_330_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_330_Open_Text.style.display='none'; Codehighlighter1_192_330_Closed_Image.style.display='inline'; Codehighlighter1_192_330_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_192_330_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_192_330_Closed_Text.style.display='none'; Codehighlighter1_192_330_Open_Image.style.display='inline'; Codehighlighter1_192_330_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SmartBackspaceManager.</span><span style="color: #0000ff">class</span><span style="color: #000000">.equals(required))&nbsp;</span><span id="Codehighlighter1_192_330_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_192_330_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_248_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_248_326_Open_Text.style.display='none'; Codehighlighter1_248_326_Closed_Image.style.display='inline'; Codehighlighter1_248_326_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_248_326_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_248_326_Closed_Text.style.display='none'; Codehighlighter1_248_326_Open_Image.style.display='inline'; Codehighlighter1_248_326_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(getSourceViewer()&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;JavaSourceViewer)&nbsp;</span><span id="Codehighlighter1_248_326_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_248_326_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((JavaSourceViewer)&nbsp;getSourceViewer()).getBackspaceManager();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_378_482_Open_Image" onclick="this.style.display='none'; Codehighlighter1_378_482_Open_Text.style.display='none'; Codehighlighter1_378_482_Closed_Image.style.display='inline'; Codehighlighter1_378_482_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_378_482_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_378_482_Closed_Text.style.display='none'; Codehighlighter1_378_482_Open_Image.style.display='inline'; Codehighlighter1_378_482_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ITemplatesPage.</span><span style="color: #0000ff">class</span><span style="color: #000000">.equals(required))&nbsp;</span><span id="Codehighlighter1_378_482_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_378_482_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fTemplatesPage&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fTemplatesPage</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;createTemplatesPage();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fTemplatesPage;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.getAdapter(required);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img id="Codehighlighter1_577_618_Open_Image" onclick="this.style.display='none'; Codehighlighter1_577_618_Open_Text.style.display='none'; Codehighlighter1_577_618_Closed_Image.style.display='inline'; Codehighlighter1_577_618_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_577_618_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_577_618_Closed_Text.style.display='none'; Codehighlighter1_577_618_Open_Image.style.display='inline'; Codehighlighter1_577_618_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;JavaTemplatesPage&nbsp;createTemplatesPage()&nbsp;</span><span id="Codehighlighter1_577_618_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_577_618_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JavaTemplatesPage(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span></div>
</span><br />
当然，大部分人不需要写editor，我们可以在自己的插件里通过使用扩展点来org.eclipse.ui.editors.templates扩展JDT Template，比如我就在GEF项目里面加入了GEF Template，这样编写讨厌的EditPart/EditPolicy/Command就可以少些好多代码。<br />
<br />
<img height="565" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/tpl-ext.JPG" width="891" border="0" /><br />
<br />
第一张图片看到的swt template就是在上图所示的default-swttemplates.xml里面定义好了的。<br />
<br />
最后想告诉广大Eclipse爱好者的就是，Eclipse SDK写的代码真工整，果然是协作的结晶，整一个代码宝库，根本不用看<strong>代码大全</strong>了:)。 
<img src ="http://www.blogjava.net/lifesting/aggbug/225665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-08-29 23:20 <a href="http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GEF编辑器中定点action如paste等的解决办法</title><link>http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 20 Aug 2008 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/223309.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/223309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/223309.html</trackback:ping><description><![CDATA[GEF中大部分action对位置不敏感，但还是有例外，典型的如paste，context menu中的某个action需要将clipboard中的东西paste到右键单击位置。如下图：<br />
<br />
<img height="504" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/paste.JPG" width="676" /><br />
即使在GMF中, DiagramAction也是取得是鼠标点击paste时的位置，而不是之前右键单击出现contxt menu的位置。这里<strong>&#8220;定点</strong>&#8221;关键是在选择paste之前<strong><span style="color: red">右键单击的位置已经被记住</span></strong>了，并且对context menu中所有对位置敏感的action都有效，比如merge, duplicate等。<br />
<br />
下面分三步完成：<br />
<br />
<strong>1 定义一个接口，为所有位置敏感action提供位置信息</strong><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ILocationWare&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setLocation(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y);<br />
}</span></div>
<br />
<strong>2 注册一个listener到GEF editor的context menu，提供位置记忆，这个是关键。</strong><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LivingContextMenu&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ContextMenuProvider&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;LivingEditor&nbsp;editor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IMenuListener&nbsp;listener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IMenuListener(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;menuAboutToShow(IMenuManager&nbsp;manager)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Control&nbsp;canvas&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getViewer().getControl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;cursor_location&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;canvas.getDisplay().getCursorLocation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;relative_canvas&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;canvas.toControl(cursor_location);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setItemLocation(manager,relative_canvas);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setItemLocation(IMenuManager&nbsp;manager,&nbsp;Point&nbsp;relative_canvas)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContributionItem[]&nbsp;items&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;manager.getItems();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;items.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContributionItem&nbsp;item&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;items[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(item&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;ActionContributionItem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAction&nbsp;host_action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;((ActionContributionItem)item).getAction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(host_action&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;ILocationWare)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">((ILocationWare)host_action).setLocation(relative_canvas.x,&nbsp;relative_canvas.y)</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(item&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;IMenuManager)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setItemLocation((IMenuManager)item,&nbsp;relative_canvas);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LivingContextMenu(LivingEditor&nbsp;lv)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">((GraphicalViewer)lv.getAdapter(GraphicalViewer.</span><span style="color: #0000ff">class</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;editor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lv;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMenuListener(listener);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dispose()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeMenuListener(listener);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
原理就是右键单击后，context menu的listener已经记住了鼠标在graphicalviewer control(一般为FigureCanvas)右击位置，并告知给所有context menu中对位置敏感的action。<br />
<br />
<strong>3 对位置敏感的action实现ILocationWare接口，比如paste。</strong><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PasteAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SelectionAction&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ILocationWare&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Point&nbsp;location&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Point(</span><span style="color: #000000">10</span><span style="color: #000000">,</span><span style="color: #000000">10</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;contextTrigged</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;PasteAction(LivingEditor&nbsp;part)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(part);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">some&nbsp;operations&nbsp;depend&nbsp;on&nbsp;location</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setLocation(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location.setLocation(x,&nbsp;y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextTrigged&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setId(ActionFactory.PASTE.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISharedImages&nbsp;workbench_images&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PlatformUI.getWorkbench().getSharedImages();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setImageDescriptor(workbench_images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDisabledImageDescriptor(workbench_images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
这种解决同样适用于GMF的DiagramAction。(DiagramAction也是Action的子类)<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/223309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-08-20 22:26 <a href="http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于GEF 3.4 PaletteGroup的小误会</title><link>http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Sun, 17 Aug 2008 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/222636.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/222636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/222636.html</trackback:ping><description><![CDATA[最近发现一个很怪的问题，GEF的PaletteGroup在3.3及以下都有border，而在3.4却消失了，我觉得好像是GEF 3.4 PaletteViewer的开发者Hudson和Shah认为不可见的边框更&#8220;友好&#8221;，可是好多人都不习惯了，觉得是bug了，在给gef newsgroup上一个人回答问题的时候顺便把这个hack了一下，效果还不错，哈哈！下面是步骤：<br />
<br />
1 定义一个HackedGroupEditPart:<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.ColorConstants;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.Graphics;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.IFigure;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.MarginBorder;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.geometry.Insets;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.geometry.Rectangle;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.gef.internal.ui.palette.editparts.GroupEditPart;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.gef.palette.PaletteContainer;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.jface.action.Separator;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HackedGroupEditPart&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;GroupEditPart&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;HackedGroupEditPart(PaletteContainer&nbsp;group)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;refreshVisuals()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.refreshVisuals();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Insets&nbsp;insets&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getContentPane().getBorder().getInsets(getContentPane());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getContentPane().setBorder(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MarginBorder(insets){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;paint(IFigure&nbsp;figure,&nbsp;Graphics&nbsp;graphics,&nbsp;Insets&nbsp;insets)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getPaintRectangle(figure,&nbsp;insets);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.height</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.setForegroundColor(ColorConstants.buttonDarker);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.drawLine(r.x,&nbsp;r.bottom(),&nbsp;r.right(),&nbsp;r.bottom());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
<br />
2 使用这个加了边框的GroupEditPart，在编辑器定义里面重写 <strong>createPaletteViewerProvider </strong>方法，如下：</span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LivingEditor&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;GraphicalEditorWithFlyoutPalette&nbsp;{<br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
@Override<br />
</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;PaletteViewerProvider&nbsp;createPaletteViewerProvider()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteViewerProvider(getEditDomain())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;PaletteViewer&nbsp;createPaletteViewer(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">add&nbsp;border&nbsp;for&nbsp;GroupEditPart</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;PaletteEditPartFactory&nbsp;pepf&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteEditPartFactory()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;EditPart&nbsp;createGroupEditPart(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EditPart&nbsp;parentEditPart,&nbsp;Object&nbsp;model)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HackedGroupEditPart((PaletteContainer)model);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteViewer&nbsp;pViewer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteViewer(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setEditPartFactory(pepf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pViewer.createControl(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configurePaletteViewer(pViewer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hookPaletteViewer(pViewer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;pViewer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
}</span></div>
</div>
<br />
我的Palette定义，使用了三个PaletteGroup，但不改一下根本看不出来<strong>group之间的分隔</strong>：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">public&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PaletteProvider&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;PaletteRoot&nbsp;provide(LivingEditor&nbsp;livingEditor)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteRoot&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteRoot();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createStandardTool(root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createConnectionTool(root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createModelTool(root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;root;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createModelTool(PaletteRoot&nbsp;root)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;model_group&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteGroup(</span><span style="color: #000000;">"</span><span style="color: #000000;">model</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombinedTemplateCreationEntry&nbsp;person_entry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CombinedTemplateCreationEntry(</span><span style="color: #000000;">"</span><span style="color: #000000;">Person</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;a&nbsp;person</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFactory(Person.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/person16.png</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/person24.png</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model_group.add(person_entry);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombinedTemplateCreationEntry&nbsp;dog_entry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CombinedTemplateCreationEntry(</span><span style="color: #000000;">"</span><span style="color: #000000;">Dog</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;a&nbsp;dog</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFactory(Dog.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/dog16.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/dog24.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model_group.add(dog_entry);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(model_group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createConnectionTool(PaletteRoot&nbsp;root)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionCreationToolEntry&nbsp;relation&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ConnectionCreationToolEntry(</span><span style="color: #000000;">"</span><span style="color: #000000;">relation</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">relation&nbsp;between&nbsp;person&nbsp;and&nbsp;dog</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFactory(Relation.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/connection16.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/connection24.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;conn_group&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteGroup(</span><span style="color: #000000;">"</span><span style="color: #000000;">relations</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn_group.add(relation);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(conn_group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createStandardTool(PaletteRoot&nbsp;root)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;std&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteGroup(</span><span style="color: #000000;">"</span><span style="color: #000000;">Standard</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectionToolEntry&nbsp;selection&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SelectionToolEntry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std.add(selection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(std);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
可以看一下修改后的对比：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/groupcompare.JPG" width="433" height="434" /><br />
<br />
不过这种方法使用了internal API，不适应版本更新，只适合救急。我已经报告了这个<strong>误会</strong>，3.5应该不会有了。<br />
<br />
如果你也有这个困扰，就试试吧。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/222636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-08-17 22:40 <a href="http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用EXTSSH协议访问CVS</title><link>http://www.blogjava.net/lifesting/archive/2008/07/30/218617.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 30 Jul 2008 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/07/30/218617.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/218617.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/07/30/218617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/218617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/218617.html</trackback:ping><description><![CDATA[大部分开源网站对开发者的cvs访问采用extssh，简单过程如下：<br />
<br />
1 生成公私匙(public/private key)，通过putty或者cygwin的ssh-kegen生成。<br />
<br />
步骤 http://alexandria.wiki.sourceforge.net/SSH+Key+Generation<br />
Putty http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html<br />
cygwin http://www.cygwin.com/<br />
<br />
2 将public key 粘帖到目标网站上。<br />
<br />
3 在cvs 客户端设置一下，它需要一个ssh客户端，putty就可以。<br />
以Eclipse为例：<br />
<ul>
    <li>wizard: new project-&gt; projects from cvs</li>
    <li>输入cvs验证信息</li>
    <li>点击config connection preferences,在出现的对话框里面选择&#8220;use another connection method type to connect"，将connect type置为extssh。点击下面的ssh2配置链接。<br />
    </li>
    <li>接着配置ssh,在general tab中选择ssh2 home，这儿可以用putty的安装目录，在下面的private key中加入第一步生成的private key。</li>
    <li>ok，确定。<br />
    </li>
</ul>
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/218617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-07-30 10:38 <a href="http://www.blogjava.net/lifesting/archive/2008/07/30/218617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过一个小例子看怎样扩展SWT</title><link>http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Thu, 24 Jul 2008 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/217236.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/217236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/217236.html</trackback:ping><description><![CDATA[对于Eclipse开发者来说，不管Plug-in还是RCP免不了要和SWT打交道，但两者似乎有些不同，Plug-in主要跟Eclipse过招，开发更多是上层应用如UI/JDT/EMF/GMF等，而RCP像是应用程序，时不时与图形系统交互，需求更是五花八门，举几例：<br />
<ul>
    <li>RCP界面要跟Office 2007/Vista一样。
    </li>
    <li>我喜欢上一VC版的水晶按钮。
    </li>
    <li>商业版控件支持。
    </li>
    <li>我的RCP程序要定时启动。 </li>
</ul>
这些效果让RCP下的SWT越来越跟平台相关，但矛盾的是SWT要跨平台，提供的API只能是一个平衡产品+少许补充，更多特性依赖我们对SWT进行扩展。比较常见的是对SWT Win32 API进行扩展，因为Windows的图形特性太丰富了，不用白不用啊。<br />
<br />
下面就以SWT win32 x86来演示一下这个扩展过程。扩展很简单，就是在swt的窗口上加一个自定义系统菜单，最终效果如下图：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/result.JPG" width="534" height="331" /><br />
<br />
首先要有SWT JNI源代码，在Eclipse plug-in目录下找到org.eclipse.swt.win32.win32.x86.source_3.X.X.vXXX.jar(xx为版本号)，解压缩到c:\build\swt-jni，解完后在会发现有一堆h和c文件，其中比较重要的就是os, gdip, xpcom,wgl,awt，用途分别如下：<br />
<ul>
    <li>os: 主要的JNI，用来创建控件，事件处理等。
    </li>
    <li>gdip: 与windows的dc交互，提供swt的gc画图功能。
    </li>
    <li>xpcom: 供swt调用mozilla系列浏览器如firefox等。
    </li>
    <li>wgl: 与3D相关，一般都用不上。
    </li>
    <li>awt：在swt中调用awt，awt也是jni。 </li>
</ul>
了解swt源代码之后，接下来为build swt做准备。<br />
<ul>
    <li>安装vc6，尝试过用高版本，但不支持。
    </li>
    <li>安装platform SDK 2003 February版，<a href="http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm">下载地址</a>&nbsp; 遵照安装说明将SDK解压缩安装。不要尝试更新版本，不支持。
    </li>
    <li>安装jdk，这个无所谓，1.4, 1.5, 1.6都可以。
    </li>
    <li>下载gecko-sdk(<a href="http://developer.mozilla.org/en/docs/Gecko_SDK#Downloading">下载地址</a>)，请务必使用1.8，swt目前不完全支持1.9。 </li>
</ul>
<p>所以的工具都安装或解压之后，在swt源代码目录下找到build.bat，在:X86 label部分做如下配置，其中配置的目录视你的安装而定：<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">:X86<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%DEV_TOOLS%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;DEV_TOOLS</span><span style="color: #000000;">=</span><span style="color: #000000;">c:\PROGRA~</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />call&nbsp;%DEV_TOOLS%\MICROS~</span><span style="color: #000000;">2</span><span style="color: #000000;">\vc98\bin\vcvars32.bat<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%MSSDK%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;MSSDK</span><span style="color: #000000;">=</span><span style="color: #000000;">%DEV_TOOLS%\MICROS~</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />call&nbsp;%MSSDK%\setenv&nbsp;/XP32&nbsp;/RETAIL<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%OUTPUT_DIR%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;OUTPUT_DIR</span><span style="color: #000000;">=</span><span style="color: #000000;">..\out<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%JAVA_HOME%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;JAVA_HOME</span><span style="color: #000000;">=</span><span style="color: #000000;">%DEV_TOOLS%\Java\jdk1</span><span style="color: #000000;">.6</span><span style="color: #000000;">.0_</span><span style="color: #000000;">06</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%XULRUNNER_SDK%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;XULRUNNER_SDK</span><span style="color: #000000;">=</span><span style="color: #000000;">C:\gecko-sdk<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;XULRUNNER_MAKE</span><span style="color: #000000;">=</span><span style="color: #000000;">make_xulrunner<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%</span><span style="color: #000000;">1</span><span style="color: #000000;">==</span><span style="color: #000000;">x.x86&nbsp;shift<br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />GOTO&nbsp;MAKE</span></div>
<p><br />
</p>
<p>如果你和我一样的用的是Sun的JDK，且版本是1.5或1.6，还须修改一下和build.bat同目录的make_win32.mak文件。</p>
<p>替换<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">AWT_LIBS&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">$(JAVA_HOME)\jre\bin\jawt.lib</span><span style="color: #000000;">"<br />
</span></div>
<p>为</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">AWT_LIBS&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">$(JAVA_HOME)\lib\jawt.lib</span><span style="color: #000000;">"</span></div>
<p><br />
</p>
<p>一旦配置完成后，就可以在命令行中运行 <span style="color: red;">build.bat x86 </span>来build swt了，如果你的build过程中出错，使用<span style="color: red;">build x86 clean</span>删除垃圾文件，然后再查明原因。如果没有错误的话，目录下会生成5个dll文件，分别是swt-awt-win32-XXXX.dll, swt-gdip-win32-XXXX.dll, swt-wgl-win32-XXXX.dll, swt-win32-XXXX.dll, swt-xulrunner-win32-XXXX.dll，其中XXXX是视你的Eclipse版本而定。<br />
<br />
要实现我们想要的效果，还需针对SWT的消息处理程序(WndProc) 扩展一下OS，那就是在就在主窗口建立过程中候往系统菜单里面加一自定义项。在Win32中，窗口建立的消息为WM_CREATE(值为1)。为简单起见，这里只是覆盖了SWT的默认消息处理程序，它通过os.c中的&nbsp;OS_NATIVE(DefWindowProcW)方法来实现的(在98以后的版本api都是unicode，所以只覆盖W版本)<br />
<br />
改动之前：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">#ifndef&nbsp;NO_DefWindowProcW<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JNIEXPORT&nbsp;jint&nbsp;JNICALL&nbsp;OS_NATIVE(DefWindowProcW)<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">env,&nbsp;jclass&nbsp;that,&nbsp;jint&nbsp;arg0,&nbsp;jint&nbsp;arg1,&nbsp;jint&nbsp;arg2,&nbsp;jint&nbsp;arg3)<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_147_348_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_348_Open_Text.style.display='none'; Codehighlighter1_147_348_Closed_Image.style.display='inline'; Codehighlighter1_147_348_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_147_348_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_147_348_Closed_Text.style.display='none'; Codehighlighter1_147_348_Open_Image.style.display='inline'; Codehighlighter1_147_348_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_147_348_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_147_348_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;jint&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_ENTER(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(jint)DefWindowProcW((HWND)arg0,&nbsp;arg1,&nbsp;(WPARAM)arg2,&nbsp;(LPARAM)arg3);<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_EXIT(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;rc;<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">#endif</span></div>
<br />
<p>改动之后：<br />
<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">#ifndef&nbsp;NO_DefWindowProcW<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;ID_CUSTOM_MENU&nbsp;32888</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;wcTitle</span><span style="color: #000000;">=</span><span style="color: #000000;">L</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;wcContent</span><span style="color: #000000;">=</span><span style="color: #000000;">L</span><span style="color: #000000;">"</span><span style="color: #000000;">World</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;wcName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">Bang</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LRESULT&nbsp;CALLBACK&nbsp;MyWndProc(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;message,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam)<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img id="Codehighlighter1_241_764_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_764_Open_Text.style.display='none'; Codehighlighter1_241_764_Closed_Image.style.display='inline'; Codehighlighter1_241_764_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_241_764_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_241_764_Closed_Text.style.display='none'; Codehighlighter1_241_764_Open_Image.style.display='inline'; Codehighlighter1_241_764_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_241_764_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_241_764_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;wmId,&nbsp;wmEvent;<br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;HMENU&nbsp;hSysMenu;<br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">&nbsp;(message)<br />
</span><span style="color: #008080;">14</span><span style="color: #000000;"><img id="Codehighlighter1_299_751_Open_Image" onclick="this.style.display='none'; Codehighlighter1_299_751_Open_Text.style.display='none'; Codehighlighter1_299_751_Closed_Image.style.display='inline'; Codehighlighter1_299_751_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_299_751_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_299_751_Closed_Text.style.display='none'; Codehighlighter1_299_751_Open_Image.style.display='inline'; Codehighlighter1_299_751_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_299_751_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_299_751_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">15</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_CREATE:<br />
</span><span style="color: #008080;">16</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hSysMenu&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetSystemMenu(hWnd,FALSE);<br />
</span><span style="color: #008080;">17</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InsertMenuW(hSysMenu,</span><span style="color: #000000;">1</span><span style="color: #000000;">,MF_BYPOSITION&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;MF_STRING,ID_CUSTOM_MENU,wcName);<br />
</span><span style="color: #008080;">18</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">19</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_DESTROY:<br />
</span><span style="color: #008080;">20</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">21</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">22</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_SYSCOMMAND:<br />
</span><span style="color: #008080;">23</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LOWORD(wParam);<br />
</span><span style="color: #008080;">24</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(wmId</span><span style="color: #000000;">==</span><span style="color: #000000;">ID_CUSTOM_MENU)<br />
</span><span style="color: #008080;">25</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW(hWnd,wcTitle,wcContent,MB_OK);<br />
</span><span style="color: #008080;">26</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">27</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;DefWindowProcW(hWnd,&nbsp;message,&nbsp;wParam,&nbsp;lParam);<br />
</span><span style="color: #008080;">28</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">29</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">30</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;DefWindowProcW(hWnd,&nbsp;message,&nbsp;wParam,&nbsp;lParam);<br />
</span><span style="color: #008080;">31</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">32</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">33</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">34</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">35</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JNIEXPORT&nbsp;jint&nbsp;JNICALL&nbsp;OS_NATIVE(DefWindowProcW)<br />
</span><span style="color: #008080;">36</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">env,&nbsp;jclass&nbsp;that,&nbsp;jint&nbsp;arg0,&nbsp;jint&nbsp;arg1,&nbsp;jint&nbsp;arg2,&nbsp;jint&nbsp;arg3)<br />
</span><span style="color: #008080;">37</span><span style="color: #000000;"><img id="Codehighlighter1_888_1084_Open_Image" onclick="this.style.display='none'; Codehighlighter1_888_1084_Open_Text.style.display='none'; Codehighlighter1_888_1084_Closed_Image.style.display='inline'; Codehighlighter1_888_1084_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_888_1084_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_888_1084_Closed_Text.style.display='none'; Codehighlighter1_888_1084_Open_Image.style.display='inline'; Codehighlighter1_888_1084_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_888_1084_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_888_1084_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">38</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;jint&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">39</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_ENTER(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">40</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(jint)MyWndProc((HWND)arg0,&nbsp;arg1,&nbsp;(WPARAM)arg2,&nbsp;(LPARAM)arg3);<br />
</span><span style="color: #008080;">41</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_EXIT(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">42</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;rc;<br />
</span><span style="color: #008080;">43</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">44</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">45</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">#endif</span></div>
<p>改动的目的就是在系统菜单里面加了一个菜单项 "Bang"，点击后会出现&#8220;Hello world&#8221; 对话框。<br />
<br />
重新在swt源目录下运行build x86，生成的swt就是扩展以后的版本。<br />
<br />
现在我们来测试一下效果，写一个如下所示的HelloWorld1.java，放到swt源目录下，先运行javac HelloWorld1.java，再运行java HelloWorld1。不用担心classpath与library path，build之后它们默认都在当前目录下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.swt.widgets.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_60_411_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_411_Open_Text.style.display='none'; Codehighlighter1_60_411_Closed_Image.style.display='inline'; Codehighlighter1_60_411_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_60_411_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_60_411_Closed_Text.style.display='none'; Codehighlighter1_60_411_Open_Image.style.display='inline'; Codehighlighter1_60_411_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloWorld1&nbsp;</span><span id="Codehighlighter1_60_411_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_60_411_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_104_300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_300_Open_Text.style.display='none'; Codehighlighter1_104_300_Closed_Image.style.display='inline'; Codehighlighter1_104_300_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_104_300_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_104_300_Closed_Text.style.display='none'; Codehighlighter1_104_300_Open_Image.style.display='inline'; Codehighlighter1_104_300_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main&nbsp;(String&nbsp;[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_104_300_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_104_300_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Display&nbsp;display&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Display&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Shell&nbsp;shell&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HelloWorld1&nbsp;().open&nbsp;(display);<br />
<img id="Codehighlighter1_221_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_221_277_Open_Text.style.display='none'; Codehighlighter1_221_277_Closed_Image.style.display='inline'; Codehighlighter1_221_277_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_221_277_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_221_277_Closed_Text.style.display='none'; Codehighlighter1_221_277_Open_Image.style.display='inline'; Codehighlighter1_221_277_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">shell.isDisposed&nbsp;())&nbsp;</span><span id="Codehighlighter1_221_277_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_221_277_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">display.readAndDispatch&nbsp;())&nbsp;display.sleep&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;display.dispose&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_340_409_Open_Image" onclick="this.style.display='none'; Codehighlighter1_340_409_Open_Text.style.display='none'; Codehighlighter1_340_409_Closed_Image.style.display='inline'; Codehighlighter1_340_409_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_340_409_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_340_409_Closed_Text.style.display='none'; Codehighlighter1_340_409_Open_Image.style.display='inline'; Codehighlighter1_340_409_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Shell&nbsp;open&nbsp;(Display&nbsp;display)&nbsp;</span><span id="Codehighlighter1_340_409_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_340_409_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Shell&nbsp;shell&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Shell&nbsp;(display);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;shell.open&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;shell;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p><br />
在窗口标题栏单击右键，点击出现的Bang菜单会有如下效果图：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/box.JPG" border="0" width="441" height="427" /><br />
<br />
这个例子虽然简单，但大致描述了扩展swt的过程，更复杂的扩展等待<span style="font-size: 24pt;">YOU</span>来实现！<br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifesting/aggbug/217236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-07-24 18:39 <a href="http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>或许你不知道的一个调试功能</title><link>http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Tue, 22 Jul 2008 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/216735.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/216735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/216735.html</trackback:ping><description><![CDATA[调试其实是门很深的学问，在分析Eclipse源代码的过程中积累了很多经验，但大多与多数人无用，现介绍一个简单而非常有用的调试功能及它的适用场合。<br />
<br />
首先看一段代码：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Simple&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;max&nbsp;;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simpleAction(i);<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;simpleAction(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;tmp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;NullPointerException(</span><span style="color: #000000;">"</span><span style="color: #000000;">5&nbsp;is&nbsp;invalid&nbsp;number!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Number&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">tmp</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;reached!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">18</span> <span style="color: #000000;"><br />
这段代码非常简单，就是打印10个数字，但中间一个出了异常，假设我们忘记Eclipse的Exception BreakPoint(在复杂的场合，不一定抛Exception)，于是看到控制台除了异常信息之后，我们可在第7行和第12行设置断点，看调用i到底发生了什么。<br />
<br />
启动调试后一切正常，除了你必须F8 4次，因为0-4正常，但也在断点处，很烦人。有没有可能激活断点一次呢？当然可以。<br />
<br />
从控制台看到5 is invalid number，那么这次调试只针对5，我们可以简单的设置一下：<br />
<br />
第一步：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/setproperties.JPG" width="400" height="336" /><br />
<br />
第二步在出现的对话框内，选中Enable Condition，接着输入我们的condition: i==5<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/inputcondition.JPG" width="626" height="539" /><br />
<br />
OK，再调试启动Simple，发现断点激活是在i=5的时候，我们就可以F6一步一步看到底发生了什么。<br />
<br />
这种条件调试在使用复杂的框架的时候极其有用，举个例子：<br />
GMF的AbstractActionHandler有N多子类，你必须直接或间接的继承它，同时使用它的API，在它的API很复杂而我还在探索</span><span style="color: #000000;">的情况下</span><span style="color: #000000;">，出错在所难免，出错后在AbstractActionHandler的某个API里设置了一断点，但<span style="color: red;">你只想关心自己写的子类</span>，否则</span><span style="color: #000000;">会</span><span style="color: #000000;">按F8超过1分钟，那么我们可以在上面的condition text里面输入：<br />
<br />
<strong><span style="font-size: 14pt;"><span style="font-size: 12pt;">this.getClass().getName().equals("foo.bar.MyDiagramAction")</span></span></strong><br />
<br />
就可以省掉很多麻烦。<br />
<br />
当然condition可以写的很复杂，可以针对断点的context写任意Java代码。<br />
<br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/216735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-07-22 23:10 <a href="http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>因为Eclipse包结构改动带来的RCP启动失败。</title><link>http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 30 May 2008 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/204061.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/204061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/204061.html</trackback:ping><description><![CDATA[最近要将原来的RCP 3.2的项目从GEF改为GMF 2，只能使用Eclipse 3.3来开发，当我把在3.2下运行很好的项目倒入到3.3启动的时候报告一个很奇怪的错误：<br />
<br />
!ENTRY org.eclipse.osgi 4 0 2008-05-30 12:54:33.671<br />
!MESSAGE Application error<br />
!STACK 1<br />
java.lang.RuntimeException: <span style="color: red;">Application "org.eclipse.ui.ide.workbench" could not be found in the registry.</span> The applications available are: org.eclipse.jdt.core.JavaCodeFormatter, org.eclipse.update.core.standaloneUpdate, org.eclipse.update.core.siteOptimizer, org.eclipse.equinox.app.error.<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.EclipseAppContainer.startDefaultApp(EclipseAppContainer.java:242)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.EclipseAppContainer.start(EclipseAppContainer.java:98)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.Activator.addingService(Activator.java:112)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker$Tracked.trackAdding(ServiceTracker.java:1064)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker$Tracked.trackInitialServices(ServiceTracker.java:926)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:330)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:274)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.Activator.start(Activator.java:54)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)<br />
&nbsp;&nbsp; &nbsp;at java.security.AccessController.doPrivileged(Native Method)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:400)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:111)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:417)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:340)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:405)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:369)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:357)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)<br />
&nbsp;&nbsp; &nbsp;at java.lang.ClassLoader.loadClass(ClassLoader.java:251)<br />
&nbsp;&nbsp; &nbsp;at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.core.internal.runtime.PlatformActivator.startAppContainer(PlatformActivator.java:47)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.core.internal.runtime.PlatformActivator.start(PlatformActivator.java:32)<br />
....<br />
<br />
红色字体表示workbench这个application并没有加载到RCP runtime中来，Plugin registry里面没有注册信息，在3.2中 extension org.eclipse.ui.ide.workbench是申明在插件org.eclipse.ui.ide中的，通过Plugin Registry Search，发现在3.3中，这个extension declaration被挪到插件org.eclipse.ui.ide.application中了，于是<strong><span style="color: red;">在项目的product配置中加入org.eclipse.ui.ide.application这个插件依赖，然后选中这个插件，点击"Add Required Plug-ins"</span></strong>，再clear, 启动，运行正常。<br />
<br />
从这个令人恼火的改动来看，Eclipse在逐渐向它的两个趋势之一靠拢，即成为产品开发平台(RCP)。(另外一个是向OSGi标准看齐)<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/204061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-05-30 13:08 <a href="http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows批处理中对带空格路径的处理</title><link>http://www.blogjava.net/lifesting/archive/2008/04/23/195102.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 23 Apr 2008 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/04/23/195102.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/195102.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/04/23/195102.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/195102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/195102.html</trackback:ping><description><![CDATA[<p>一般在Windows的软件大部分安装在c:\ Program Files下面，比如我机器上的Java位置就是C:\Program Files\Java\jdk1.5.0_12，假如如果你在批处理中调用java或者javaw，会这么写：<br />
<br />
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_12<br />
set EXE_JAVA=%JAVA_HOME%\bin\java<br />
%EXE_JAVA% -version<br />
<br />
那样会报告一个错误：<br />
<span style="color: red;">'C:\Program' 不是内部或外部命令，也不是可运行的程序<br />
或批处理文件。</span><br />
<br />
以前为了避免这种问题，会把把JDK挪到c:\，但不是一个通用的解决办法，现在可以采用两种方式来解决：<br />
<br />
1 加上引号，表示一个完整路径，这个在好多服务器批处理中常用到比如jboss,&nbsp; tomcat。<br />
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_12<br />
set EXE_JAVA=<span style="color: red;"><strong>"%JAVA_HOME%"</strong></span>\bin\java <br />
%EXE_JAVA% -version<br />
<br />
2 转成短路径，这个我认为是最好的解决办法。<br />
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_12<br />
<span style="color: #0000ff;"><strong>for %x in ("%JAVA_HOME%") do set JAVA_HOME=%~sx</strong></span><br />
set EXE_JAVA=%JAVA_HOME%\bin\java<br />
%EXE_JAVA% -version<br />
<br />
需要注意的是，在批处理文件比如 run.bat 中，上面的for语句的变量有<strong>两个%%</strong>号。<br />
<span style="color: #0000ff;"><strong>for %%x in ("%JAVA_HOME%") do set JAVA_HOME=%%~sx</strong></span></p>
<p><span style="color: #041730;"><span style="color: #7079ff;"><span style="color: #041730;"><span style="color: #7079ff;"><span style="color: #041730;"><span style="color: #7079ff;"><span style="color: #041730;">另：如果只是想得到<strong>固定带空格</strong>的短路径，有一个快捷方法，使用cmd定位到某个目录，输入 debug 启动x86虚模式调试，然后quit推出，那么cmd的路径就变成短路径了，如下图</span></span></span></span></span></span></span></p>
<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/entercmd.JPG" width="584" height="178" /></p>
<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/quitdebug.JPG" width="647" height="188" /><br />
<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/lifesting/aggbug/195102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-04-23 15:04 <a href="http://www.blogjava.net/lifesting/archive/2008/04/23/195102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在批处理中加载某个目录所有的jar</title><link>http://www.blogjava.net/lifesting/archive/2008/04/13/192562.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Sun, 13 Apr 2008 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/04/13/192562.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/192562.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/04/13/192562.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/192562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/192562.html</trackback:ping><description><![CDATA[我平常做服务器或者应用程序的时候喜欢把各种依赖包如log4j, jdbc, commons-lang等放到一个lib目录下，然后启动的时候将这些jar包设置到classpath上。以前我经常使用set classpath=log4j.jar;jdbc.jar;commons-lang.jar硬加载，但<span style="color: red">问题就是每新加入一个jar，就得改批处理一次，再就是每开发一个就得这么设置一次。</span>很烦人，perl 创始人说，偷懒的程序员才是好程序员:)，我需要一个通用的加载方式。<br />
<br />
不管linux/windows或其它OS，都提供一个shell与kernel交互，并且shell都有一个类似的for内置commnd。<br />
<br />
下面是linux bash的尝试<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #008000">#</span><span style="color: #008000">!/usr/bin/sh</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />clspath</span><span style="color: #000000">=</span><span style="font-weight: bold; color: #000000">"</span><span style="font-weight: bold; color: #000000">bootstrap.jar</span><span style="font-weight: bold; color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;k&nbsp;in&nbsp;</span><span style="color: #000000">*.</span><span style="color: #000000">jar<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;clspath</span><span style="color: #000000">=</span><span style="color: #800080">$clspath</span><span style="color: #000000">:</span><span style="color: #800080">$PWD</span><span style="color: #000000">/</span><span style="color: #800080">$k</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;echo&nbsp;</span><span style="font-weight: bold; color: #000000">"</span><span style="font-weight: bold; color: #000000">current&nbsp;jar&nbsp;is&nbsp;$k.</span><span style="font-weight: bold; color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />done<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">printf</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">"</span><span style="font-weight: bold; color: #000000">classpath&nbsp;is&nbsp;%s</span><span style="font-weight: bold; color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$clspath</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
工作的很好，于是在windows同样try了一下batch<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #800080">@echo</span><span style="color: #000000">&nbsp;off<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;clspath</span><span style="color: #000000">=</span><span style="color: #000000">bootstrap</span><span style="color: #000000">.</span><span style="color: #000000">jar<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #800080">%j</span><span style="color: #000000">&nbsp;in&nbsp;(</span><span style="color: #000000">*.</span><span style="color: #000000">jar)&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;(<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;clspath</span><span style="color: #000000">=</span><span style="color: #800080">%clspath</span><span style="color: #000000">%</span><span style="color: #000000">;</span><span style="color: #800080">%cd</span><span style="color: #000000">%\%</span><span style="color: #800080">%j</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />echo&nbsp;current&nbsp;jar&nbsp;is&nbsp;</span><span style="color: #000000">%</span><span style="color: #800080">%j</span><span style="color: #000000">.</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />echo&nbsp;classpath&nbsp;is&nbsp;</span><span style="color: #800080">%clspath</span><span style="color: #000000">%</span></div>
<br />
很奇怪的是最后的结果却是 classpath is <span style="color: #ff0000">bootstrap.jar;D:\workflow\bingo\lib\servlet-api.jar</span>。很显然batch默认不支持<strong>变量迭代更改</strong>。<br />
google了一下，发现原因，稍微改一下：<br />
&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #800080">@echo</span><span style="color: #000000">&nbsp;off<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;clspath</span><span style="color: #000000">=</span><span style="color: #000000">bootstrap</span><span style="color: #000000">.</span><span style="color: #000000">jar<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />setlocal&nbsp;enabledelayedexpansion<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #800080">%j</span><span style="color: #000000">&nbsp;in&nbsp;(</span><span style="color: #000000">*.</span><span style="color: #000000">jar)&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;(<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;clspath</span><span style="color: #000000">=!</span><span style="color: #000000">clspath</span><span style="color: #000000">!</span><span style="color: #000000">;</span><span style="color: #800080">%cd</span><span style="color: #000000">%\%</span><span style="color: #800080">%j</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />echo&nbsp;current&nbsp;jar&nbsp;is&nbsp;</span><span style="color: #000000">%</span><span style="color: #800080">%j</span><span style="color: #000000">.</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />)<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />echo&nbsp;classpath&nbsp;is&nbsp;</span><span style="color: #800080">%clspath</span><span style="color: #000000">%</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />endlocal</span></div>
<p><br />
对比一下，可以发现：</p>
<ol>
    <li>第4行加上了setlocal enabledelayedexpansion，即变量延迟展开。
    <li>第10行有一个endlocal，结束这个设置
    <li>第6行把%classpath%变成了!classpath!。 </li>
</ol>
<p>虽然目的达到了，还是要鄙视微软的dos batch，实在很弱，不知Powershell怎样。</p>
<p>参考资料：<br />
&nbsp; &nbsp;<a href="http://technet.microsoft.com/zh-cn/library/bb491001(en-us).aspx">setlocal</a> </p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifesting/aggbug/192562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-04-13 15:32 <a href="http://www.blogjava.net/lifesting/archive/2008/04/13/192562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse文件转码插件</title><link>http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 11 Apr 2008 10:54:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/192250.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/192250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/192250.html</trackback:ping><description><![CDATA[<p><a href="/Files/lifesting/com.lifesting.tool.encoding.rar">插件源代码下载</a>&nbsp;(导入插件在workspace中，右键export-&gt;Plug-in Development-&gt;Deployable plug-ins and fragments，然后生成插件binar文件)<br />
<a href="/Files/lifesting/com.lifesting.tool.encoding_1.0.0.zip">二进制包下载</a>&nbsp;&nbsp; （<span style="color: #ff0000"><strong>因为blogjava不许上传jar文件，请下载后将zip后缀改为jar后缀然后拷贝到eclipse/plugins目录</strong></span>)<br />
<br />
<br />
一般在使用Eclipse过程中会有两种跟<strong>文件编码(charset)</strong>有关的情况让我们不愉快。<br />
<br />
<strong>1 导入一个项目。</strong><br />
&nbsp; 假设你的同事做好了一个项目，为了更好的支持国际化，里面的jsp页面都采用UTF-8，然后发给你，你导入到Eclipse的workspace中，一般情况下，在Eclipse中，这些jsp都变成了GBK编码，你双击打开，一堆乱码。假设你知道原因，稍微如下设置一下可以解决问题：<br />
<br />
<img height="540" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/setcharset.JPG" width="747" border="0" /><br />
(图1 设置文件编码)<br />
但是，这个项目可能包含1000个jsp文件，且你还可能反反复复碰到这个问题，真是一个体力活。<br />
<br />
<strong>2 改变一个项目文件的编码</strong><br />
这种情况发生比较少，但发生了就是一个大难题。比如公司有两个团队，一个开发的项目jsp采用UTF-8编码，另外一个采用GBK编码。一段时间之后，需要整合两个项目，jsp页面只能采用一种编码，UTF-8/GBK或其它。有经验的人知道这是一个<strong>拷贝/设置编码/粘贴</strong>的过程：<br />
&nbsp;2.1 将某个jsp的内容全部拷贝下来。<br />
&nbsp;2.2 如图1所示将编码设置为统一编码如UTF-8。<br />
&nbsp;2.3 把设置过编码的jsp文件清空，然后粘贴。<br />
&nbsp;好像解决问题很完美，但是Eclipse没有宏，如果文件很多，比如2000个，将是一个恐怖的任务。<br />
<br />
因为这两个问题老是反复的困扰着我的同事，相信也困扰了不少Java开发者，Eclipse转码插件很好很方便的解决了这个问题，它基于Eclipse 3.3开发，所以编译环境最好采用Eclipse 3.3。<br />
<br />
下面是使用步骤<br />
<br />
<span style="color: red">step1.</span> 将插件com.lifesting.tool.encoding_1.0.0.jar拷贝到eclipse/plugins目录下，重启Eclipse。<br />
<br />
<span style="color: red">step2.</span> 选择某个项目，右键选择properties，然后点击Convert Setting进行转码规则设置，如下图：<br />
<img height="528" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/projectsetting.JPG" width="768" border="0" /></p>
(图2 项目转码规则设置)<br />
这个表格有四列，分别是<strong>文件后缀</strong>，<strong>文件目前编码</strong>，<strong>转换后的编码</strong>，<strong>是否转换文件内容，</strong>如果转换文件内容，那么对应的是前面所说的第二种情况，不转换文件内容对应的是第一种情况。比如图2的转码规则就是<span style="color: #0000ff">对项目的jsp文件，不管原来是什么编码，统一转为UTF-8编码，并且同时转换文件内容</span>。可以点击右边的Add /Remove按钮来增加/删除规则。最后点击Apply来保存设置。<br />
<br />
<span style="color: #ff0000">step3</span>. 转码<br />
&nbsp;在设置了转码规的项目上，右键选择项目，某几个文件夹或某几个文件(当然一个也可以)，然后点击Lifesting Tools-&gt;Set Encoding。插件将完成转码工作。如果我们选择的是项目，将转换整个项目；如果选择的是文件夹，转换文件夹下所有满足规则的文件；如果选择的是文件，只转换文件。<br />
<img height="672" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/changeencoding.JPG" width="542" border="0" /><br />
(图3 转码)<br />
除了这方式外，我们还可以利用Eclipse的文件搜索功能，将搜到的文件进行转码，如下图：<br />
<img height="298" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/searchencoding.JPG" width="787" border="0" /><br />
(图4 在search view里转码)<br />
如上图所示，我们搜到了整个workspace的jsp文件，然后点击绿色E小图标，插件将会把所有满足结果的文件转码，每个文件的转换规则依赖它所属项目的转码规则设置。<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/192250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-04-11 18:54 <a href="http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>