﻿<?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-乐在其中-随笔分类-Eclipse</title><link>http://www.blogjava.net/charles/category/36935.html</link><description>以JEE为主攻，以Flex为点缀，以Eclipse RCP为乐趣</description><language>zh-cn</language><lastBuildDate>Mon, 04 May 2009 00:54:09 GMT</lastBuildDate><pubDate>Mon, 04 May 2009 00:54:09 GMT</pubDate><ttl>60</ttl><item><title>Platform UI dialogs and JFace dialogs图示及用法</title><link>http://www.blogjava.net/charles/archive/2009/04/29/268256.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 29 Apr 2009 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/04/29/268256.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/268256.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/04/29/268256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/268256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/268256.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/charles/aggbug/268256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-04-29 23:10 <a href="http://www.blogjava.net/charles/archive/2009/04/29/268256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TitleAreaDialog/TrayDialog</title><link>http://www.blogjava.net/charles/archive/2009/04/29/268255.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 29 Apr 2009 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/04/29/268255.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/268255.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/04/29/268255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/268255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/268255.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS">Dialog是SWT和JFace的一个重要的组成部分，我们在开发Plug-in或RCP的时候也经常会用到它们。这篇随笔不会介绍 SWT的Dialog，因为我想很多人都已经非常熟悉它了。在这里，我要讨论的是JFace的Dialog，或者更进一步说是JFace的 TitleAreaDialog。什么是TitleAreaDialog呢？想想我们常常用到的New XX Wizard就知道了。在我们创建一个Java Project或Class的时候，我们所使用的Wizard其实就是由TitleAreaDialog构成的。这种Dialog有如下所示的 TitleArea和一个标准的Button Bar：<br />
<br />
<img height="66" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/TitleArea.png" width="487" />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <img height="66" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/TitleAreaWithErrorMessage.png" width="487" /><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; <span style="font-weight: bold">正常的TitleArea</span>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;<span style="font-weight: bold"> 带有错误信息的TitleArea</span><br />
<br />
<img height="45" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/ButtonBar.png" width="487" /><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; <span style="font-weight: bold">标准的Button Bar</span><br />
<br />
这种GUI的表现力要比SWT的Dialog强很多，而且JFace为该 Dialog封装了很多东西，这也使开发工作变得更加简单，所以我极力推荐使用TitleAreaDialog。那么让我们来看一个最基本的 TitleAreaDialog：<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; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.jface.dialogs.IDialogConstants;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.SWT;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.graphics.Point;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.layout.GridData;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.widgets.Composite;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.widgets.Control;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.eclipse.swt.widgets.Shell;<br />
</span><span style="color: #0000ff; font-family: Courier">import</span><span style="color: #000000; font-family: Courier">&nbsp;org.jthin.jpssp.ide.configuration.Activator;</span><span style="color: #000000; font-family: Courier"><br />
<br />
</span><span style="color: #0000ff; font-family: Courier">public</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">class</span><span style="color: #000000; font-family: Courier">&nbsp;MyTitleAreaDialog&nbsp;</span><span style="color: #0000ff; font-family: Courier">extends</span><span style="color: #000000; font-family: Courier">&nbsp;TitleAreaDialog&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;the&nbsp;dialog<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; font-family: Courier">@param</span><span style="color: #008000; font-family: Courier">&nbsp;parentShell<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">public</span><span style="color: #000000; font-family: Courier">&nbsp;MyTitleAreaDialog(Shell&nbsp;parentShell)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">super</span><span style="color: #000000; font-family: Courier">(parentShell);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;Control&nbsp;createDialogArea(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;area&nbsp;=&nbsp;(Composite)&nbsp;</span><span style="color: #0000ff; font-family: Courier">super</span><span style="color: #000000; font-family: Courier">.createDialogArea(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;container&nbsp;=&nbsp;</span><span style="color: #0000ff; font-family: Courier">new</span><span style="color: #000000; font-family: Courier">&nbsp;Composite(area,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayoutData(</span><span style="color: #0000ff; font-family: Courier">new</span><span style="color: #000000; font-family: Courier">&nbsp;GridData(GridData.FILL_BOTH));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;TitleArea中的Title<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTitle("My&nbsp;TitleAreaDialog");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;TitleArea中的Message<br />
</span><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; setMessage("This&nbsp;is&nbsp;a&nbsp;simple&nbsp;TitleAreaDialog&nbsp;example.");</span><br style="font-family: Courier" />
<br style="font-family: Courier" />
<span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000; font-family: Courier">//&nbsp;TitleArea中的Image<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTitleImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/Neptune.png"));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">return</span><span style="color: #000000; font-family: Courier"><span style="font-family: Courier">&nbsp;area;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">void</span><span style="color: #000000; font-family: Courier">&nbsp;createButtonsForButtonBar(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createButton(parent,&nbsp;IDialogConstants.OK_ID,&nbsp;IDialogConstants.OK_LABEL, </span><span style="color: #0000ff; font-family: Courier">true</span><span style="color: #000000; font-family: Courier">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createButton(parent,&nbsp;IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL,&nbsp;</span><span style="color: #0000ff; font-family: Courier">false</span><span style="color: #000000; font-family: Courier">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;Point&nbsp;getInitialSize()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">return</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">new</span><span style="color: #000000; font-family: Courier">&nbsp;Point(500,&nbsp;375);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span style="color: #000000; font-family: Courier"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">protected</span><span style="color: #000000; font-family: Courier">&nbsp;</span><span style="color: #0000ff; font-family: Courier">void</span><span style="color: #000000; font-family: Courier">&nbsp;configureShell(Shell&nbsp;newShell)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier">super</span><span style="color: #000000; font-family: Courier">.configureShell(newShell);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;Dialog&nbsp;Title<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newShell.setText("Test&nbsp;TitleAreaDialog&nbsp;Title");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier">//&nbsp;Dialog&nbsp;Icon<br />
</span><span style="color: #000000; font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newShell.setImage(ResourceManager.getPluginImage(Activator.getDefault(),&nbsp;"icons/Neptune.png"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
这段代码非常容易理解，从方法签名中可以看出每个方法做了什么事情。注意createButtonsForButtonBar方法，其中用createButton方法创建了OK和Cancel这两个Button，并且把Button的默认点击事件也写好了，就是关闭该 Dialog。ResourceManager.getPluginImage是我自己编写的获得图片的helper method，这里就不讨论其实现了。这段代码会产生如下的Dialog：<br />
<br />
<img height="375" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/BasicTitleAreaDialog.png" width="500" /><br />
<br />
有趣的是，我在这里故意使用了一个128&#215;128的大图标， TitleAreaDialog不会自动缩小或裁减Image，而是调整TitleArea的大小来适应Image。<br />
<br />
接下来我们要为OK Button编写我们自己的事件，例如把用户在Dialog中的输入保存到某处。有人可能会想到为OK Button添加SelectionListener，但实际上这样做是不对的，因为OK Button是JFace为Dialog封装好了的，同时JFace也提供了响应的callback：<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; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.Dialog#okPressed()<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;okPressed()&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;implement&nbsp;your&nbsp;own&nbsp;function&nbsp;here</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; super</span><span style="color: #000000">.okPressed();<br />
}</span></div>
<br />
我们可以在这里实现我们自己的事件，不过最后一定要调用super.okPressed方法，否则Dialog就不会关闭了。 <br />
<br />
OK，以上就是TitleAreaDialog的基本Framework，非常容易理解，下面我们就来在 TitleArea中动态设置一些信息。你可以把这个scenario想象成在用户输入的同时提示用户输入的合法性。TitleAreaDialog提供了好3个方法可以动态设置TitleArea信息，具体如下：<br />
</span>
<ul>
    <li><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">public void setErrorMessage(String newErrorMessage)：显示传入的错误信息。（我们把用这个方法设置的信息叫做error message。）当前显示的信息会被保存起来，等到error message清空之后会再次显示，而清空error message要传入null，而不是传入空字符串。<br />
    </span></span>
    <li><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">setMessage(String newMessage)：显示传入的信息，等同于setMessage(String newMessage, IMessageProvider.NONE)。如果当前显示的是error message，那么newMessage会被保存起来，等到error message清空后再显示。<br />
    </span></span>
    <li><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">setMessage(String newMessage, int newType)：显示传入的信息，并显示指定的信息类型。可用的类型有NONE、INFORMATION、WARNING和ERROR。需要注意的是， setMessage(String newMessage, int </span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">IMessageProvider.ERROR</span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">)和setErrorMessage</span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">(String newErrorMessage)并不相同。后者会覆盖当前的任何信息，而前者只会覆盖当前的非error message，不会影响到error message（也就是说当error message清空后才会显示）。<br />
    </span></span></li>
