﻿<?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-nighty-随笔分类-SWT/JFace</title><link>http://www.blogjava.net/nighty/category/27041.html</link><description>折腾的年华</description><language>zh-cn</language><lastBuildDate>Sun, 13 Mar 2011 13:06:19 GMT</lastBuildDate><pubDate>Sun, 13 Mar 2011 13:06:19 GMT</pubDate><ttl>60</ttl><item><title>为SWT文本控件添加弹出式内容辅助</title><link>http://www.blogjava.net/nighty/archive/2007/11/02/157797.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Fri, 02 Nov 2007 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2007/11/02/157797.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/157797.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2007/11/02/157797.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/157797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/157797.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 通常情况下，用户应该在简单字段（例如文本字段或组合框）中提供文本信息。虽然用来填充这些字段的应用程序代码通常比用来填充复杂窗口小部件（例如表或树）的代码简单得多，但这些&#8220;简单&#8221;字段通常会给用户带来更多负担。用户必须确定哪些字段需要内容、某个字段是否包含有效内容以及应该选择哪些选项。JFace 的<strong>字段辅助</strong>支持提供了一些类来帮助指导用户完成输入任务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/package-summary.html">org.eclipse.jface.fieldassist</strong></a>包提供了二种方式的辅助。<strong>带修饰字段</strong>支持允许您提供图像修饰，以便向用户提供有关特定字段状态的提示。<strong>内容建议</strong>支持允许您提供内容辅助弹出窗口，以便向用户提供内容选项。<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面了解一下关于内容建议部分。<br />
&nbsp;&nbsp;&nbsp;&nbsp;一般的IDE工具都有内容建议的功能，比如很常见的Java编辑器，输入&#8220;.&#8221;之后就会激活一个窗口，从里面可以选择方法或字段，这个功能可以快速高效地完成代码，而且可以减少很多输入错误。jface的fieldassist提供了对这个功能的支持。<br />
&nbsp;&nbsp;&nbsp; 我们做一个demo，先看一下这个demo的效果。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height="216" alt="" src="http://www.blogjava.net/images/blogjava_net/nighty/ad.jpg" width="426" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当按下Alt + '/'的时候，弹出内容辅助的窗口。从中可以选择相应的建议，进行快速输入。<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面是相应的代码，非常简单。<br />
&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">sShell&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Shell();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sShell.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Shell</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sShell.setLayout(gridLayout);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sShell.setSize(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Point(</span><span style="color: #000000">300</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">200</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Text&nbsp;t&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(sShell,&nbsp;SWT.BORDER&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;SWT.MULTI);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.setLayoutData(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridData(GridData.FILL_BOTH));<br />
<img id="Codehighlighter1_327_338_Open_Image" onclick="this.style.display='none'; Codehighlighter1_327_338_Open_Text.style.display='none'; Codehighlighter1_327_338_Closed_Image.style.display='inline'; Codehighlighter1_327_338_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_327_338_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_327_338_Closed_Text.style.display='none'; Codehighlighter1_327_338_Open_Image.style.display='inline'; Codehighlighter1_327_338_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoActivationCharacters&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;</span><span id="Codehighlighter1_327_338_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_327_338_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">#</span><span style="color: #000000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">(</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">;<br />
<img id="Codehighlighter1_347_398_Open_Image" onclick="this.style.display='none'; Codehighlighter1_347_398_Open_Text.style.display='none'; Codehighlighter1_347_398_Closed_Image.style.display='inline'; Codehighlighter1_347_398_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_347_398_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_347_398_Closed_Text.style.display='none'; Codehighlighter1_347_398_Open_Image.style.display='inline'; Codehighlighter1_347_398_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_347_398_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_347_398_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyStroke&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;KeyStroke.getInstance(</span><span style="color: #000000">"</span><span style="color: #000000">Alt+/</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_426_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_426_455_Open_Text.style.display='none'; Codehighlighter1_426_455_Closed_Image.style.display='inline'; Codehighlighter1_426_455_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_426_455_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_426_455_Closed_Text.style.display='none'; Codehighlighter1_426_455_Open_Image.style.display='inline'; Codehighlighter1_426_455_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(ParseException&nbsp;e1)&nbsp;</span><span id="Codehighlighter1_426_455_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_426_455_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1.printStackTrace();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentProposalAdapter&nbsp;adapter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ContentProposalAdapter(t,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TextContentAdapter(),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleContentProposalProvider(<br />
<img id="Codehighlighter1_606_628_Open_Image" onclick="this.style.display='none'; Codehighlighter1_606_628_Open_Text.style.display='none'; Codehighlighter1_606_628_Closed_Image.style.display='inline'; Codehighlighter1_606_628_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_606_628_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_606_628_Closed_Text.style.display='none'; Codehighlighter1_606_628_Open_Image.style.display='inline'; Codehighlighter1_606_628_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[]&nbsp;</span><span id="Codehighlighter1_606_628_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_606_628_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">建议1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">建议2</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">建议3</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">),&nbsp;keyStroke,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoActivationCharacters);</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;按照帮助文档的描述如下：为了在用户从弹出窗口中选择建议时获取和设置控件内容，必须向适配器提供 <strong><a href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/IControlContentAdapter.html">IControlContentAdapter</a></strong> 实例，该实例可以检索和设置特定类型控件的内容。对于文本字段来说，可以使用 <strong><a href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/TextContentAdapter.html">TextContentAdapter</a></strong> 类。但是，也可以灵活地实现 <strong><a href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/IControlContentAdapter.html">IControlContentAdapter</a></strong>，以便将内容建议适配器与任何其他类型的控件配合使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;关键是定义<strong>ContentProposalAdapter类，</strong>它有几个必须的参数，第一个是需要进行内容辅助的控件，第二个是<strong><a href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/IControlContentAdapter.html">IControlContentAdapter</a></strong> 实例，jface默认提供了二个实现：<a title="class in org.eclipse.jface.fieldassist" href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/ComboContentAdapter.html">ComboContentAdapter</a>, <a title="class in org.eclipse.jface.fieldassist" href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/TextContentAdapter.html">TextContentAdapter</a>。按照上面的建议，如果你需要更加高级的功能，那么得实现<a href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/IControlContentAdapter.html"><strong>IControlContentAdapter</strong></a><strong>。</strong>第四个是<strong>IContentProposalProvider</strong>的实例，这是提供内容辅助窗口中的内容提供器的接口，jface只实现了一个<strong>SimpleContentProposalProvider</strong>，这是最简单的只提供文本内容的内容提供器。同样的，你可以继承<strong>IContentProposalProvider</strong>来实现更高级的功能。<br />
&nbsp;&nbsp;&nbsp;&nbsp;keyStroke是定义按下什么键时激活该提示。autoActivationCharacters是定义当输入遇到什么符号时会激活提示的字符数组。<br />
&nbsp;&nbsp;&nbsp;按照帮助文档的说明，可以在任意控件上安装 <strong><a href="http://127.0.0.1:62318/help/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/fieldassist/ContentProposalAdapter.html">ContentProposalAdapter</a></strong> 以提供此行为。需要什么样的高级功能，就必须具体实践一下以上几个接口的实现。一般的编辑器都会配合SoucreViewer来提供这些功能。</p>
  <img src ="http://www.blogjava.net/nighty/aggbug/157797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2007-11-02 17:28 <a href="http://www.blogjava.net/nighty/archive/2007/11/02/157797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>