</ul>
<span style="font-size: 10pt"><span style="font-family: Comic Sans MS">这样，我们就可以为一些文本框添加ModifyListener，然后在其中设置TitleArea的信息了。<br />
<br />
接着，再让我们来看看Button Bar。有些时候，我们希望把OK和Cancel这种默认的Button放置在Button Bar的右侧，而把其他Button放置在Button Bar的左侧，如下图中的Customize... Button：<br />
<br />
<img height="45" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/ButtonBarWithLeftSideButton.png" width="486" /><br />
<br />
这又如何实现呢？有人可能想到在 createButtonsForButtonBar方法中做一些手脚，但是遗憾的是这行不通，我们真正要覆写的是createButtonBar方法，下面是一个简单的例子：<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; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Control&nbsp;createButtonBar(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; Composite&nbsp;composite&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Composite(parent,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp; GridLayout&nbsp;layout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridLayout();<br />
&nbsp;&nbsp;&nbsp; layout.numColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp; layout.marginHeight&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);<br />
&nbsp;&nbsp;&nbsp; layout.marginWidth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);<br />
&nbsp;&nbsp;&nbsp; layout.verticalSpacing&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);<br />
&nbsp;&nbsp;&nbsp; layout.horizontalSpacing&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);<br />
<br />
&nbsp;&nbsp;&nbsp; composite.setLayout(layout);<br />
&nbsp;&nbsp;&nbsp; composite.setLayoutData(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridData(GridData.FILL_HORIZONTAL));<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(isHelpAvailable())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createHelpControl(composite);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; createButton(composite, MyConstants.IMPORT_BUTTON_ID,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Import</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff"> false</span><span style="color: #000000">).addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&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;widgetSelected(SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MessageDialog.openInformation(MaintainModuleDialog.</span><span style="color: #0000ff">this</span><span style="color: #000000">.getShell(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Information</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">Import\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;button&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
<br />
&nbsp;&nbsp;&nbsp; createButton(composite, MyConstants.EXPORT_BUTTON_ID,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Export</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">false</span><span style="color: #000000">).addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&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;widgetSelected(SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MessageDialog.openInformation(MaintainModuleDialog.</span><span style="color: #0000ff">this</span><span style="color: #000000">.getShell(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Information</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">Export\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;button&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
<br />
&nbsp;&nbsp;&nbsp; createButton(composite, MyConstants.OTHER_BUTTON_ID,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Other</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">).addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;widgetSelected(SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MessageDialog.openInformation(MaintainModuleDialog.</span><span style="color: #0000ff">this</span><span style="color: #000000">.getShell(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Information</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">Other\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;button&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
<br />
&nbsp;&nbsp;&nbsp; Label&nbsp;filler&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Label(composite,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp; filler.setLayoutData(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridData(GridData.FILL_HORIZONTAL</span><span style="color: #000000"> |</span><span style="color: #000000">&nbsp;GridData.GRAB_HORIZONTAL));<br />
&nbsp;&nbsp;&nbsp; layout.numColumns</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">super</span><span style="color: #000000">.createButtonsForButtonBar(composite);<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;composite;<br />
}</span></div>
<br />
正如你所见，我们实际上创建了自己的Button Bar，然后在上面添加了3个Button：Import、Export和Other，最后 super.createButtonsForButtonBar会创建OK和Cancel Button。filler是用来在两组Button见占位的。代码中用到的两个convert方法来自 org.eclipse.jface.dialogs.Dialog类，你还可以在这个类中找到一个getButton(int)方法，它可以根据传入的 ID返回用createButton创建的Button。这些都是非常实用的方法。<br />
<br />
回头看一下上面那个完整的 TitleAreaDialog图片，你会看到在Dialog左下角有一个问号符号，这其实是一个Button，点击它可以显示帮助信息，当然帮助信息是由你来创建的。让我们看看Eclipse Search的TitleAreaDialog中的帮助信息吧：<br />
<br />
<img height="450" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/EclipseSearchHelpControl.png" width="728" /><br />
<br />
如果我们也想实现这种帮助机制，那么就要实现如下方法：<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; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TrayDialog#createHelpControl(org.eclipse.swt.widgets.Composite)<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Control&nbsp;createHelpControl(Composite&nbsp;parent)&nbsp;{<br />
</span><span style="color: #008000">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #000000">&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">.createHelpControl(parent);<br />
}</span></div>
<br />
如果不想实现帮助机制，那么最好不要在Dialog中显示出那个问号符号，你可以覆写如下方法并永远返回false，这样就不会显示问号符号了。<br />
<br style="font-family: Courier" />
<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; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-size: 10pt; font-family: Courier"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.TrayDialog#isHelpAvailable()<br />
&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isHelpAvailable()&nbsp;{</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
}</span></div>
<br />
那么这个酷酷的帮助机制到底是个什么东西呢？实际上，它的学名叫做DialogTray。TitleAreaDialog继承了 </span></span><span style="font-size: 10pt"><span style="font-family: Comic Sans MS">org.eclipse.jface.dialogs.TrayDialog类，而TrayDialog就可以显示这种 DialogTray，是不是有点儿拗口呢？实际上，我们不仅仅可以添加帮助信息这一种DialogTray，还可以添加任意的DialogTray，现在就让我们动手实现一个最简单的吧。代码很简单，最主要的就是要实现一个DialogTray，代码如下：<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; font-family: Courier; background-color: #eeeeee"><!--<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.jface.dialogs.DialogTray;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.SWT;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.layout.GridData;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.layout.GridLayout;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Composite;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Control;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Label;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Text;<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;MyDialogTray&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;DialogTray&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.eclipse.jface.dialogs.DialogTray#createContents(org.eclipse.swt.widgets.Composite)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Control&nbsp;createContents(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;container&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Composite(parent,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;GridLayout&nbsp;gridLayout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridLayout();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gridLayout.numColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayout(gridLayout);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Label&nbsp;label&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Label(container,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Name:</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Text&nbsp;text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Text(container,&nbsp;SWT.BORDER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.setLayoutData(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridData(SWT.FILL,&nbsp;SWT.CENTER,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;container;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<br />
我们只在其中创建了一个Label和一个Text，这就足够了。最后，我们为MyTitleAreaDialog添加两个Button，用来打开和关闭MyDialogTray，代码如下：<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; font-family: Courier; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Button&nbsp;openTrayButton&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Button(container,&nbsp;SWT.NONE);<br />
openTrayButton.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Open&nbsp;Tray</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Button&nbsp;closeTrayButton&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Button(container,&nbsp;SWT.NONE);<br />
closeTrayButton.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Close&nbsp;Tray</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
closeTrayButton.setEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
<br />
openTrayButton.addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;widgetSelected(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;SelectionEvent&nbsp;e)&nbsp;{<br />
</span><span style="color: #008000">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //</span><span style="color: #008000">&nbsp;this&nbsp;method&nbsp;is&nbsp;from&nbsp;TrayDialog</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; openTray(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyDialogTray());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openTrayButton.setEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closeTrayButton.setEnabled(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; }<br />
});<br />
<br />
closeTrayButton.addSelectionListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SelectionAdapter()&nbsp;{<br />
&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;widgetSelected(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;this&nbsp;method&nbsp;is&nbsp;from&nbsp;TrayDialog</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closeTray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openTrayButton.setEnabled(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closeTrayButton.setEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; }<br />
});</span></div>
<br />
最后我们会得到如下对话框：<br />
<br />
<img height="375" alt="" src="http://www.cnblogs.com/images/cnblogs_com/allenyoung/OpenTray.png" width="624" /><br />
<br />
好了，就讲这么多吧。如果能把这些东东适当地用在你的Application中，那么效果一定非常棒。</span></span>
 <img src ="http://www.blogjava.net/charles/aggbug/268255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-04-29 23:09 <a href="http://www.blogjava.net/charles/archive/2009/04/29/268255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse中plug-in spy功能</title><link>http://www.blogjava.net/charles/archive/2009/02/12/254454.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Thu, 12 Feb 2009 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/12/254454.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/254454.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/12/254454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/254454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/254454.html</trackback:ping><description><![CDATA[&#8220;Eclipse 3.4提供了一个新功能：在任何界面下按Alt+Shift+F1 (Windows, Mac OS里用Shift+Option+F1)，就可以看到Eclipse用来实现当前选中界面元素的类。&#8221;<br />
<br />
从eclipseworld打听到的，赶紧记下
 <img src ="http://www.blogjava.net/charles/aggbug/254454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-12 22:03 <a href="http://www.blogjava.net/charles/archive/2009/02/12/254454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse UI和JDT UI中几个重要的对话框</title><link>http://www.blogjava.net/charles/archive/2009/02/11/254305.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 11 Feb 2009 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/11/254305.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/254305.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/11/254305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/254305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/254305.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: IContainer 中相对路径的选择文件对话框：&nbsp;&nbsp;&nbsp;import java.util.ArrayList;import java.util.List;&nbsp;import org.eclipse.core.resources.IContainer;import org.eclipse.core.resources.IProject;import org.ecl...&nbsp;&nbsp;<a href='http://www.blogjava.net/charles/archive/2009/02/11/254305.html'>阅读全文</a><img src ="http://www.blogjava.net/charles/aggbug/254305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-11 19:55 <a href="http://www.blogjava.net/charles/archive/2009/02/11/254305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Soad toolkit插件总结</title><link>http://www.blogjava.net/charles/archive/2009/02/08/253820.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Sun, 08 Feb 2009 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/08/253820.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/253820.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/08/253820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/253820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/253820.html</trackback:ping><description><![CDATA[<p>这下终于把这个plugin做完了，最新增加了对Spring/Struts配置文件的Validation</p> <p>其中有个很头疼的问题是，那就是无法读取打包好的插件jar中的xml文件，最后没有办法，只好把这些xml文件分离出来不打包进去，而是放到了eclipse/plugins/目录下的一个文件夹中，这样顺利的解决了访问问题。不知道有没有更好的办法</p> <p>另一个问题是，我使用xalan去做XLST transform,但是它转换完的xml节点是不带namespace前缀的</p> <p>而恰恰恼人的是，xalan的XPATH解析器selectSingleNode()是需要namespace前缀的，即使使用的默认namespace，如&lt;beans xmlns=<a href="http://org.w3c.....&gt;">http://org.w3c.....</a>"&gt;</p> <p>在做XPATH解析的时，也需要带上前缀，如 :beans/:bean, 只有不声明任何namespace时，才可以使用beans/bean, 否则就会抛异常，没办法解决，</p><img src ="http://www.blogjava.net/charles/aggbug/253820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-08 21:32 <a href="http://www.blogjava.net/charles/archive/2009/02/08/253820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse插件之Sring IDE</title><link>http://www.blogjava.net/charles/archive/2009/02/04/253332.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 04 Feb 2009 15:40:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/04/253332.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/253332.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/04/253332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/253332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/253332.html</trackback:ping><description><![CDATA[<p>　本文介绍如何利用Eclipse插件Spring IDE在Eclipse中的使用。<br />
<br />
　　Eclipse是目前非常流行的开发平台，开放扩展的架构让很多程序员找到了自己个性化的工作环境。<br />
<br />
　　<strong>问题提出：</strong><br />
<br />
　　在采用Spring框架进行系统开发时，Bean的配置文件XML的书写、XML文件的内容校验及Bean之间的依赖关系查看等工作，如果能够采用合适的工具来完成，会成倍提高开发效率。<br />
<br />
　　<strong>解决方法</strong>：<br />
<br />
　　Spring IDE是Spring官方网站推荐的Eclipse插件，可提供在开发Spring时对Bean定义文件进行验证并以可视化的方式查看各个Bean之间的依赖关系等。<br />
<br />
　　同时，建议结合Eclipse XMLBuddy插件进行XML文件编辑与校验，是个不错的选择。<br />
安装说明 <br />
<br />
　　JDK：1.5.0　　　　　从<a href="http://java.sun.com/">http://java.sun.com</a>上去下载安装<br />
<br />
　　Eclipse：3.1.2　　　从<a href="http://www.eclipse.org/"><font color="#800080">http://www.eclipse.org</font></a> 上去下载解压<br />
<br />
　　Spring 1.2.8　　　　从<a href="http://www.springframework.org/">http://www.springframework.org</a> 上去下载解压<br />
<br />
　　Spring IDE 1.3.2　　从<a href="http://springide.org/">http://springide.org</a> 上去下载<br />
<br />
　　XMLBuddy 2.0.72　　从<a href="http://www.xmlbuddy.com/">http://www.xmlbuddy.com/</a> 上去下载<br />
<br />
　　Spring IDE 1.3.2 Update地址为：<a href="http://springide.org/updatesite/">http://springide.org/updatesite/</a><br />
<br />
　　<strong>管理技巧</strong> <br />
<br />
　　提示：新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去，一大堆，累死你：（<br />
</p>
<ol>
    <li>前提是你已经下载解压并设置好Eclipse工具，比如解压在E:\OpenSource\Eclipse\目录下，以下这个目录以%ECLIPSE_HOME%来进行表示；
    <li>此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的；
    <li>在%ECLIPSE_HOME%下建立一个PlugInsNew的目录； <br />
    　　比如：E:\OpenSource\Eclipse\PlugInsNew<br />
    <li>如果你下载了一个新的插件，比如叫做：XYZ <br />
    <br />
    那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录，目录里面是eclipse目录，eclipse目录包含有features与plugins两个子目录；结构如下图所示：<br />
    <br />
    <img height="410" alt="图1" src="http://dev.yesky.com/imagelist/06/32/d6916ax72g42.jpg" width="220" border="0" twffan="done" /><br />
    <li>把下载的新插件的文件放在以下相应目录中； <br />
    　　%ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features<br />
    <br />
    　　%ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins<br />
    <br />
    <li>建立相关的.link的文件； <br />
    <br />
    　　然后在%ECLIPSE_HOME%\links目录里建立一个XYZ.link的文件<br />
    <br />
    　　内容如是：<br />
    <br />
    　　path=E:/OpenSource/Eclipse/PlugInsNew/XYZ<br />
    <br />
    　　就一行这样的路径指示而已。<br />
    <br />
    　　这样，如果你下载了多个插件就可以如法炮制建立多个Link文件，想加载哪个插件就把哪个插件的Link文件放到%ECLIPSE_HOME%\links的目录中即可，使用与管理都很方便，建议千万不要放在默认的安装目录中，这样对于升级Eclipse主程序也方便一些；当然如果你喜欢用Find and Install&#8230;进行安装的话也可以的；<br />
    <br />
    　　如果上面你的%ECLIPSE_HOME%与此不同，请修改XYZ.link文件里的路径。<br />
    <br />
    <li>删除插件，先关闭Eclipse； <br />
    　　删除%ECLIPSE_HOME%\links\XYZ.link文件即可<br />
    <br />
    　　删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录及文件<br />
    <br />
    <li>重新启动Eclipse，这样就可以了。如果插件没有生效或者没有删除，请加上-clean进行启动Eclipse，即Eclipse.exe &#8211;clean <br />
    <br />
    <li>插件安装验证及记录详见：Eclipse的workspace下面的.metadata\.log文件，比如：%ECLIPSE_HOME%\workspace\.metadata\.log文件，有问题的话，打开这个文件看看并进行解决。 </li>
</ol>
<p>　<strong>确认安装</strong> <br />
<br />
　　此插件安装方法采用上一节的《Eclipse使用技巧之插件管理》<br />
<br />
　　重新启动Eclipse后，在Help &#232; About Eclipse SDK &#232; Plug-in Details你可以看到由&#8220;Spring IDE Developer&#8221;提供的&#8220;Spring IDE&#8221;版本为&#8220;1.3.2&#8221;插件及相关的Graph、UI及UI Search插件，如下图所示：<br />
<br />
<img height="262" alt="图2" src="http://dev.yesky.com/imagelist/06/32/z2z97w8km0y5.jpg" width="553" border="0" twffan="done" /><br />
　<br />
　　<strong>相关要求 <br />
</strong><br />
　　注意：为了让Spring IDE插件能够显示可视化的Bean结构图形及Bean之间的依赖关系，需要Eclipse GEF(Graphical Editing Framework)的支持，自己下载并解压安装，安装技巧同上《Eclipse使用技巧之插件管理》。<br />
<br />
　　Spring 1.2系列当前最新的稳定版本为1.2.8，下载时可以选择包含Spring所依赖的一些开源包的文件spring-framework-1.2.8-with-dependencies.zip，如果你已经清楚并有了Spring所依赖的相关开源包，就单独下载spring-framework-1.2.8.zip即可。建议下载前者。<br />
<br />
　　解压后目录结构及包的说明如下：<br />
<br />
<img height="379" alt="图3" src="http://dev.yesky.com/imagelist/06/32/z81tmom8z2rk.jpg" width="529" border="0" twffan="done" /><br />
<br />
　　dist目录下是Spring的发布包，关于发布包下面会详细进行说明；<br />
<br />
　　docs目录下是相关的文档，包括有Spring api的javadoc、reference参考指南、Spring的taglib标签使用文件及Spring MVC的MVC-step-by-step讲解与示例；<br />
<br />
　　lib目录下是Spring所依赖的第三方开源包；<br />
<br />
　　mock目录下是Spring辅助应用测试的Mock源程序；<br />
<br />
　　samples目录下是Spring的示例源程序及简单的webapp示例框架的示例配置，值得好好学习的有jpetstore及petclinic，当然其它的countries、imagedb、tiles-example也可以好好参考一下；<br />
<br />
　　src目录下是Spring的源程序；<br />
<br />
　　test目录下Spring的单元测试源程序；<br />
<br />
　　tiger目录下是Java 1.5 Tiger方面的相关及测试源程序。<br />
<br />
　　<strong>Spring包结构说明</strong> <br />
<br />
　　接下来详细说说dist目录下jar包的相关内容<br />
<br />
　　spring.jar是包含有完整发布的单个jar包，spring.jar中除了spring-mock.jar里所包含的内容外其它所有jar包的内容，因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试，正式应用系统中是用不得这些类的。<br />
<br />
　　除了spring.jar文件，Spring还包括有其它13个独立的jar包，各自包含着对应的Spring组件，用户可以根据自己的需要来选择组合自己的jar包，而不必引入整个spring.jar的所有类文件。<br />
<br />
　　spring-core.jar<br />
<br />
　　这个jar文件包含Spring框架基本的核心工具类，Spring其它组件要都要使用到这个包里的类，是其它组件的基本核心，当然你也可以在自己的应用系统中使用这些工具类。<br />
<br />
　　spring-beans.jar<br />
<br />
　　这个jar文件是所有应用都要用到的，它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection（IoC/DI）操作相关的所有类。如果应用只需基本的IoC/DI支持，引入spring-core.jar及spring-beans.jar文件就可以了。<br />
<br />
　　spring-aop.jar<br />
<br />
　　这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性，如声明型事务管理（Declarative Transaction Management），也要在应用里包含这个jar包。<br />
<br />
　　spring-context.jar<br />
<br />
　　这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类，JDNI所需的全部类，UI方面的用来与模板（Templating）引擎如Velocity、FreeMarker、JasperReports集成的类，以及校验Validation方面的相关类。<br />
<br />
　　spring-dao.jar<br />
<br />
　　这个jar文件包含Spring DAO、Spring Transaction进行数据访问的所有类。为了使用声明型事务支持，还需在自己的应用里包含spring-aop.jar。<br />
<br />
　　spring-hibernate.jar<br />
<br />
　　这个jar文件包含Spring对Hibernate 2及Hibernate 3进行封装的所有类。<br />
<br />
　　spring-jdbc.jar<br />
<br />
　　这个jar文件包含对Spring对JDBC数据访问进行封装的所有类。<br />
<br />
　　spring-orm.jar<br />
<br />
　　这个jar文件包含Spring对DAO特性集进行了扩展，使其支持 iBATIS、JDO、OJB、TopLink，因为Hibernate已经独立成包了，现在不包含在这个包里了。这个jar文件里大部分的类都要依赖spring-dao.jar里的类，用这个包时你需要同时包含spring-dao.jar包。<br />
<br />
　　spring-remoting.jar<br />
<br />
　　这个jar文件包含支持EJB、JMS、远程调用Remoting（RMI、Hessian、Burlap、Http Invoker、JAX-RPC）方面的类。<br />
<br />
　　spring-support.jar<br />
<br />
　　这个jar文件包含支持缓存Cache（ehcache）、JCA、JMX、邮件服务（Java Mail、COS Mail）、任务计划Scheduling（Timer、Quartz）方面的类。<br />
<br />
　　spring-web.jar<br />
<br />
　　这个jar文件包含Web应用开发时，用到Spring框架时所需的核心类，包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。<br />
<br />
　　spring-webmvc.jar<br />
<br />
　　这个jar文件包含Spring MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。当然，如果你的应用使用了独立的MVC框架，则无需这个JAR文件里的任何类。<br />
<br />
　　spring-mock.jar<br />
<br />
　　这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类，这样测试就更加简单。模拟HttpServletRequest和HttpServletResponse类在Web应用单元测试是很方便的。<br />
<br />
　　如何选择这些发布包，决定选用哪些发布包其实相当简单。如果你正在构建Web应用并将全程使用Spring，那么最好就使用单个全部的spring.jar文件；如果你的应用仅仅用到简单的Inversion of Control / Dependency Injection（IoC/DI）容器，那么只需spring-core.jar与spring-beans.jar即可；如果你对发布的大小要求很高，那么就得精挑细选了，只取包含自己所需特性的jar文件了。采用独立的发布包你可以避免包含自己的应用不需要的全部类。当然你可以采用其它的一些工具来设法令整个应用包变小，节省空间的重点在于准确地找出自己所需的Spring依赖类，然后合并所需的类与包就可以了。Eclispe有个插件叫ClassPath Helper可以帮你找找所依赖的类。<br />
<br />
　　<strong>Spring包依赖说明</strong> </p>
<pre class="code">spring-core.jar需commons-collections.jar，spring-core.jar是以下其它各个的基本。
spring-beans.jar需spring-core.jar/cglib-nodep-2.1_3.jar
spring-aop.jar需spring-core.jar/spring-beans.jar/cglib-nodep-2.1_3.jar/aopalliance.jar
spring-context.jar需
spring-core.jar/spring-beans.jar/spring-aop.jar/commons-collections.jar/aopalliance.jar
spring-dao.jar需spring-core.jar/spring-beans.jar/spring-aop.jar/spring-context.jar
spring-jdbc.jar需spring-core.jar/spring-beans.jar/spring-dao.jar
spring-web.jar需spring-core.jar/spring-beans.jar/spring-context.jar
spring-webmvc.jar需spring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar
spring-hibernate.jar需
spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-orm.jar/spring-web.jar/spring-webmvc.jar
spring-orm.jar需
spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-web.jar/spring-webmvc.jar
spring-remoting.jar需
spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-web.jar/spring-webmvc.jar
spring-support.jar需
spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-jdbc.jar
spring-mock.jar需spring-core.jar/spring-beans.jar/spring-dao.jar/spring-context.jar/spring-jdbc</pre>
　<strong>插件介绍</strong> <br />
<br />
　　我们简单地创建一个示例工程，里面包含有一个接口类与两个实现该接口的实现类进行演示说明使用的方法。<br />
<br />
　　需要引入spring.jar、commons-logging.jar、log4j.jar<br />
<br />
　　单个引入需要引入spring-core.jar、spring-beans.jar、spring-context.jar<br />
<br />
　　接口类：IHelloWorld.java<br />
<pre class="code">public interface&nbsp;&nbsp;&nbsp;&nbsp; IHelloWorld
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sayHelloWorld();
}</pre>
<br />
　　实现类一：HelloWorld1.java<br />
<pre class="code">public class HelloWorld1 implements IHelloWorld
{
public HelloWorld1()
{
&nbsp;&nbsp;&nbsp;&nbsp; super();
}
public String sayHelloWorld()
{
&nbsp;&nbsp;&nbsp;&nbsp; return "Hello World HelloWorld1";
}
}
</pre>
<br />
　　实现类二：HelloWorld2.java<br />
<pre class="code">public class HelloWorld2 implements IHelloWorld
{
public HelloWorld2()
{
&nbsp;&nbsp;&nbsp;&nbsp; super();
}
public String sayHelloWorld()
{
&nbsp;&nbsp;&nbsp;&nbsp; return "Hello World HelloWorld2";
}
}
</pre>
<br />
　　根据常用的三层与Spring的最佳实践，将配置文件分成了四个<br />
<br />
　　beanRefFactory.xml负责总装，由SingletonBeanFactoryLocator来装入<br />
<br />
　　通过ClassPathXmlApplicationContext来把其它三个模块的文件引入<br />
<br />
　　beanRefDataAccess.xml负责DAO，与数据库相关的bean都定义在这里<br />
<br />
　　beanRefService.xml负责Service层的bean定义<br />
<br />
　　beanRefMVC.xml负责Spring MVC方面相关的bean定义等等<br />
<br />
　　以下配置文件的bean定义为演示所用，各自的内容如下：<br />
<br />
　　beanRefFactory.xml的内容如下：<br />
<pre class="code">＜xml version="1.0" encoding="UTF-8"＞
＜!DOCTYPE beans PUBLIC&nbsp;&nbsp;&nbsp;&nbsp; "-//SPRING//DTD BEAN//EN"&nbsp;&nbsp;&nbsp;&nbsp;
"http://www.springframework.org/dtd/spring-beans.dtd"＞
＜beans＞
＜bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext"＞
＜constructor-arg＞
＜list＞
＜value＞beanRefDataAccess.xml＜/value＞
＜value＞beanRefService.xml＜/value＞
＜value＞beanRefMVC.xml＜/value＞
＜/list＞
＜/constructor-arg＞
＜/bean＞
＜/beans＞</pre>
<br />
　　beanRefDataAccess.xml的内容如下：<br />
<pre class="code">　　＜xml version="1.0" encoding="UTF-8"＞
＜!DOCTYPE beans PUBLIC&nbsp;&nbsp;&nbsp;&nbsp; "-//SPRING//DTD BEAN//EN"&nbsp;&nbsp;&nbsp;&nbsp;
"http://www.springframework.org/dtd/spring-beans.dtd"＞
＜beans＞
＜bean id="helloWorldDAO1" class="HelloWorld1"/＞
＜bean id="helloWorldDAO2" class="HelloWorld2"/＞
＜/beans＞</pre>
<br />
　　beanRefService.xml的内容如下：<br />
<pre class="code">　　＜xml version="1.0" encoding="UTF-8"＞
＜!DOCTYPE beans PUBLIC&nbsp;&nbsp;&nbsp;&nbsp; "-//SPRING//DTD BEAN//EN"&nbsp;&nbsp;&nbsp;&nbsp;
"http://www.springframework.org/dtd/spring-beans.dtd"＞
＜beans＞
＜bean id="helloWorld1" class="HelloWorld1"/＞
＜bean id="helloWorld2" class="HelloWorld2"/＞
＜bean id="springDemoConstructor" class="SpringDemoConstructor"＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜constructor-arg＞
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ＜value＞Spring IDE Constructor＜/value＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜/constructor-arg＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜property name="helloWorld"＞
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ＜ref bean="helloWorld1"＞＜/ref＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜/property＞
＜/bean＞
＜bean id="springDemoSetter" class="SpringDemoSetter"＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜property name="hello" value="Spring IDE Setter"/＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜property name="helloWorld"＞
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ＜ref bean="helloWorld2"＞＜/ref＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜/property＞
＜/bean＞
＜/beans＞</pre>
<br />
　　beanRefMVC.xml的内容如下：<br />
<pre class="code">　　＜xml version="1.0" encoding="UTF-8"＞
＜!DOCTYPE beans PUBLIC&nbsp;&nbsp;&nbsp;&nbsp;
"-//SPRING//DTD BEAN//EN"&nbsp;&nbsp;&nbsp;&nbsp;
"http://www.springframework.org/dtd/spring-beans.dtd"＞
＜beans＞
＜bean id="helloWorldMVC1" class="HelloWorld1"/＞
＜bean id="helloWorldMVC2" class="HelloWorld2"/＞
＜/beans＞
</pre>
<br />
　　右键项目工程：可以看到&#8220;Add Spring Project Nature&#8221;菜单，单击它<br />
<br />
<img height="505" alt="图4" src="http://dev.yesky.com/imagelist/06/32/5twrz15i86zx.jpg" width="314" border="0" twffan="done" /><br />
<br />
　　细心的你一定可以看到项目工程SpringIDEDemo前面的图标变成了一个S的标志，而不是原来的J，当然项目里与Spring相关的文件都会在图标上显示一个S标志。J<br />
<br />
　　右键弹出的菜单里就会有个&#8220;Remove Spring Project Nature&#8221;的菜单了。<br />
<br />
　　你选择这个菜单进行移除后就不能进行以下的相关操作了。<br />
<br />
<img height="504" alt="图5" src="http://dev.yesky.com/imagelist/06/32/0c86vp43g5ij.jpg" width="314" border="0" twffan="done" /><br />
<br />
　　Window &#232; Show View &#232; Other&#8230; &#232; 可以看到Spring IDE，打开它，如下所示，所中它并确定。<br />
<br />
<img height="414" alt="图6" src="http://dev.yesky.com/imagelist/06/32/2896bo100g72.jpg" width="296" twffan="done" /><br />
<br />
　　可以看到如下的视图，右键工程的名称，在弹出的Properties菜单上点击它<br />
<br />
<img height="160" alt="图7" src="http://dev.yesky.com/imagelist/06/32/e5u51atl5455.jpg" width="492" twffan="done" /><br />
<br />
　　弹出属性框，让我们来添加配置文件<br />
<br />
<img height="518" alt="图8" src="http://dev.yesky.com/imagelist/06/32/vt0l7n44q762.jpg" width="448" twffan="done" /><br />
<br />
　　确定后，可以看到刚才选择的四个配置文件已经在里面了，再次确定。<br />
<br />
<img height="518" alt="图9" src="http://dev.yesky.com/imagelist/06/32/h264f174175r.jpg" width="448" twffan="done" /><br />
<br />
　　在Spring Beans视图里展开工程后，便可以看到增加进来的四个配置文件了。<br />
<br />
<img height="160" alt="图10" src="http://dev.yesky.com/imagelist/06/32/ai41px974xoy.jpg" width="492" twffan="done" /><br />
<br />
　　也可以将配置文件放到配置集合里，如下所示：<br />
<br />
<img height="518" alt="图11" src="http://dev.yesky.com/imagelist/06/32/2mu3ugxaw8tg.jpg" width="549" twffan="done" /><br />
<br />
　　这样确定以后，可以看到四个文件都属于Service的节点下面，如下所示。<br />
<br />
<img height="518" alt="图12" src="http://dev.yesky.com/imagelist/06/32/84qsfz8eom6k.jpg" width="549" twffan="done" /><br />
<br />
　　再次确定后，在Spring Beans视图里看到Service节点，展开它，可以看到所有配置文件里的bean都在这里列出来了。<br />
<br />
<img height="419" alt="图13" src="http://dev.yesky.com/imagelist/06/32/827y0tx4395l.jpg" width="504" twffan="done" /><br />
<br />
　　展开显示两个定义的bean结点，右键其中的一个结点，弹出四个菜点，最后一个就是上面的配置菜单，不再讲解了，我们选中&#8220;Open Config File&#8221;菜单<br />
<br />
<img height="218" alt="图14" src="http://dev.yesky.com/imagelist/06/32/r06pzcttvmiw.jpg" width="492" twffan="done" /><br />
<br />
　　于是就会自动打开配置文件，并定位到bean的定义位置上面去了，如下所示，方便进行查看与改动。<br />
<br />
<img height="133" alt="图15" src="http://dev.yesky.com/imagelist/06/32/7s3fng8f3kpp.jpg" width="430" twffan="done" /><br />
<br />
　　在右键弹出的菜单点选中&#8220;Open Bean Class&#8221;，<br />
<br />
<img height="218" alt="图16" src="http://dev.yesky.com/imagelist/06/32/2338257is88s.jpg" width="492" twffan="done" /><br />
<br />
　　就会自动定位到对应的类文件里去了，如下所示。<br />
<br />
<img height="234" alt="图17" src="http://dev.yesky.com/imagelist/06/32/i6i5cfr4jij6.jpg" width="423" twffan="done" /><br />
<br />
　　在右键弹出的菜单点选中&#8220;Show Graph&#8221;，<br />
<br />
<img height="218" alt="图18" src="http://dev.yesky.com/imagelist/06/32/8hu3slsi9ih6.jpg" width="492" twffan="done" /><br />
<br />
　　就会把当前这个bean以图形的方式显示出来，如下所示。<br />
<br />
<img height="98" alt="图19" src="http://dev.yesky.com/imagelist/06/32/404yeo2kl4zx.jpg" width="321" twffan="done" /><br />
<br />
　　但是这个演示的文件仅是一个独立的bean，没有任何关联等，下面会演示关联等。<br />
<br />
　　在Spring Beans视图里展开工程后，选中src/beanRefSerice.xml配置文件，在右键弹出的菜单点选中&#8220;Show Graph&#8221;<br />
<br />
<img height="218" alt="图20" src="http://dev.yesky.com/imagelist/06/32/r9u1m3dg03fk.jpg" width="492" twffan="done" /><br />
<br />
　　就会把当前整个配置文件的内容以bean图形的方式显示出来，如下所示。<br />
<br />
<img height="105" alt="图21" src="http://dev.yesky.com/imagelist/06/32/0no61870v3xl.jpg" width="283" twffan="done" /><br />
<br />
　　以下演示bean的引用及构造注入与setter注入何关联等，更多的操作类似了。<br />
<br />
　　定义一个接口类ISpringDemo.java，有两个方法<br />
<pre class="code">　　public interface ISpringDemo
{
IHelloWorld getHelloWorld();
String getHello();
}
</pre>
<br />
　　实现类一SpringDemoConstructor.java，含有构造注入及setter注入<br />
<pre class="code">　　public class SpringDemoConstructor implements ISpringDemo
{
private String hello;
private IHelloWorld helloWorld;
&nbsp;&nbsp;&nbsp;
public SpringDemoConstructor(String hello)
{
&nbsp;&nbsp;&nbsp; this.hello = hello;
}
&nbsp;&nbsp;&nbsp;
public String getHello()
{
&nbsp;&nbsp;&nbsp; return hello;
}
public IHelloWorld getHelloWorld()
{
&nbsp;&nbsp;&nbsp; return helloWorld;
}
public void setHelloWorld(IHelloWorld helloWorld)
{
&nbsp;&nbsp;&nbsp; this.helloWorld = helloWorld;
}
}
</pre>
<br />
　　实现类二SpringDemoSetter.java，都是setter注入<br />
<pre class="code">　　public class SpringDemoSetter implements ISpringDemo
{
private String hello;
private IHelloWorld helloWorld;
public String getHello()
{
&nbsp;&nbsp;&nbsp; return hello;
}
public void setHello(String hello)
{
&nbsp;&nbsp;&nbsp; this.hello = hello;
}
public IHelloWorld getHelloWorld()
{
&nbsp;&nbsp;&nbsp; return helloWorld;
}
public void setHelloWorld(IHelloWorld helloWorld)
{
&nbsp;&nbsp;&nbsp; this.helloWorld = helloWorld;
}
}
</pre>
<br />
　　配置文件beanRefService.xml增加bean定义，成为如下，红字为新增的<br />
<pre class="code">　　＜xml version="1.0" encoding="UTF-8"＞
＜!DOCTYPE beans PUBLIC&nbsp;&nbsp;&nbsp;
"-//SPRING//DTD BEAN//EN"&nbsp;&nbsp;&nbsp;
"http://www.springframework.org/dtd/spring-beans.dtd"＞
＜beans＞
＜bean id="helloWorld1" class="HelloWorld1"/＞
＜bean id="helloWorld2" class="HelloWorld2"/＞
＜bean id="springDemoConstructor" class="SpringDemoConstructor"＞
&nbsp;&nbsp;&nbsp; ＜constructor-arg＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜value＞Spring IDE Constructor＜/value＞
&nbsp;&nbsp;&nbsp; ＜/constructor-arg＞
&nbsp;&nbsp;&nbsp; ＜property name="helloWorld"＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜ref bean="helloWorld1"＞＜/ref＞
&nbsp;&nbsp;&nbsp; ＜/property＞
＜/bean＞
＜bean id="springDemoSetter" class="SpringDemoSetter"＞
&nbsp;&nbsp;&nbsp; ＜property name="hello" value="Spring IDE Setter"/＞
&nbsp;&nbsp;&nbsp; ＜property name="helloWorld"＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜ref bean="helloWorld2"＞＜/ref＞
&nbsp;&nbsp;&nbsp; ＜/property＞
＜/bean＞
＜/beans＞</pre>
<br />
　　注意：<br />
<br />
　　如果bean是定义在同一个文件里的可以用<br />
<pre class="code">　　＜ref local="helloWorld2"＞＜/ref＞</pre>
<br />
　　如果不是在同一个配置文件里的，要用<br />
<pre class="code">　　＜ref bean="helloWorld2"＞＜/ref＞</pre>
<br />
　　要不然会报到bean找不到！<br />
<br />
　　这样配置完成后，我们切换到&#8220;Spring Beans&#8221;视图，在beanRefService.xml节点上右键打开&#8220;Show Graph&#8221;菜单，可以看到如下所示：<br />
<br />
<img height="176" alt="图21" src="http://dev.yesky.com/imagelist/06/32/wt89o365m565.jpg" width="335" twffan="done" /><br />
<br />
　　这时bean里面简单的引用关系就表现出来了。<br />
<br />
<img height="228" alt="图22" src="http://dev.yesky.com/imagelist/06/32/bn4jz247uv13.jpg" width="365" twffan="done" /><br />
<br />
　　在bean图上右键，会打开三个操作菜单：<br />
<br />
　　Open Java Type即定位到bean的类文件上面；<br />
<br />
　　Open Config File即定位到bean的xml配置文件上面；<br />
<br />
　　Show In Beans View即定位到&#8220;Spring Beans&#8221;的视图里的具体某个节点上，如下所示。<br />
<br />
<img height="419" alt="图23" src="http://dev.yesky.com/imagelist/06/32/rksl54z34f3d.jpg" width="504" twffan="done" /><br />
<br />
　　此时我们可以在配置集合的Service节点上面右键，选择&#8220;Show Graph&#8221;<br />
<br />
<img height="419" alt="图24" src="http://dev.yesky.com/imagelist/06/32/t40r8jlpws13.jpg" width="504" twffan="done" /><br />
<br />
　　这样就会显示出所有的配置文件集合里的所有bean文件及其关联引用情况，如下图。<br />
<br />
<img height="304" alt="图25" src="http://dev.yesky.com/imagelist/06/32/16p429uy2i81.jpg" width="526" twffan="done" /><br />
<br />
　　带圈的P图标表示是属性，即setter方法注入，带圈的C图标表示构造注入。箭头表示引用关系了。J<br />
<br />
　　中间一排演示用的四个bean没有关联引入，就光杆司令地在那里排队了啦J<br />
<br />
　　最下面的带圈的C后面又跟着一大排参数，表示集合类型的了。如list<br />
<br />
　　Spring IDE提供错误检查功能，比如我在配置文件中输入一个不存在的类的名称，保存后，就会在边上出现红色提示，鼠标移上去就会出现提示信息，如下图所示。<br />
<br />
<img height="321" alt="图26" src="http://dev.yesky.com/imagelist/06/32/n4b5g7588er3.jpg" width="553" twffan="done" /><br />
<br />
　　当然也会有Problems视图里显示相应的错误信息，如下图：<br />
<br />
<img height="200" alt="图27" src="http://dev.yesky.com/imagelist/06/32/8l4z19qim446.jpg" width="553" twffan="done" /><br />
<br />
　　以下演示bean的引用及构造注入与setter注入何关联等，更多的操作类似了。<br />
<br />
　　定义一个接口类ISpringDemo.java，有两个方法<br />
<pre class="code">　　public interface ISpringDemo
{
IHelloWorld getHelloWorld();
String getHello();
}
</pre>
<br />
　　实现类一SpringDemoConstructor.java，含有构造注入及setter注入<br />
<pre class="code">　　public class SpringDemoConstructor implements ISpringDemo
{
private String hello;
private IHelloWorld helloWorld;
&nbsp;&nbsp;&nbsp;
public SpringDemoConstructor(String hello)
{
&nbsp;&nbsp;&nbsp; this.hello = hello;
}
&nbsp;&nbsp;&nbsp;
public String getHello()
{
&nbsp;&nbsp;&nbsp; return hello;
}
public IHelloWorld getHelloWorld()
{
&nbsp;&nbsp;&nbsp; return helloWorld;
}
public void setHelloWorld(IHelloWorld helloWorld)
{
&nbsp;&nbsp;&nbsp; this.helloWorld = helloWorld;
}
}
</pre>
<br />
　　实现类二SpringDemoSetter.java，都是setter注入<br />
<pre class="code">　　public class SpringDemoSetter implements ISpringDemo
{
private String hello;
private IHelloWorld helloWorld;
public String getHello()
{
&nbsp;&nbsp;&nbsp; return hello;
}
public void setHello(String hello)
{
&nbsp;&nbsp;&nbsp; this.hello = hello;
}
public IHelloWorld getHelloWorld()
{
&nbsp;&nbsp;&nbsp; return helloWorld;
}
public void setHelloWorld(IHelloWorld helloWorld)
{
&nbsp;&nbsp;&nbsp; this.helloWorld = helloWorld;
}
}
</pre>
<br />
　　配置文件beanRefService.xml增加bean定义，成为如下，红字为新增的<br />
<pre class="code">　　＜xml version="1.0" encoding="UTF-8"＞
＜!DOCTYPE beans PUBLIC&nbsp;&nbsp;&nbsp;
"-//SPRING//DTD BEAN//EN"&nbsp;&nbsp;&nbsp;
"http://www.springframework.org/dtd/spring-beans.dtd"＞
＜beans＞
＜bean id="helloWorld1" class="HelloWorld1"/＞
＜bean id="helloWorld2" class="HelloWorld2"/＞
＜bean id="springDemoConstructor" class="SpringDemoConstructor"＞
&nbsp;&nbsp;&nbsp; ＜constructor-arg＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜value＞Spring IDE Constructor＜/value＞
&nbsp;&nbsp;&nbsp; ＜/constructor-arg＞
&nbsp;&nbsp;&nbsp; ＜property name="helloWorld"＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜ref bean="helloWorld1"＞＜/ref＞
&nbsp;&nbsp;&nbsp; ＜/property＞
＜/bean＞
＜bean id="springDemoSetter" class="SpringDemoSetter"＞
&nbsp;&nbsp;&nbsp; ＜property name="hello" value="Spring IDE Setter"/＞
&nbsp;&nbsp;&nbsp; ＜property name="helloWorld"＞
&nbsp;&nbsp;&nbsp;&nbsp; ＜ref bean="helloWorld2"＞＜/ref＞
&nbsp;&nbsp;&nbsp; ＜/property＞
＜/bean＞
＜/beans＞</pre>
<br />
　　注意：<br />
<br />
　　如果bean是定义在同一个文件里的可以用<br />
<pre class="code">　　＜ref local="helloWorld2"＞＜/ref＞</pre>
<br />
　　如果不是在同一个配置文件里的，要用<br />
<pre class="code">　　＜ref bean="helloWorld2"＞＜/ref＞</pre>
<br />
　　要不然会报到bean找不到！<br />
<br />
　　这样配置完成后，我们切换到&#8220;Spring Beans&#8221;视图，在beanRefService.xml节点上右键打开&#8220;Show Graph&#8221;菜单，可以看到如下所示：<br />
<br />
<img height="176" alt="图21" src="http://dev.yesky.com/imagelist/06/32/wt89o365m565.jpg" width="335" twffan="done" /><br />
<br />
　　这时bean里面简单的引用关系就表现出来了。<br />
<br />
<img height="228" alt="图22" src="http://dev.yesky.com/imagelist/06/32/bn4jz247uv13.jpg" width="365" twffan="done" /><br />
<br />
　　在bean图上右键，会打开三个操作菜单：<br />
<br />
　　Open Java Type即定位到bean的类文件上面；<br />
<br />
　　Open Config File即定位到bean的xml配置文件上面；<br />
<br />
　　Show In Beans View即定位到&#8220;Spring Beans&#8221;的视图里的具体某个节点上，如下所示。<br />
<br />
<img height="419" alt="图23" src="http://dev.yesky.com/imagelist/06/32/rksl54z34f3d.jpg" width="504" twffan="done" /><br />
<br />
　　此时我们可以在配置集合的Service节点上面右键，选择&#8220;Show Graph&#8221;<br />
<br />
<img height="419" alt="图24" src="http://dev.yesky.com/imagelist/06/32/t40r8jlpws13.jpg" width="504" twffan="done" /><br />
<br />
　　这样就会显示出所有的配置文件集合里的所有bean文件及其关联引用情况，如下图。<br />
<br />
<img height="304" alt="图25" src="http://dev.yesky.com/imagelist/06/32/16p429uy2i81.jpg" width="526" twffan="done" /><br />
<br />
　　带圈的P图标表示是属性，即setter方法注入，带圈的C图标表示构造注入。箭头表示引用关系了。J<br />
<br />
　　中间一排演示用的四个bean没有关联引入，就光杆司令地在那里排队了啦J<br />
<br />
　　最下面的带圈的C后面又跟着一大排参数，表示集合类型的了。如list<br />
<br />
　　Spring IDE提供错误检查功能，比如我在配置文件中输入一个不存在的类的名称，保存后，就会在边上出现红色提示，鼠标移上去就会出现提示信息，如下图所示。<br />
<br />
<img height="321" alt="图26" src="http://dev.yesky.com/imagelist/06/32/n4b5g7588er3.jpg" width="553" twffan="done" /><br />
<br />
　　当然也会有Problems视图里显示相应的错误信息，如下图：<br />
<br />
<img height="200" alt="图27" src="http://dev.yesky.com/imagelist/06/32/8l4z19qim446.jpg" width="553" twffan="done" /><br />
<br />
　<strong>XMLBuddy</strong><br />
<br />
　　由于打开XML文件时会根据XML文件里定义的DTD去网上查找相应的DTD文件，这样导至打开的时候会相当慢，特别是如果你的机器上不了外网的话，就更慢了。<br />
<br />
　　解决的办法有两个：<br />
<br />
　　一、在本机开启Web服务（如Tomcat等等），并设置端口为80，然后根据DTD 的目录结构建立相应的结构，并把DTD文件放进去。然后在hosts文件里把本机的地址映射到相应的DTD指定的网站去，如：<br />
<br />
　　127.0.0.1// www.springframework.org<br />
<br />
　　这样打开XML文件时就会在本机寻找DTD文件进行验证，速度就快很多了J<br />
<br />
　　二、打开XMLBuddy插件的安装目录，并找到其中的cache目录，比如：%ECLIPSE_HOME%\PlugInsNew\xmlbuddy\eclipse\plugins\com.objfac.xmleditor_2.0.72\.cache<br />
<br />
　　打开meta.xml文件，一看就知道怎么处理了吧，如法炮制，选把DTD文件拷贝到这个cache目录里，再增加内容到meta.xml里来，比如：<br />
<pre class="code">＜file＞
＜pub＞-//SPRING//DTD&nbsp;&nbsp;&nbsp; BEAN//EN＜/pub＞
＜abs＞http://www.springframework.org/dtd/spring-beans.dtd＜/abs＞
＜rel＞spring-beans.dtd＜/rel＞
＜/file＞</pre>
<br />
　　要增加其它的DTD文件方法类似，不断地增加说明与DTD文件即可。<br />
<br />
　　于是在编辑XML文件时就会有相关的提示及错误提示信息，可以减少一些书写XML文件时发生的低级错误了。<br />
<br />
<img height="321" alt="图28" src="http://dev.yesky.com/imagelist/06/32/0n442hdx79h2.jpg" width="553" twffan="done" /><br />
<br />
　　<strong>测试与运行</strong><br />
<br />
　　先建立一个Log4J的配置文件log4j.properties，内容如下<br />
<pre class="code"># Set root logger level to ERROR and its only appender to R.
log4j.rootLogger = INFO,R
# R is set to be a DailyRollingFileAppender.
log4j.appender.R = org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File = Application.log
log4j.appender.R.DatePattern = yyyy-MM-dd'.log'
log4j.appender.R.layout = org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
</pre>
<br />
　　再创建一个ServiceFactory.java静态类，用来做单元测试方便一些<br />
<pre class="code">import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.access.BeanFactoryLocator;
import org.springframework.beans.factory.access.BeanFactoryReference;
import org.springframework.beans.factory.access.SingletonBeanFactoryLocator;
public final class ServiceFactory
{
private static BeanFactoryLocator bfLocator = null;
private static BeanFactoryReference bfReference = null;
private static BeanFactory factory = null;
static
{
&nbsp;&nbsp;&nbsp; bfLocator = SingletonBeanFactoryLocator.getInstance();
&nbsp;&nbsp;&nbsp; bfReference = bfLocator.useBeanFactory("beanFactory");
&nbsp;&nbsp;&nbsp; factory = bfReference.getFactory();
}
&nbsp;&nbsp;&nbsp;
private ServiceFactory()
{
&nbsp;&nbsp;&nbsp; super();
}
public static Object getBeanByName(final String beanName)
{
&nbsp;&nbsp;&nbsp; return factory.getBean(beanName);
}
}
</pre>
　　做成静态的这样我们可以ServiceFactory .getBeanByName(&#8220;beanname&#8221;)就可以得到相应的bean了。<br />
<br />
　　测试类SpringIDETest.java代码如下：<br />
<pre class="code">import junit.framework.TestCase;
public class SpringIDETest extends TestCase
{
private IHelloWorld helloWorld = null;
private ISpringDemo springDemo = null;
private final static String hello1 = "Hello World HelloWorld1";
private final static String hello2 = "Hello World HelloWorld2";
private final static String helloset = "Spring IDE Setter";
private final static String hellocon = "Spring IDE Constructor";
public void testSpringBeans()
{
&nbsp;&nbsp;&nbsp; helloWorld = (IHelloWorld)ServiceFactory.getBeanByName("helloWorld1");
&nbsp;&nbsp;&nbsp; assertEquals(hello1,helloWorld.sayHelloWorld());
&nbsp;&nbsp;&nbsp; helloWorld = (IHelloWorld)ServiceFactory.getBeanByName("helloWorld2");
&nbsp;&nbsp;&nbsp; assertEquals(hello2,helloWorld.sayHelloWorld());
}
public void testIoCConstructor()
{
&nbsp;&nbsp;&nbsp; //Constructor
&nbsp;&nbsp;&nbsp; springDemo = (ISpringDemo)ServiceFactory.getBeanByName("springDemoConstructor");
&nbsp;&nbsp;&nbsp; assertEquals(hellocon,springDemo.getHello());
&nbsp;&nbsp;&nbsp; assertEquals(hello1,springDemo.getHelloWorld().sayHelloWorld());
}
public void testIoCSetter()
{
&nbsp;&nbsp;&nbsp; //Setter
&nbsp;&nbsp;&nbsp; springDemo = (ISpringDemo)ServiceFactory.getBeanByName("springDemoSetter");
&nbsp;&nbsp;&nbsp; assertEquals(helloset,springDemo.getHello());
&nbsp;&nbsp;&nbsp; assertEquals(hello2,springDemo.getHelloWorld().sayHelloWorld());
}
}
</pre>
<br />
　　Run As JUnit Test之，绿色打勾全部通过就收工走人了。。。J<br />
<br />
　　当然也可以打开Application.log文件查看输出一些什么信息。<br />
<br />
　　<strong>使用总结</strong> <br />
<br />
　　此插件的功能不错：）对于Spring这样优雅的框架来说，再加上这个助手，真的是很美很美了，美美地喝上一杯咖啡吧
<img src ="http://www.blogjava.net/charles/aggbug/253332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-04 23:40 <a href="http://www.blogjava.net/charles/archive/2009/02/04/253332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JDT的包选择Dialog</title><link>http://www.blogjava.net/charles/archive/2009/02/04/253328.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 04 Feb 2009 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/04/253328.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/253328.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/04/253328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/253328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/253328.html</trackback:ping><description><![CDATA[Button btnBrowsePackage = new Button(container, SWT.NONE);<br />
&nbsp;&nbsp;btnBrowsePackage.setText("...");<br />
&nbsp;&nbsp;btnBrowsePackage.addSelectionListener(new SelectionListenerAdapter(){<br />
&nbsp;&nbsp;&nbsp;public void widgetSelected(SelectionEvent e)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;super.widgetSelected(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;IJavaProject javaProject = JavaCore.create(getCurrentProject());<br />
&nbsp;&nbsp;&nbsp;&nbsp;SelectionDialog dialog = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dialog = JavaUI.createPackageDialog(getSite().getShell(), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javaProject,IJavaElementSearchConstants.CONSIDER_REQUIRED_PROJECTS);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} catch (JavaModelException e1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExceptionHandler.handleExceptionAndAbort(e1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (dialog.open() != Window.OK)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;IPackageFragment pck = (IPackageFragment) dialog.getResult()[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (pck != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtPackageName.setText(pck.getElementName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}
<div twffan="done">&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;});&nbsp;</div>
 <img src ="http://www.blogjava.net/charles/aggbug/253328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-04 23:04 <a href="http://www.blogjava.net/charles/archive/2009/02/04/253328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse JDT的一些资料</title><link>http://www.blogjava.net/charles/archive/2009/02/04/253324.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 04 Feb 2009 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/04/253324.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/253324.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/04/253324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/253324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/253324.html</trackback:ping><description><![CDATA[最近给项目组做了个代码自动生成的小插件，已经发布到了google code： <a title="http://code.google.com/p/ormapper/" href="http://code.google.com/p/ormapper/">http://code.google.com/p/ormapper/</a><br />
不管如何，对做一个插件有了一个完整的实践。基本上一些很重要很基础的UI都用过<br />
<br />
说实话，如果做插件，不能不看别人写的插件的源代码，那么JDT显然是首选<br />
<br />
我把ECLIPSE官方网上的一些资料整理出来，如果有不对的地方，希望大家指正。<br />
如果想使用JDT的话，需要引入以下的包：<br />
<br />
<div twffan="done"><span twffan="done"><span class="resultofText" twffan="done" name="resultofMatch">JDT</span> Core packages give you access to the Java model objects and headless Java IDE infrastructure.&nbsp; The <span class="resultofText" twffan="done" name="resultofMatch">JDT</span> Core packages include:</span></div>
<ul>
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core</span></a></strong> - defines the classes that describe the Java model.
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/compiler/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.compiler</span></a> </strong>- defines an API for the compiler infrastructure.
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.dom</span></a> </strong>- supports Abstract Syntax Trees (AST) that can be used for examining the structure of a compilation unit down to the statement level.
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/rewrite/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.dom.rewrite</span></a> </strong>- supports rewriting of Abstract Syntax Trees (AST) that can be used for manipulating the structure of a compilation unit down to the statement level.
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/eval/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.eval</span></a></strong> - supports the evaluation of code snippets in a scrapbook or inside the debugger.
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/formatter/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.formatter</span></a></strong> - supports the formatting of compilation units, types, statements, expressions, etc.
    <li><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/jdom/package-summary.html"><strong><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.jdom</span></strong></a> - supports a Java Document Object Model (DOM) that can be used for walking the structure of a Java compilation unit.
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/search/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.search</span></a></strong> - supports searching the workspace's Java model for Java elements that match a particular description.&nbsp;&nbsp;
    <li><strong><a href="http://help.eclipse.org/ganymede/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/util/package-summary.html"><span twffan="done">org.eclipse.<span class="resultofText" twffan="done" name="resultofMatch">jdt</span>.core.util</span></a> </strong>- provides utility classes for manipulating .class files and Java model elements. </li>
</ul>
<img src ="http://www.blogjava.net/charles/aggbug/253324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-04 22:20 <a href="http://www.blogjava.net/charles/archive/2009/02/04/253324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Eclipse Tips] 设置eclipse RCP的tab样式</title><link>http://www.blogjava.net/charles/archive/2009/02/04/253322.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 04 Feb 2009 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/04/253322.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/253322.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/04/253322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/253322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/253322.html</trackback:ping><description><![CDATA[<div twffan="done"><span style="font-family: 宋体" twffan="done">我使用的是Eclipse 3.4，在网上找了很多资料来解决这个问题，主要是两个方法：配置文件法和硬编码法。我经过仔细测试，反正是没有搞定通过配置文件来设置波浪线外形，也许是Eclipse版本的问题吧。</span></div>
<div twffan="done"><span style="font-family: 宋体" twffan="done"><br />
</span></div>
<div twffan="done"><span style="font-family: 宋体" twffan="done">方法</span><span twffan="done">1</span><span style="font-family: 宋体" twffan="done">：</span></div>
<div twffan="done"><span style="font-family: 宋体" twffan="done">我们可以通过配置文件的方式来更改产品的样式。（注：这种方法我经过测试是不可以的，但是网上大量的都是这种方法，姑且放到这里）</span></div>
<div twffan="done"><span style="font-family: 宋体" twffan="done">首先，在</span><span twffan="done">plugin.xml</span><span style="font-family: 宋体" twffan="done">中对</span><span twffan="done">org.eclipse.core.runtime.products</span><span style="font-family: 宋体" twffan="done">扩展点的属性进行更改，如下：</span></div>
<div style="background: rgb(238,238,238); text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" align="left" twffan="done"><span style="font-size: 10pt; color: teal; font-family: 宋体" twffan="done">&nbsp;1</span><span style="font-size: 10pt; font-family: 宋体" twffan="done"> <span style="color: black" twffan="done">&lt;extension<br />
</span><span style="color: teal" twffan="done">&nbsp;2</span><span style="color: black" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="product"<br />
</span><span style="color: teal" twffan="done">&nbsp;3</span><span style="color: black" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point="org.eclipse.core.runtime.products"&gt;<br />
</span><span style="color: teal" twffan="done">&nbsp;4</span><span style="color: black" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;product<br />
</span><span style="color: teal" twffan="done">&nbsp;5</span><span style="color: black" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1029"  alt="" />&lt;!--[endif]--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;application="cn.blogjava.youxia.rcp_start.application"<br />
</span><span style="color: teal" twffan="done">&nbsp;6</span><span style="color: black" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1030"  alt="" />&lt;!--[endif]--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name="</span></span><span style="font-size: 10pt; color: black; font-family: 宋体" twffan="done">第一个<span twffan="done">RCP</span>程序<span twffan="done">"&gt;<br />
</span></span><span style="font-size: 10pt; color: teal; font-family: 宋体" twffan="done">&nbsp;7</span><span style="font-size: 10pt; color: black; font-family: 宋体" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1031"  alt="" />&lt;!--[endif]--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property<br />
</span><span style="font-size: 10pt; color: teal; font-family: 宋体" twffan="done">&nbsp;8</span><span style="font-size: 10pt; color: black; font-family: 宋体" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1032"  alt="" />&lt;!--[endif]--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name="preferenceCustomization"<br />
</span><span style="font-size: 10pt; color: teal; font-family: 宋体" twffan="done">&nbsp;9</span><span style="font-size: 10pt; color: black; font-family: 宋体" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1033"  alt="" />&lt;!--[endif]--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value="plugin_customization.ini"/&gt;<br />
</span><span style="font-size: 10pt; color: teal; font-family: 宋体" twffan="done">10</span><span style="font-size: 10pt; color: black; font-family: 宋体" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1034"  alt="" />&lt;!--[endif]--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/product&gt;<br />
</span><span style="font-size: 10pt; color: teal; font-family: 宋体" twffan="done">11</span><span style="font-size: 10pt; color: black; font-family: 宋体" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1035"  alt="" />&lt;!--[endif]--&gt;&lt;/extension&gt;</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span style="font-family: 宋体" twffan="done">可见，我们为我们的产品添加了一个</span><span twffan="done">prefereneCustomization</span><span style="font-family: 宋体" twffan="done">属性，该属性的值为</span><span twffan="done">plugin_customization.ini</span><span style="font-family: 宋体" twffan="done">文件，在该文件中，我们可以配置我们的样式。在这里，它的内容如下：</span></div>
<div style="background: rgb(238,238,238); text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" align="left" twffan="done"><span style="font-size: 10pt; color: teal; font-family: 宋体" twffan="done">1</span><span style="font-size: 10pt; font-family: 宋体" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1036"  alt="" />&lt;!--[endif]--&gt;<span style="color: black" twffan="done">org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false<br />
</span><span style="color: teal" twffan="done">2</span><span style="color: black" twffan="done"> &lt;!--[if !vml]--&gt;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' height="16" src="file:///C:/DOCUME~1/IBM/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" twffan="done" v:shapes="_x0000_i1037"  alt="" />&lt;!--[endif]--&gt;org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight</span></span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span style="font-family: 宋体" twffan="done">事实上，在这个文件中可以定义的参数有上百个，可以查看</span><span twffan="done">Eclipse</span><span style="font-family: 宋体" twffan="done">的文档。</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span style="font-family: 宋体" twffan="done">方法</span><span twffan="done">2</span><span style="font-family: 宋体" twffan="done">：</span></div>
<div twffan="done"><span style="font-family: 宋体" twffan="done">采用硬编码实现，重载</span><span twffan="done">ApplicationWorkbenchAdvisor</span><span style="font-family: 宋体" twffan="done">类的</span><span twffan="done">initialize()</span><span style="font-family: 宋体" twffan="done">接口，代码如下：</span></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="568">
            <div style="text-align: left" align="left" twffan="done"><span style="font-size: 10pt; color: rgb(100,100,100); font-family: 'Courier New'" twffan="done">@Override</span></div>
            <div style="text-align: left" align="left" twffan="done"><strong><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'" twffan="done">public</span></strong><strong><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'" twffan="done">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done"> initialize(IWorkbenchConfigurer configurer) {</span></div>
            <div style="text-align: left" align="left" twffan="done"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'" twffan="done">super</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done">.initialize(configurer);</span></div>
            <div style="text-align: left" align="left" twffan="done">&nbsp;</div>
            <div style="text-align: left" align="left" twffan="done"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: rgb(63,127,95); font-family: 'Courier New'" twffan="done">//</span><span style="font-size: 10pt; color: rgb(63,127,95); font-family: 宋体" twffan="done">设置标签页弧线型外观</span></div>
            <div style="text-align: left" align="left" twffan="done"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>PlatformUI.<em>getPreferenceStore</em>().setValue(IWorkbenchPreferenceConstants.</span><em><span style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'" twffan="done">SHOW_TRADITIONAL_STYLE_TABS</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done">, </span><strong><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'" twffan="done">false</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done">);</span></div>
            <div style="text-align: left" align="left" twffan="done"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" twffan="done">}</span></div>
            </td>
        </tr>
    </tbody>
</table>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">IWorkbenchPreferenceConstants</span><span style="font-family: 宋体" twffan="done">常见属性</span></div>
<div align="center" twffan="done">
<table style="border-collapse: collapse" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0cm; border-top: windowtext 1pt solid; padding-left: 0cm; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 167.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="223">
            <div style="text-align: center" align="center" twffan="done"><span style="font-family: 宋体" twffan="done">属</span>&nbsp;<span style="font-family: 宋体" twffan="done">性</span>&nbsp;<span style="font-family: 宋体" twffan="done">名</span></div>
            </td>
            <td style="border-right: 1pt solid; padding-right: 0cm; border-top: 1pt solid; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; width: 248.7pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="332">
            <div style="text-align: center" align="center" twffan="done"><span style="font-family: 宋体" twffan="done">属</span> <span style="font-family: 宋体" twffan="done">性</span> <span style="font-family: 宋体" twffan="done">说</span> <span style="font-family: 宋体" twffan="done">明</span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: 1pt solid; width: 167.1pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="223">
            <div twffan="done"><span twffan="done">EDITOR_MINIMUM_CHARACTERS</span></div>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 248.7pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="332">
            <div twffan="done"><span style="font-family: 宋体" twffan="done">但很多编辑器重叠时，设置编辑器标题文字的最短长度。默认为</span><span twffan="done">8</span><span style="font-family: 宋体" twffan="done">个字符</span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: 1pt solid; width: 167.1pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="223">
            <div twffan="done"><span twffan="done">SHOW_PROGRESS_ON_STARTUP</span></div>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 248.7pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="332">
            <div twffan="done"><span style="font-family: 宋体" twffan="done">设置启动时是否显示进度条。默认值</span><span twffan="done">false</span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: 1pt solid; width: 167.1pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="223">
            <div twffan="done"><span twffan="done">DOCK_PERSPECTIVE_BAR</span></div>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 248.7pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="332">
            <div twffan="done"><span style="font-family: 宋体" twffan="done">设置透视图标题栏停泊位置。默认值为</span><span twffan="done">TOP_RIGHT</span><span style="font-family: 宋体" twffan="done">，还可以设置为</span><span twffan="done">TOP_LEFT</span><span style="font-family: 宋体" twffan="done">、</span><span twffan="done">LEFT</span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: 1pt solid; width: 167.1pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="223">
            <div twffan="done"><span twffan="done">SHOW_TEXT_ON_PERSPECTIVE_BAR</span></div>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 248.7pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="332">
            <div twffan="done"><span style="font-family: 宋体" twffan="done">设置透视图是否显示标题文本。默认值为</span><span twffan="done">true</span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: 1pt solid; width: 167.1pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="223">
            <div twffan="done"><span twffan="done">SHOW_INTRO</span></div>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 248.7pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="332">
            <div twffan="done"><span style="font-family: 宋体" twffan="done">启动时是否显示欢迎画面。默认值为</span><span twffan="done">true</span></div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/charles/aggbug/253322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-04 22:13 <a href="http://www.blogjava.net/charles/archive/2009/02/04/253322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中常用的menubarPath</title><link>http://www.blogjava.net/charles/archive/2009/01/18/251807.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Sun, 18 Jan 2009 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/01/18/251807.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/251807.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/01/18/251807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/251807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/251807.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 文件：file 　　o "开始" 区：fileStart　　o "新建"菜单内部的"附加"组标志： new/additions　　o "新建"区，在"新建"菜单下面：new.ext　　o "关闭" 区：close.ext　　o "保存" 区：save.ext　　o "打印" 区：print.ext　　o "打开" 区：open.ext　　o "导入" 区：import.ext　　o ...&nbsp;&nbsp;<a href='http://www.blogjava.net/charles/archive/2009/01/18/251807.html'>阅读全文</a><img src ="http://www.blogjava.net/charles/aggbug/251807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-01-18 22:44 <a href="http://www.blogjava.net/charles/archive/2009/01/18/251807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>