﻿<?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-The Goal-随笔分类-SWT &amp; JFace IN ACTION</title><link>http://www.blogjava.net/joeyjong/category/8174.html</link><description>Joey的读书笔记</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:11:13 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:11:13 GMT</pubDate><ttl>60</ttl><item><title>7.1 graphic context</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/14/41042.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Fri, 14 Apr 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/14/41042.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/41042.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/14/41042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/41042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/41042.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">graphic context就象Control最顶层的画板，它可以使你向GUI components加入客制化的图形，图片，及不同字体的文本。同样也提供事件处理</font>
		<br />
		<br />
		<font face="Verdana" size="2">graphic context是在GC类中的，GC对象是附着于现存的Controls。<br /><br />要创建一个graphically oriented的应用程序，首先要创建graphic context，并将其与一个component相关联，这两步都可通过GC的constructor来实现。共有2个构造函数，见下：<br />1. GC(Drawable)--Creates a GC and configures it for the Drawable object<br />2. GC(Drawable, int)--Creates and configures a GC and sets the text-display style，第二个参数可以是RIGHT_TO_LEFT或LEFT_TO_RIGHT（默认值）;<br />第一个参数需要实现Drawable接口的对象， 此接口包含了与graphic context.内部相联系的方法。SWT提供了三个实现Drawable接口的类：Image, Device, 和 Control. <br /><img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_classes%20that%20implement%20the%20Drawable%20interface.jpg" /><br /><br />Control子类虽然都能包含图形，但只有一个类是特别适合GC对象的：Canvas。它不仅提供了一个Composite的containment property，还可以用一系列的风格来定义图形在此区域内如何显示<br /><br /><strong><u>示例：</u></strong><br /><br />package com.swtjface.Ch7;<br />import org.eclipse.swt.SWT;<br />import org.eclipse.swt.graphics.*;<br />import org.eclipse.swt.widgets.*;<br />public class DrawExample<br />{<br />public static void main (String [] args)<br />{<br />Display display = new Display();<br />Shell shell = new Shell(display);<br />shell.setText("Drawing Example");<br /><font color="#ff1493">Canvas canvas = new Canvas(shell, SWT.NONE);<br />canvas.setSize(150, 150);<br />canvas.setLocation(20, 20);//在shell中创建canvas<br /></font>shell.open ();<br />shell.setSize(200,220);<br /><font color="#006400"><font color="#008000">GC gc = new GC(canvas);//在canvas中创建</font><font color="#008000">graphic context</font><br /></font>gc.drawRectangle(10, 10, 40, 45);<br />gc.drawOval(65, 10, 30, 35);<br />gc.drawLine(130, 10, 90, 80);<br />gc.drawPolygon(new int[] {20, 70, 45, 90, 70, 70});<br />gc.drawPolyline(new int[] {10,120,70,100,100,130,130,75});<br /><font color="#ffa500">gc.dispose();//释放Color对象<br /></font>while (!shell.isDisposed())<br />{<br /> if (!display.readAndDispatch())<br /> display.sleep();<br /> }<br /> display.dispose();<br /> }<br /> }<br />有两点需要注意：1.在调用shell.open()之前构建Canvas对象，然后在调用shell.open()之后创建和使用GC对象<br />                     2.在使用完之后一定要立即释放GC object<br />如上例所示GC提供了一系列在Drawable对象上画图形的方法，如下：<br /><img height="567" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Drawing%20methods%20of%20the%20GC%20class.jpg" width="516" /><br /><br />但是上例中有个问题：当shell被变灰过或者最小化过之后，图形就会被擦去。所以我们需要解决的事，无论window怎么变化，图形都保持可见。因此SWT<span lang="zh-CN">在一个</span>Drawable<span lang="zh-CN">对象被刷新后让你自行控制。这个更新的过程就被称为</span>painting<span lang="zh-CN">。</span></font>
		<br />
		<br />
		<font face="Verdana" size="2">
				<strong>
						<u>Painting and PaintEvents<br /></u>
				</strong>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">当一个GC方法在一个Drawabel对象上画出一个图案，它仅执行这个painting过程一次。如果用户改变对象尺寸或是用另一个窗口去覆盖它，则图形会被消除。因此，应用程序能否在外界事件影响下维持其外观这一点相当重要。<br /><br />这些外部事件被称为PaintEvents，接收它们的程序接口是PaintListener。一个Control在任何时候当其外观被应用程序或是外界活动改变都会触发一个PaintEvent。这些类对于事件和监听器的使用方式都和我们在第四章内提到的类似。由于PaintListener只有一个事件处理方法，所以不需要使用adapter类<br /><br />Canvas canvas = new Canvas(shell, SWT.NONE);<br />canvas.setSize(150, 150);<br />canvas.setLocation(20, 20);<br />canvas.addPaintListener(new PaintListener()<br />{<br />public void paintControl(PaintEvent pe)<br />{<br />GC gc = <font color="#ff1493">pe.gc;//<font color="#ff1493">每一个PaintEvent对象都包含有其自己的GC</font><br /></font>gc.drawPolyline(new int[] {10,120,70,100,100,130,130,75});<br />}<br />});<br />shell.open();<br /><br /><font color="#000000">每一个PaintEvent对象都包含有其自己的GC，主要有2个原因：1.因为这个GC instance是由事件产生的，所以PaintEvent会负责释放他。2.应用程序可以在shell open之前创建GC,这样可以使图形在一个独立的类中被创建。</font></font>
						<br />
						<br />SWT<span lang="zh-CN">在</span>PaintListener<span lang="zh-CN">接口内优化</span>painting<span lang="zh-CN">过程,SWT<span lang="zh-CN">的开发者强烈建议</span>Control<span lang="zh-CN">的</span>painting<span lang="zh-CN">仅对</span>PaintEvent<span lang="zh-CN">作出反应。如果一个应用程序因为其他原因必须更新其图形，则他们推荐使用</span>control<span lang="zh-CN">的</span>redraw()<span lang="zh-CN">方法，这会在队列中加入一个</span>paint<span lang="zh-CN">请求。之后，你可以调用</span>update()<span lang="zh-CN">方法来处理所有的绑定于该对象的</span>paint<span lang="zh-CN">请求。<br /><br />需要牢记的是，虽然对于Control对象推荐在一个PaintListener内painting，但是由于Device和Image对象并不能在该接口内使用。如果你需要在一个image或device内生成图形，你必须单独地生成一个GC对象并在使用结束后将其销毁。</span></span></p>
		</font>
<img src ="http://www.blogjava.net/joeyjong/aggbug/41042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-14 11:26 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/14/41042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6.5 Custom layouts</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/12/40691.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Wed, 12 Apr 2006 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/12/40691.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40691.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/12/40691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40691.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">要客制化layout，需要继承抽象类Layout，需要写2个方法——computeSize() 和layout().</font>
				<br />
				<br />
				<font face="Verdana" size="2">
						<strong>
								<u>computeSize()<br /><br /></u>
						</strong>protected Point computeSize(Composite composite,<br />int wHint, int hHint,<br />boolean flushCache)<br />{<br />Point maxDimensions =<br />calculateMaxDimensions(composite.getChildren());<br />int stepsPerHemisphere =<br />stepsPerHemisphere(composite.getChildren().length);<br />int maxWidth = maxDimensions.x;<br />int maxHeight = maxDimensions.y;<br />int dimensionMultiplier = (stepsPerHemisphere + 1);<br />int controlWidth = maxWidth * dimensionMultiplier;<br />int controlHeight = maxHeight * dimensionMultiplier;<br />int diameter = Math.max(controlWidth, controlHeight);<br />Point preferredSize = new Point(diameter,<br />diameter);<br />... // code to handle case when our calculations<br />// are too large<br />return preferredSize;<br />}<br /><br />参数：<br />1.composite--The object we’re going to populate. At the time this method is called, it has children, but neither the composite nor the children have been sized or positioned on the screen.<br /><br />2.wHint and hHint--layout所需的最大长宽。若带有参数SWT.DEFAULT,表示此layout可以随意使用use whatever sizes it decides it needs.<br /><br />3.flushCache--作为flag，to tell the layout whether it’s safe to use any cached values that it may be maintaining.<br /><br />computeSize()的目的主要在于计算我们要layout的composite有多大<br /><strong><u>layout()<br /></u></strong>……<br /></font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-12 17:19 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/12/40691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6.4 The form layout</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/12/40607.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Wed, 12 Apr 2006 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/12/40607.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40607.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/12/40607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40607.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">与之前所述的layout不同，form layout不是基于行和列的，它是基于与其他control之间的相对位置的。<br /><br />FormLayout十分简单，你只要：1.设定页边距（高，宽）属性。 2.设定spacing属性，即所有control间的距离(in pixels)<br /><br />同样可以使用FormData来配置单个的control。<br /><br /></font>
				<font face="Verdana">
						<font size="2">
								<strong>
										<u>FormData<br /></u>
								</strong>如果一个control没有一个FormData实例来描述它的话，就会默认放在composite的右上角<br />width和height属性指定了control的尺寸，in pixels.<br />top, bottom, right, 和left属性，每一个都有一个FormAttachment实例，这些attachments描述了control与其他control之间的关系。<br /><br /></font>
				</font>
				<font face="Verdana">
						<font size="2">
								<strong>
										<u>FormAttachment<br /></u>
								</strong>有2个使用途径：<br />1.通过使用percentage of the parent composite.<br /><img style="WIDTH: 479px; HEIGHT: 177px" height="183" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Percentage-based%20FormAttachment%20constructors.jpg" width="521" /><br /><br />2.通过设定一个control和另一个control之间的相对位置 <br />《图》<br /><br />package com.swtjface.Ch6;<br />import org.eclipse.swt.*;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.layout.*;<br />public class Ch6FormLayoutComposite extends Composite {<br />public Ch6FormLayoutComposite(Composite parent) {<br />super(parent, SWT.NONE);<br />FormLayout layout = new FormLayout();<br />setLayout(layout);<br />Text t = new Text(this, SWT.MULTI);<br />FormData data = new FormData();<br /><font color="#ff1493">data.top = new FormAttachment(0, 0);<br />data.left = new FormAttachment(0, 0);<br />data.right = new FormAttachment(100);<br />data.bottom = new FormAttachment(75);//确定text的位置，因为左上角是坐标原点，所以right的百分数为100。<br /></font>t.setLayoutData(data);<br />Button ok = new Button(this, SWT.NONE);<br />ok.setText("Ok");<br />Button cancel = new Button(this, SWT.NONE);<br />cancel.setText("Cancel");<br />data = new FormData();<br /><font color="#008000">data.top = new FormAttachment(t);<br />data.right = new FormAttachment(cancel);//ok按钮在text下面，cancel左边<br /></font>ok.setLayoutData(data);<br />data = new FormData();<br /><font color="#ffa500">data.top = new FormAttachment(t);<br />data.right = new FormAttachment(100);//cancel按钮在text下面，在最右边<br /></font>cancel.setLayoutData(data);<br />}<br />}</font>
				</font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-12 12:22 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/12/40607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6.3 The grid layout</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/11/40484.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Tue, 11 Apr 2006 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/11/40484.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40484.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/11/40484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40484.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">最常用的一种layout.以row layout为基础。<br /><br />package com.swtjface.Ch6;<br />import org.eclipse.swt.*;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.layout.*;<br />public class Ch6GridLayoutComposite extends Composite {<br />public Ch6GridLayoutComposite(Composite parent) {<br />super(parent, SWT.NONE);<br /><font color="#ff1493">GridLayout layout = new GridLayout(4,false);//每一行有4个control，后一个参数是a<br />boolean to indicate whether the columns should take up an even amount of<br />space. By passing false, you tell the layout to only use the minimum amount of<br />space needed for each column.</font><br />setLayout(layout);<br />for (int i = 0; i &lt; 16; ++i) {<br />Button button = new Button(this, SWT.NONE);<br />button.setText("Cell " + i);<br />}<br />}<br />}<br /><br /><strong><u>Using GridData styles<br /></u></strong>十分类似于RowData对象。可通过其构造函数来设定STYLE，这些STYLE可分为3类：FILL, HORIZONTAL_ALIGN, and VERTICAL_ALIGN.<br />1.FILL:此cell是否fill所有的availabe的空间。可用的值还包括FILL_HORIZONTAL（水平扩张）,FILL_VERTICAL（垂直扩张）,FILL_BOTH。<br />2.ALIGN，用来指定control在cell中的什么位置。值包括BEGINNING, END, CENTER和FILL。<br />具体参见下表<br /><img height="358" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Style%20combinations%20for%20GridData.jpg" width="538" /></font>
				<font face="Verdana" size="2">
						<br />
						<strong>
								<u>Using GridData size attributes<br /></u>
						</strong>与RowData不同，GridData还有很多的public属性。其中有些是布尔值类型的，一般会根据所设置的不同styles而自动管理，所以无需对其直接操作。还有一些是integer值，用来确定单个cells的大小。具体件下表：<br /><img height="221" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_GridData%20size%20attributes.jpg" width="532" /></font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-11 16:16 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/11/40484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6.2 The row layout</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/11/40479.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Tue, 11 Apr 2006 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/11/40479.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40479.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/11/40479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40479.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">可以多行/列显示。<br /><br />package com.swtjface.Ch6;<br />import org.eclipse.swt.*;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.layout.*;<br />public class Ch6RowLayoutComposite extends Composite {<br />public Ch6RowLayoutComposite(Composite parent) {<br />super(parent, SWT.NONE);<br />RowLayout layout = new RowLayout(SWT.HORIZONTAL);<br />setLayout(layout);<br />for (int i = 0; i &lt; 16; ++i) {<br />Button button = new Button(this, SWT.NONE);<br />button.setText("Sample Text");<br />}<br />}<br />}<br /><br />wrap——默认为true,若设为false,所有的controls都在同一行。<br />pack——默认为true.使所有的child controls都大小一样。<br />justify——默认为false. 若为true,每一行的control都会以间隔相同的方式排列。<br /><br /><strong><u>RowData</u></strong><br />可以通过setLayoutData()来设定每个control的大小，如：button.setLayoutData(new RowData(200 + 5 * i, 20 + i));<br /></font>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-11 15:58 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/11/40479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6.1 The fill layout</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/11/40472.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Tue, 11 Apr 2006 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/11/40472.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40472.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/11/40472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40472.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">默认为从左到右排放的，根据每个control实际所需的大小来分配空间，此composite中多于出来的空间，再平摊到每个control上。随着composite的大小调整，control的大小也会跟着调整。<br /><br />package com.swtjface.Ch6;<br />import org.eclipse.swt.*;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.layout.*;<br />public class Ch6FillLayoutComposite extends Composite {<br />public Ch6FillLayoutComposite(Composite parent) {<br />super(parent, SWT.NONE);<br /><font color="#0000ff">FillLayout layout = new FillLayout( SWT.VERTICAL); //默认是SWT.HORIZONTAL</font><br /><font color="#ff1493">setLayout(layout);//为此Composite设定一个layout.如果漏了此语句，会显示不出child control。<br /></font>for (int i = 0; i &lt; 8; ++i) {<br />Button button = new Button(this, SWT.NONE);<br />button.setText("Sample Text");<br />}<br />}<br />}</font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-11 15:23 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/11/40472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.8 ProgressIndicator</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/10/40291.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Mon, 10 Apr 2006 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/10/40291.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40291.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/10/40291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40291.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">同ProgressIndicator一样，它支持工作的虚拟单位，you need only initialize the ProgressIndicator with the total amount of work you expect to do and notify it as work is completed:<br /><br />ProgressIndicator indicator = new ProgressIndicator(parent);<br />...<br />indicator.beginTask(10);<br />...<br />Display.getCurrent()display.asyncExec(new Runnable() {<br />public void run() {<br />//Inform the indicator that some amount of work has been done<br />indicator.worked(1);<br />}<br />});<br /><br />正如上例所示，使用ProgressIndicator需要2步：<br />1.让indicator知道总共有多少工作，通过使用beginTask().只有这个方法被调用了之后，这个control才会在屏幕上显示。<br />2.每当有一部分工作被完成了，就调用worked()。为了防止非ui的线程来update widgets，所以使用asyncExec()来解决这个问题。<br /><br />ProgressIndicator也提供animated模式，即总工作量不知道的情况。在这种模式下，the bar continually fills and empties<br />until done() is called. 要使用这个模式，就要用beginAnimatedTask()代替beginTask();并且不需要worked()方法了</font>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-10 18:07 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/10/40291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.7 ProgressBar</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/10/40287.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Mon, 10 Apr 2006 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/10/40287.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40287.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/10/40287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40287.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">ProgressBar，进度条，是ProgressIndicator的简化版本。大多数情况下推荐使用ProgressIndicator。如果你决定直接使用ProgressBar，需要手动改变此bar的外观。如下<br /><br />//Style can be SMOOTH, HORIZONTAL, or VERTICAL<br />ProgressBar bar = new ProgressBar(parent, SWT.SMOOTH);<br />bar.setBounds(10, 10, 200, 32);<br />bar.setMaximum(100);<br />...<br />for(int i = 0; i &lt; 10; i++) {<br />//Take care to only update the display from its<br />//own thread<br />Display.getCurrent().asyncExec(new Runnable() {<br />public void run() {<br />//Update how much of the bar should be filled in<br />bar.setSelection((int)(bar.getMaximum() * (i+1) / 10));<br />}<br />});<br />}<br /><br />setSelection()causes the widget to be updated every time.This behavior is unlike that of ProgressIndicator or ProgressMonitorDialog,which will update the display only if it has changed by an amount that will be visible to the end user.</font>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-10 17:56 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/10/40287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.6 Slider</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/10/40286.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Mon, 10 Apr 2006 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/10/40286.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40286.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/10/40286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40286.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">类似于scrollbars。scrollbars仅限于用在可滑动的item上，如text。<br /><br />可通过setMinimum()和setMaximum()来设定它的范围。可通过setThumb()来设定滑块的值。在有些OS上，thumb的大小是常数。每按一下箭头，所移动的值称为increment.可通过setIncrement()来设定，按滑块和箭头间的空间所滑动的值为page increment，可通过PageIncrement()来设定。以上这些数据可以通过void setValues( int selection, int minimum, int maximum, int thumb, int increment, int pageIncrement)来一次性设定，其中selection是thumb的出发点。<br /><br />Slider有个属性用来设定其是水平还是垂直的，默认为水平。<br /><br />package com.swtjface.Ch5;<br />import org.eclipse.swt.SWT;<br />import org.eclipse.swt.layout.FillLayout;<br />import org.eclipse.swt.widgets.Composite;<br />import org.eclipse.swt.widgets.Slider;<br />public class Ch5Slider extends Composite {<br />public Ch5Slider(Composite parent) {<br />super(parent, SWT.NONE);<br />setLayout(new FillLayout());<br />Slider slider = new Slider(this, SWT.HORIZONTAL);<br />slider.setValues(1000, 400, 1600, 200, 10, 100);<br />}<br />}<br /></font>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-10 17:45 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/10/40286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.5 CoolBar</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/10/40279.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Mon, 10 Apr 2006 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/10/40279.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/40279.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/10/40279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/40279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/40279.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">类似于ToolBar的升级。他们的区别在于CoolBar上的item可以被重新配置，重新定大小。CoolBar的一般用途就是包含toolbars或按钮。<br /><br />String[] coolItemTypes = {"File", "Formatting", "Search"};<br />CoolBar coolBar = new CoolBar(parent, SWT.NONE);<br />for(int i = 0; i &lt; coolItemTypes.length; i++)<br />{<br />CoolItem item = new CoolItem(coolBar, SWT.NONE);<br />ToolBar tb = new ToolBar(coolBar, SWT.FLAT);<br />for(int j = 0; j &lt; 3; j++)<br />{<br />ToolItem ti = new ToolItem(tb, SWT.NONE);<br />ti.setText(coolItemTypes[i] + " Item #" + j);<br />}<br />}</font>
<img src ="http://www.blogjava.net/joeyjong/aggbug/40279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-10 17:28 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/10/40279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.4 ToolBarManager</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/07/39866.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Fri, 07 Apr 2006 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/07/39866.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/39866.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/07/39866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/39866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/39866.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">是JFace的类，继承自ContributionManager，凡是继承了IAction或IContribution接口的对象都可被加至ToolBarManager.你只要花时间为ToolBarManager添加Action，Toolbar和ToolItem实例会自动产生。<br /><br />你可通过调用ApplicationWindow的createToolBarManager()来为你的应用程序添加一个toolbar。与MenuManager不同的是，createToolBarManager()需要一个style参数，这个参数用来设定ToolBar所用的按钮的风格：flat或normal。</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>ControlContribution</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">除了MenuManager所用的ContributionItems之外，还有一个新的ContributionItem，只能被ToolBarManager使用——ControlContribution。这个类可将任何能被用于toolbar的Control打包进去。<br /><br />要使用ControlContribution类，必须要实现抽象方法createControl().<br /><br />toolBarManager.add(new ControlContribution("Custom") {<br />protected Control createControl(Composite parent) {<br />SashForm sf = new SashForm(parent, SWT.NONE);<br />Button b1 = new Button(sf, SWT.PUSH);<br />b1.setText("Hello");<br />Button b2 = new Button(sf, SWT.PUSH);<br />b2.setText("World");<br />b2.addSelectionListener(new SelectionAdapter() {<br />public void widgetSelected(SelectionEvent e) {<br />System.out.println("Selected:" + e);<br />}<br />});<br />return sf;<br />}<br />});<br /><br />如果你希望有任何的事件发生，必须在你的controls上实现SelectionListeners</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Creating toolbars by hand</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">如果你不想ToolBarManager来创建toolbar的话，可以手动创建，需要用到ToolBar和ToolItem类.<br /><br /><strong><u>Toolbar<br /></u></strong>是一个composite control，包含多个ToolItems.Toolbar由多个小图标按钮组成，一般是16-by-16bitmap图片。每个按钮都对应一个ToolItem。Toolbar可以是水平的也可以是垂直的，默认为水平<br /><br /><strong><u>ToolItem<br /></u></strong>每一个ToolItem都有一个图片，如果没有，默认为红色方块。When the user selects a ToolItem from the menu, it broadcasts the event to any registered SelectionListeners.Your application should register a listener with each ToolItem and use that listener to perform whatever logic corresponds to the menu item.</font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/39866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-07 16:32 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/07/39866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.3 The Combo widget</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/07/39864.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Fri, 07 Apr 2006 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/07/39864.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/39864.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/07/39864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/39864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/39864.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">三种类型的Combo control:<br />1.Simple:默认类型，一个可编辑的text field和一个供选择的list<br />2.Drop-down:下拉列表，文本框可编辑<br />3.Read-only：文本框不可编辑的下拉列表，可用select( 0 )来将其默认选中列表中的首项。<br /><br />以上三种类型可在构造函数中通过STYLE.*来设置。<br /></font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/39864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-07 16:30 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/07/39864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.2 JFace text support</title><link>http://www.blogjava.net/joeyjong/archive/2006/04/04/39169.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Tue, 04 Apr 2006 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/04/04/39169.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/39169.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/04/04/39169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/39169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/39169.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" color="#000000" size="2">先要将org.eclipse.text_x.y.z和org.eclipse.jface.text_x.y.z加到classpath<br /></font>
		</p>
		<ul>
				<li>
						<font face="Verdana" color="#000000" size="2">
								<strong>TextViewer and Document</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">两个重要的接口：IDocument和ITextViewer。JFace为其提供了默认的实现。<br /><br />一个<span lang="en-US">IDocument</span>的实例持有被编辑的真实的文本信息。它的主要实现是Document类。AbstractDocument提供了部分实现，你可通过继承它来添加自己的实现。IDocument允许通过IDocumentListener接口来获取内容编辑的通知。<br /><br />IDocument还提供了以下功能<br /><strong><u>Positions<br /></u></strong>可以给每一个text区域分配一个记号来作为它的Position。当被指定给某个ducument时一个Position对象有an offset and a length of text。如果document的text被更新的话，Position也会同步更新，所以他永远都是指向同一段文字。Position类本身提供了一些基本的功能，可通过继承他来完善更多有用的功能。<br /><br /><strong><u>Partition content types<br /></u></strong>每个document由一个或多个partitions组成，通过ITypedRegion接口来表现。每一个partition可以有各自的内容类型，如plain text, rich text, or HTML。要使用它，你要创建一个IDocumentPartitioner然后assign给你的document,然后document的partitioner就会负责响应对指定位置内容类型的查询，它必须通过实现computePartitioning()来返回包含此document中所有ITypedRegions的一个数组。不需要实现你自己的document partitioner。如果没有创建，整个document就是一个区域，类型为IDocument.DEFAULT_CONTENT_TYPE。<br /><br /><strong><u>Searching<br /></u></strong>IDocument通过search()提供了搜索的功能。不支持regular expressions or other patterns，但提供了search start location,direction, and case sensitivity and whether to match whole words only.<br /><br />ITextViewer将一个标准的text widget转换成一个基于document的text widget<br /><br />ITextViewer的默认实现是TextViewer，它使用StyledText来显示数据。ITextViewer支持text modifications的listener，也支持visual events（如改变viewport，即text的当前可视区域）的监听器。<br /><br />虽然作为ITextViewer的默认应用，如果你想要修改显示，TextViewer允许你直接accessStyledText，但建议你使用TextPresentation，因为它可以收集该文档中带有的各个不同的StyleRanges。<br /><br />ITextViewer还支持很多不同类型的插件，可用来修改widget的行为。可以被customized的功能有：<br />1.通过IUndoManager来支持undo<br />2.通过ITextDoubleClickStrategy来支持对鼠标双击的处理<br />3.通过IAutoIndentStrategy来支持文本的自动缩进<br />4.通过ITextHover来实现，当鼠标停留在document的一个section上时，显示text.<br />要使用上述插件，你需要分配一个适当的接口实例给text viewer，然后调用activatePlugins().<br /><br />如下列出了org.eclipse.jface.text的子包及其作用<br /><img style="WIDTH: 501px; HEIGHT: 626px" height="642" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_org.eclipse.jface.text's%20subpackage.jpg" width="547" /><br /></font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/39169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-04-04 15:02 <a href="http://www.blogjava.net/joeyjong/archive/2006/04/04/39169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.1 Editing text with SWT</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/29/38098.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Wed, 29 Mar 2006 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/29/38098.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/38098.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/29/38098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/38098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/38098.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">用于文本编辑的control有2个：Text和StyledText.后者可以为文本和control本身设定颜色，格式等。这两个control之间毫无关联，除了都是Composite的子类之外。</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>The basic Text widget</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">package com.swtjface.Ch5;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.SWT;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.events.VerifyEvent;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.events.VerifyListener;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.layout.FillLayout;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.widgets.Composite;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.widgets.Text;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public class Ch5Capitalizer extends Composite {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public Ch5Capitalizer(Composite parent) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">super(parent, SWT.NONE);</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">buildControls();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">private void buildControls() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">this.setLayout(new FillLayout());</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">Text text = new Text(this, SWT.MULTI | SWT.V_SCROLL);</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">text.addVerifyListener(new VerifyListener() { //每当text被改变，任何以注册的VerifyListeners便会被调用。此处每按一次键盘，此方法就被调用。如果是同时输入多个字符，也调用一次</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public void verifyText(VerifyEvent e) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">if( e.text.startsWith("1") ) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">e.doit = false;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">} //如果文本以1开头，即不允许编辑</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">else {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">e.text = e.text.toUpperCase();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">} </font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">});</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}<br /><br />Text的重要方法，见下图<br /><img height="326" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_text%20method.jpg" width="515" /><br />insert()--doesn’t allow you to insert text into the existing content.<br /></font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>The StyledText widget</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana">
						<font size="2">StyledText<span lang="zh-CN">包含了一系列的应用到该小部件的预定义的动作，这些是常规的东西如：剪切、粘贴、移动至下一个词、移动至文末。代表这些动作的常量在</span>org.eclipse.swt.custom<span lang="zh-CN">程序包中的</span>ST<span lang="zh-CN">类中有定义。这些常量在两种情况下发挥功效：首先，你可以使用它们程序性地使用</span>invokeAction()<span lang="zh-CN">方法调用任一的这些方法；其次，你也可以使用</span>setKeyBinding()<span lang="zh-CN">方法来将它们绑定于键击行为。</span>setKeyBinding()<span lang="zh-CN">选定一个键（可以通过诸如</span>Shift<span lang="zh-CN">或是</span>Ctrl<span lang="zh-CN">之类的编辑键来修改</span>SWT<span lang="zh-CN">常量之一）绑定于指定的动作。如下的例子中组合键</span>Ctrl-Q<span lang="zh-CN">绑定于粘贴动作。引起注意的是这并不意味着会将默认键的绑定清除，该两个绑定都会生效。</span></font>
						<br />
						<br />
						<font size="2">相对于Text而言，还添加了drawing line backgrounds and line styles的事件，可以通过此事件来改变整行的style或背景颜色。注意：如果使用了LineStyleListener,就不能在StyledText实例上调用get/setStyleRange()， 如果使用了LineBackgroundListener，那你就不能调用getLineBackground() or setLineBackground().</font>
						<br />
						<br />
						<font size="2">可以通过使用一个StyledText的StyleRanges来改变显示的风格<br /><br /><u><strong>StyleRange<br /></strong></u>StyledText通过使用StyleRange类来管理当前所显示的不同styles。其所有的栏位都是public的可随意修改，但是要一直到当此StyledText实例的setStyleRange()被调用之后才会生效。<br /><br />StyleRanges通过开始偏移量和长度来设定text的区域范围。</font>
						<font size="2">StyleRange可设定背景和前景色，默认为null，还可设定字体，SWT.NORMAL 或者SWT.BOLD.<br /><br />similarTo()可用来判断两个StyleRange实例是否有同样的前景、背景和字体。<br /><br />当我们保存text之后，可通过styledText.getStyleRanges()来获取style信息，此函数会返回an array of StyleRange</font>
						<br />
						<br />
						<font size="2">toggleBold()--将已输入的文本在bold和normal之间切换，是被一个KeyListener调用的，此KeyListener会监听F1是否被按下<br /><br /><strong><u>A StyledText example<br /></u></strong>复制、粘贴功能不需要通过代码便可使用，是和platform的标准键盘快捷方式相关联的<br /><br />ExtendedModifyListener和ModifyListener不同，前者提供了关于what was done的event细节，而后者只是当编辑懂作产生时notify,不会去准确的辨别到底何种修改发生了。<br /><br /></font>
				</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">package com.swtjface.Ch5;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import java.util.LinkedList;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import java.util.List;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.SWT;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.custom.*;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.events.KeyAdapter;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.events.KeyEvent;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.layout.FillLayout;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.widgets.Composite;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public class Ch5Undoable extends Composite {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">private static final int MAX_STACK_SIZE = 25;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">private List undoStack;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">private List redoStack;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">private StyledText styledText;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public Ch5Undoable(Composite parent) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">super(parent, SWT.NONE);</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">undoStack = new LinkedList();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">redoStack = new LinkedList();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">buildControls();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">private void buildControls() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">this.setLayout(new FillLayout());</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">styledText = new StyledText(this, SWT.MULTI | SWT.V_SCROLL);</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">styledText.addExtendedModifyListener(</font>
		</p>
		<p>
				<font face="Verdana">
						<font size="2">
								<font color="#ff1493">new </font>
								<font color="#ff1493">ExtendedModifyListener() { //每次text被编辑的时候，都会调用此listener</font>
						</font>
				</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">public void modifyText(ExtendedModifyEvent event) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">String currText = styledText.getText();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">String newText = currText.substring(event.start,</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">event.start + event.length); //获得新插入的文本</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">if( newText != null &amp;&amp; newText.length() &gt; 0 ) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">if( undoStack.size() == MAX_STACK_SIZE ) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">undoStack.remove( undoStack.size() - 1 );</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">undoStack.add(0, newText);//将新插入的文本保存到undoStack中</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">}); //关键部分</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">styledText.addKeyListener(new KeyAdapter() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">public void keyPressed(KeyEvent e) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">switch(e.keyCode) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">case SWT.F1:</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">undo(); break;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">case SWT.F2:</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">redo(); break;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">default: //ignore everything else</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">});</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">private void undo() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">if( undoStack.size() &gt; 0 ) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">String lastEdit = (String)undoStack.remove(0);//得到要undo的字符</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">int editLength = lastEdit.length();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">String currText = styledText.getText();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">int startReplaceIndex = currText.length() - editLength;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">styledText.replaceTextRange(startReplaceIndex, editLength, ""); //将最后输入的字符替换成空</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">redoStack.add(0, lastEdit);//把最后的这个undo的字符加到redoStack中</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">private void redo() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">if( redoStack.size() &gt; 0 ) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">String text = (String)redoStack.remove(0);//得到要恢复的字符</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">moveCursorToEnd();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">styledText.append(text);//将要恢复的字符加至文本的最后</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">moveCursorToEnd();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" color="#0000ff" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">private void moveCursorToEnd() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">styledText.setCaretOffset(styledText.getText().length());</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/38098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-29 17:42 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/29/38098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>4.2 Event processing in JFace</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/24/37241.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Fri, 24 Mar 2006 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/24/37241.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/37241.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/24/37241.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/37241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/37241.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">ActionContributionItem--combines the function of a GUI widget and its attached listener class.<br />Action--处理事件<br />与SWT的listener/event模式很类似，但是其class更抽象，更易于使用，scope更窄。</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>actions and contributions</strong>
						</font>
				</li>
		</ul>
		<p>
				<img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_JFace%20event.jpg" />
		</p>
		<p>
				<font face="Verdana" size="2">Action--可以简单的理解成一个命令，<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">可以关联到菜单，工具条，以及按钮<br /><font face="Verdana"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Contribution--在</span><span lang="EN-US">JFace</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面，一个</span><span lang="EN-US">Action</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以对应多个</span><span lang="EN-US">GUI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，这些对象就是所谓的</span></font><font face="Verdana"><span lang="EN-US">Contribution Item. 有两个主要的Contribution类：ContributionItem和ContributionManager，它们都是抽象类，靠其子类来实现事件的处理。继承关系见下图<br />ContributionItem--引发事件的单独GUI组件<br />ContributionManager--产生包含ContributionItems的对象<br /><img style="WIDTH: 499px; HEIGHT: 184px" height="205" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_jface%20contribution.jpg" width="518" /><br /></span>ActionContributionItem--最重要，在ApplicationWindow中创建和实施，来将一个action连接至此GUI，它虽没有设定好的外观，但是依赖于你使用的fill()方法，却可以帮助一个按钮、菜单栏和工具栏的成形<br /><br />另一个与Contribution协作的方法是通过ContributionManager,它的子类类似于ContributionItem的container。其中MenuManager将ContributionItems组合在窗口最高层菜单， ToolBarManager则将这些对象放在仅在菜单之下的toolbar中。</font><br /></span></font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">创建Action类</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">Action是抽象类。</font>
		</p>
		<p>
				<font face="Verdana" color="#000000" size="2">package com.swtjface.Ch4;<br />import org.eclipse.jface.action.*;<br />import org.eclipse.jface.resource.*;<br />public class Ch4_StatusAction extends Action<br />{<br />StatusLineManager statman;<br />short triggercount = 0;<br />public Ch4_StatusAction(StatusLineManager sm)<br />{<br /><font color="#ff1493">super("&amp;Trigger@Ctrl+T", </font></font>
				<font face="Verdana" color="#000000" size="2">
						<font color="#ff1493">AS_PUSH_BUTTON);//在T字母之前的&amp;符号意味着这个字母将作为该动作的快捷键。而在TEXT领域内的“Ctrl+T”确保了当用户在同时按下Ctrl键和T键时该动作就会被激发。</font>
						<br />statman = sm;<br />setToolTipText("Trigger the Action");<br />setImageDescriptor(ImageDescriptor.createFromFile<br />(this.getClass(),"eclipse.gif"));<br />}<br /><font color="#008000">public void run() //每次当Ch4_StatusAction被生成，run()方法就被调用<br /></font>{<br />triggercount++;<br />statman.setMessage("The status action has fired. Count: " +<br />triggercount);<br />}<br /></font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Implementing contributions in an ApplicationWindow</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">package com.swtjface.Ch4;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.*;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.widgets.*;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.jface.window.*;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.jface.action.*;</font>
		</p>
		<p>
				<font color="#ff1493">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public class Ch4_Contributions extends ApplicationWindow {</font>
				</font>
		</p>
		<p>
				<font color="#ff1493">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">StatusLineManager slm = new StatusLineManager();</font>
				</font>
		</p>
		<p>
				<font color="#ff1493">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">Ch4_StatusAction status_action = new Ch4_StatusAction(slm);</font> //<font size="2">用<font face="Verdana">StatusLineManager的对象作参数，</font>创建了一个<font face="Verdana">Ch4_StatusAction的实例</font></font></font>
		</p>
		<p>
				<font color="#ff1493">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">ActionContributionItem aci = new</font>
				</font>
				<font color="#ff1493">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">ActionContributionItem(status_action);</font> //用<font face="Verdana" size="2">Ch4_StatusAction的对象作参数，创建了ActionContributionItem对象</font></font>
		</p>
		<p>
				<font color="#008000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public Ch4_Contributions() {</font>
				</font>
		</p>
		<p>
				<font color="#008000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">super(null);</font> //</font>
				<font color="#008000">
						<font size="2">创建了</font>
						<font face="Verdana" size="2">ApplicationWindow对象</font>
				</font>
		</p>
		<p>
				<font color="#008000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">addStatusLine();</font>
				</font>
		</p>
		<p>
				<font color="#008000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">addMenuBar();</font>
				</font>
		</p>
		<p>
				<font color="#008000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">addToolBar(SWT.FLAT | SWT.WRAP);</font> //<font face="Verdana" size="2">在窗口上添加了status line, menu, toolbar</font></font>
		</p>
		<p>
				<font color="#008000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
				</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">protected Control createContents(Composite parent) {</font>
		</p>
		<p>
				<font color="#ffa500">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">getShell().setText("Action/Contribution Example");</font>
				</font>
		</p>
		<p>
				<font color="#ffa500">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">parent.setSize(290,150);</font> //<font face="Verdana" size="2">设置了窗口的title和size</font></font>
		</p>
		<p>
				<font color="#0000ff">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">aci.fill(parent);</font> //</font>
				<font color="#0000ff">
						<font face="Verdana" size="2">将ActionContributionItem放在GUI中。因为这里的参数是Composite对象，所以根据Action的STYLE属性来确定。此处是Button，因为<font color="#0000ff">Ch4_StatusAction 的STYLE属性是</font>AS_PUSH_BUTTON;</font>
				</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">return parent;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public static void main(String[] args) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">Ch4_Contributions swin = new Ch4_Contributions();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">swin.setBlockOnOpen(true);</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">swin.open();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">Display.getCurrent().dispose();</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">protected MenuManager createMenuManager() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">MenuManager main_menu = new MenuManager(null);</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">MenuManager action_menu = new MenuManager("Menu");</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">main_menu.add(action_menu);</font>
		</p>
		<p>
				<font color="#ff0000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">action_menu.add(status_action);</font> //<font size="2">关联<font face="Verdana">status_action.created and added to the menu in the form of a menu item</font></font></font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">return main_menu;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">protected ToolBarManager createToolBarManager(int style) {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">ToolBarManager tool_bar_manager = new ToolBarManager(style);</font>
		</p>
		<p>
				<font color="#ff0000">
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">tool_bar_manager.add(status_action);</font> //<font size="2">关联<font face="Verdana">status_action。created and added to the toolbar as a toolbar item.</font></font></font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">return tool_bar_manager;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">protected StatusLineManager createStatusLineManager() {</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">return slm;</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<p>
				<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
		</p>
		<ul>
				<li>
						<strong>
								<font face="Verdana" size="2">Interfacing with contributions</font>
						</strong>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">两个途径来将ActionContributionItem添加到GUI：<br />1. 通过ContributionManager子类的add()方法。<br />（1）可接受Action对象的参数，从而间接的将ContributionItem和ContributionManager关联。可多次执行<br />（2）可直接接受ActionContributionItem对象的参数。只可执行一次<br />2.通过ActionContributionItem类的fill()方法。根据其参数的不同，所先是的组件也不同，具体见下表：<br /><img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_fill()method.jpg" /></font>
		</p>
		<ul>
				<li>
						<strong>
								<font face="Verdana" size="2">Exploring the Action class</font>
						</strong>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">Important methods of the Action class</font>
				<br />
				<img style="WIDTH: 502px; HEIGHT: 197px" height="183" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Important%20methods%20of%20the%20Action%20class.jpg" width="438" />
				<br />
				<br />
				<font face="Verdana" size="2">Property methods for the Action class</font>
				<br />
				<img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Property%20methods%20for%20the%20Action%20class.jpg" />
				<br />
				<font face="Verdana" size="2">DESCRIPTION--written to a status line to provide additional help.</font>
				<br />
				<br />
				<font face="Verdana" size="2">Style methods for the Action class</font>
				<br />
				<img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Style%20methods%20for%20the%20Action%20class.jpg" />
				<br />
				<font face="Verdana" size="2">如果ENABLED是FALSE，则变灰。CHECKED主要用于radio和checkbox<br /><br />Accelerator key / keyboard methods for the Action class<br /><img style="WIDTH: 464px; HEIGHT: 233px" height="267" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Accelerator%20key%20for%20the%20Action%20class.jpg" width="549" /><br />Accelerator keys--鼠标点击的键盘块捷方式</font>
				<br />
				<br />
				<font face="Verdana" size="2">Listener methods for the Action class<br /><img style="WIDTH: 486px; HEIGHT: 230px" height="224" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Listener%20methods%20for%20the%20Action%20class.jpg" width="470" /><br />虽然JFace使用action代替了SWT的listener/event机制，但是Actiono类仍然可以和listener协作来处理特定需求的事件。<br />IPropertyChangeListener接口关注客户自定义的PropertyChangeEvents,当所给的对象按照你所给的方式变成另一个对象时，此事件被触发。<br /><br />Miscellaneous methods of the Action class<br /><img style="WIDTH: 512px; HEIGHT: 252px" height="261" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Miscellaneous%20methods%20of%20the%20Action%20class.jpg" width="531" /></font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/37241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-24 17:02 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/24/37241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>4.1 Event processing in SWT</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/23/37061.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Thu, 23 Mar 2006 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/23/37061.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/37061.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/23/37061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/37061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/37061.html</trackback:ping><description><![CDATA[
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>The SWT event-processing cycle</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">
						<img height="176" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_event%20SWT.jpg" width="490" />
						<font face="Times New Roman" size="3">
								<br />
						</font>
						<font face="Verdana" size="2">1. Once an SWT application begins running, its Display class sorts through this queue using its readAndDispatch() method and msg field, which acts as a handle to the underlying OS message queue.<br />2. If it finds anything relevant, it sends the event to its top-level Shell object, which determines which widget should receive the event.<br />3. The Shell then sends the event to the widget that the user acted on, which transfers this information to an associated interface called a listener.<br />4. One of the listener’s methods performs the necessary processing or invokes another method to handle the user’s action, called an event handler.</font>
						<font face="Times New Roman" size="3">
								<br />
								<br />
						</font>
						<font face="Verdana" size="2">所在包：org.eclipse.swt.events</font>
						<font face="Times New Roman" size="3"> </font> </font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>typed listeners and events</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">typed listeners--只对某一类的用户事件起作用，继承TypedListener类<br />typed events--与此类特定动作相关的事件，继承TypedEvent类<br /><br />可通过add...Listener()method with the typed listener as the argument来将listener附加到widget。<br /><br />完整的typed events和listeners列表，如下：<br /><img style="WIDTH: 502px; HEIGHT: 817px" height="817" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_typed%20events%20_%20listener.jpg" width="541" /><font face="Times New Roman" size="3"> <br /><br /></font><font face="Verdana" size="2">TypedEvent类包含了一些member field,他们提供与事件发生相关的一些信息，这些信息可以在event handler中使用来获得与环境相关的信息。下图为继承自TypedEvent及EventObject类的fields:<br /><img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_data%20fields.jpg" /><br />除此之外，很多的event类还有其他用来提供更多用户动作信息的fields,如MouseEvent类的button field<br /><br />要将listener加入到code中，有两个主要的方法：<br />第一个是在component的add...Listener()中创建一个匿名接口，这样可以使listener的作用域仅限于此component,示例代码如下：<br /><font color="#ff1493">Button button = new Button(shell, SWT.PUSH | SWT.CENTER);//创建了一个button，并将其加入到shell中<br /></font><font color="#008000">button.addMouseListener(new MouseListener() //创建了一个匿名MouseListener接口，并将其与button关联</font><br />{<br />public void mouseDown(MouseEvent e)<br />{<br />clkdwnEventHandler();<br />}<br />public void mouseUp(MouseEvent e)<br />{<br />clkupEventHandler();<br />}<br />public void mouseDoubleClick(MouseEvent e)<br />{<br /><font color="#ffa500">dblclkEventHandler(); //此接口中必须被实现的三个方法。一旦鼠标按下，放开或双击，就会有一个MouseEvent被发送到这三个方法中的一个，然后，此方法再调用相关联的event-handling方法（即下文中的三个）。</font><br />}<br />});<br />static void dblclkEventHandler()<br />{<br />System.out.println("Double click.");<br />}<br />static void clkdwnEventHandler()<br />{<br />System.out.println("Click - down.");<br />}<br />static void clkupEventHandler()<br />{<br /><font color="#0000ff">System.out.println("Click - up.");//event-handlers通过发送message到console来完成事件处理</font><br />}<br /><br />上一类方法的缺点是此listener仅限于此component内，而第二种方法便可解决这种问题--独立的声明一个继承MouseListener的接口，示例代码如下：<br />Button button = new Button(shell, SWT.PUSH | SWT.CENTER);<br />button.addMouseListener(ExampleMouseListener);<br />MouseListener ExampleMouseListener = new MouseListener()<br />{<br />public void mouseDoubleClick(MouseEvent e)<br />{<br />System.out.println("Double click.");<br />}<br />public void mouseDown(MouseEvent e)<br />{<br />System.out.println("Click - down.");<br />}<br />public void mouseUp(MouseEvent e)<br />{<br />System.out.println("Click - up.");<br />}<br />};<br /><br />使用MouseListener的缺点就是哪怕你只关心鼠标双击事件，却仍要声明其接口中所包含的所有方法。</font> </font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">Adapter</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">Adapter是继承了Listener接口并提供了所有required方法的实现的abstract类。也就是说如果你使用adapter而不是listener的话，你只需要写你感兴趣的方法<br /><br />只有那些listener有多个成员方法的event才有adapter,其完整列表见下图：<br /><img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_adapter.jpg" /><br />adapter同样是通过add...Listener()方法来创建的，与listener类似，同样也可通过匿名类和本地类两种方法，下例为匿名类方法：<br />button.addMouseListener(new MouseAdapter()<br />{<br />public void mouseDoubleClick(MouseEvent e)<br />{<br />dblclkEventHandler();<br />}<br />)};<br />static void dblclkEventHandler()<br />{<br />System.out.println("Double click.");<br />}</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Keyboard events</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">任何时候只要key被按下，就会创建KeyEvent，它有两个子类：TraverseEvent 和VerifyEvent.<br />TraverseEvent--当按下arrow key或tab key来focus on text widget时<br />VerifyEvent--fires when the user enters text that the program needs to check before taking further action.<br /><br />除了继承自TypedEvent和EventObject的field,KeyEvent还包括三个member field来提供那些与触发事件的key相关的信息，具体如下：<br />character--代表被按下key的char<br />stateMask--Returns an integer representing the state of the keyboard modifier keys.By examining this integer, a program can determine whether any of the Alt, Ctrl, Shift, and Command keys are currently pressed.<br />keyCode--Provides the SWT public constant corresponding to the typed key. KeyCode列表，见下图：<br /><img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_key%20code.jpg" /><br /><br />TraverseEvent中有两个fields:<br />1. doit--返回布尔值，若为真则允许在各个component间切换focus,若为假则不允许切换focus<br />2. detail--It’s an integer that represents the identity of the key that caused the event. For example, if the user presses the Tab key to switch to a new component, the detail field will contain the SWT constant TRAVERSE_TAB_NEXT.<br /><br />每个类型的Control对于所给的traversal key都有不同的默认behavior，如果设doit为true，则override了其默认的设置。<br /><br />VerifyEvent的field:<br />1.start和end--设定了输入的范围<br />2.text--contains the input String under examination.<br />3.doit--Having looked at the user’s text, you set the boolean doit field to allow (TRUE) or disallow (FALSE) the action.<br /></font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>untyped events</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">更灵活，但不安全，不推荐使用。<br />当一个代表着非类型化监听器的监听器类和GUI的某一组件相联系时，它就能接受该组件所能发送的任一类事件。因此，你需要操控这由Event类代表的捕获的全部事件，决定用户执行的那个动作。然后，正确的事件处理方法就被调用。<br /><br />不是被包含在org.eclipse.swt.events包中，而是被包含在org.eclipse.swt.widgets包中。<br /><br />代码示例如下：<br />Listener listener = new Listener ()<br />{<br />public void handleEvent (Event event)<br />{<br />switch (event.type)<br />{<br />case SWT.KeyDown:<br />if (event.character == 'b')<br />System.out.println("Key"+event.character);<br />break;<br />case SWT.MouseDown:<br />if (event.button == 3)<br />System.out.println("Right click");<br />break;<br />case SWT.MouseDoubleClick:<br />System.out.println("Double click");<br />break;<br />}<br />}<br />};<br />Button button = new Button(shell, SWT.CENTER);<br />button.addListener(SWT.KeyDown, listener);<br />button.addListener(SWT.MouseDown, listener);<br />button.addListener(SWT.MouseDoubleClick, listener);</font>
				<br />
				<br />
				<font face="Verdana" size="2">Event类包含了所有typed event中的所有field,此外还有一个type field，其所有的值列表如下：<br /><img style="WIDTH: 511px; HEIGHT: 252px" height="231" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_type%20value.jpg" width="455" /></font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/37061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-23 16:32 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/23/37061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3.4 Composites</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/22/36892.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Wed, 22 Mar 2006 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/22/36892.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/36892.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/22/36892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/36892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/36892.html</trackback:ping><description><![CDATA[
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Composite类</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">
						<strong>
								<u>getChildren()<br /></u>
						</strong>lists the children of a Composite as an array of Control objects.<br /><strong><u>getLayout()、setLayout(Layout)<br /></u></strong>处理layout对象<br /><strong><u>getTabList()、setTabList(Control[])<br /></u></strong>指定widgets在Composite中的Tab顺序（按键盘tab键的切换顺序）<br /><br />Composite类是Scrollable类的直接子类，这就是说SWT/JFace中的所有Composite对象都有Scrollbars.所有的Scrollable对象都可使用如下方法：<br /><strong><u>getClientArea()、 computeTrim(int, int,int, int)<br /></u></strong>trim--Composite的不可编辑区域，如title bars, scrollbars, 或status bars等.<br />client area--那些可编辑，使用的区域<br />getClientArea()--Returns the available display area of a Scrollable object<br />computeTrim(int,int,int,int)--Returns the necessary dimensions of the Composite for the desired client area<br /><strong><u>getHorizontalBar()、getVerticalBar()<br /></u></strong>Returns the horizontal/vertical ScrollBar object<br /><br />Control, Scrollable, and Composite的关系，如下图<br /><img height="233" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap8.jpg" width="501" /><font face="Times New Roman" size="3"> </font> </font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Groups</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">Composite子类中最简单的一个，自身不执行任何动作，仅仅是将一组子widgets用矩形边框起来，此边框类似于之前提到的分隔符，同样也提供SWT.SHADOW_IN, SWT.SHADOW_OUT, SWT.SHADOW_NONE风格，还可以通过选择SWT.SHADOW_ETCHED_IN or SWT.SHADOW_ETCHED_OUT来客制化阴影效果。<br /><br />可以通过setText()方法来设定它的label<br /><br />与许多Widgets子类一样，Group类不可被继承。</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>SashForms</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">可以在子widgets之间创建可移动的分界，此分界称为Sash.Sash类可以在org.eclipse.swt.widgets包中找到，而SashForms却存在于org.eclipse.swt.custom包中。<br /><br />SWT.HORIZONTAL和SWT.VERTICAL--用来设定Sash的方向<br />setOrientation()--用来设定Sash的方向<br />getMaximizedControl()--returns the Control object that has been expanded the most.<br />getWeights()--returns an int array containing the weight of each of the SashForm’s children.uses an int array to specify weights for each of the widgets in the Composite.</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>TabFolders</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">creating and populating a TabFolder的四个步骤：<br />1. 创建一个TabFolder实例<br />2. 为每个页面构建一个TabItem对象<br />3. 用setText()方法来设定tab的label<br />4. setControl()--关联一个control，当它的tab被选中时，显示此control<br /><br />TabFolder类提供了一些用来获得TabItems信息的方法，如下：<br /><strong><u>getItemCount()<br /></u></strong>返回此TabFolder所包含的TabItems数<br /><strong><u>getItems()<br /></u></strong>返回TabItems对象的数组<br /><strong><u>getSelection()</u></strong><br />确定user选择了哪个TabItem<br /><strong><u>setSelection()<br /></u></strong>Makes this decision from within the application</font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/36892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-22 17:55 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/22/36892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3.3 Buttons</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/21/36656.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Tue, 21 Mar 2006 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/21/36656.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/36656.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/21/36656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/36656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/36656.html</trackback:ping><description><![CDATA[
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>SWT.PUSH</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">Button类的默认风格。<br />SWT.FLAT</font>
		</p>
		<ul>
				<li>
						<strong>
								<font face="Verdana" size="2">SWT.ARROW</font>
						</strong>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">与SWT.UP, SWT.DOWN, SWT.LEFT, and SWT.RIGHT组合，也可使用SWT.FLAT</font>
		</p>
		<ul>
				<li>
						<strong>
								<font face="Verdana" size="2">SWT.TOGGLE</font>
						</strong>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">类似于SWT.PUSH，但是按下后会保持按下状态。可通过setSelection(boolean)方法来改变其状态。接下去介绍的check按钮和radio按钮也share这个功能</font>
		</p>
		<ul>
				<li>
						<strong>
								<font face="Verdana" size="2">SWT.CHECK</font>
						</strong>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">建议用数组来实现,如下：<br />Button[] checks = new Button[2];<br />checks[0] = new Button(shell, SWT.CHECK);<br />checks[0].setText("Choice 1");<br />checks[0].setLocation(10,5);<br />checks[0].pack();<br />checks[1] = new Button(shell, SWT.CHECK);<br />checks[1].setText("Choice 2");<br />checks[1].setLocation(10,30);<br />checks[1].pack();</font>
		</p>
		<ul>
				<li>
						<strong>
								<font face="Verdana" size="2">SWT.RADIO</font>
						</strong>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">建议用数组来实现,如下：</font>
				<br />
				<font face="Verdana" size="2">Button[] radios = new Button[3];<br />radios[0] = new Button(shell, SWT.RADIO);<br />radios[0].setSelected(true);<br />radios[0].setText("Choice 1");<br />radios[0].setLocation(10,5);<br />radios[0].pack();<br />radios[1] = new Button(shell, SWT.RADIO);<br />radios[1].setText("Choice 2");<br />radios[1].setLocation(10,30);<br />radios[1].pack();<br />radios[2] = new Button(shell, SWT.RADIO);<br />radios[2].setText("Choice 3");<br />radios[2].setLocation(10,55);<br />radios[2].pack();<br />for (int i=0; i&lt;radios.length; i++)<br />if (radios[i].getSelected())<br />System.out.println(i);</font>
				<br />
				<br />
				<font face="Verdana" size="2">通过RadioGroupFieldEditors将radio buttons组合在一起:</font>
		</p>
		<p>
				<font face="Verdana" size="2">RadioGroupFieldEditor rgfe = new RadioGroupFieldEditor(<br />"UserChoice", "Choose an option:", 1,<br />new String[][] {{"Choice1", "ch1"},<br />{"Choice2", "ch2"},<br />{"Choice3", "ch3"}},<br />shell, true);</font>
				<br />
				<font face="Verdana" size="2">其中的各个参数含义如下——1.name for the type of value returned by the editor.2.group label.3.列数。4.creates a set of option names with their associated values.In this manner, the RadioGroupFieldEditor can display a series of radio buttons without allocating Button objects.5.将editor加至Shell对象。6.specifies whether the radio buttons should be incorporated in a Group object.</font>
				<br />
				<br />
				<font face="Verdana" size="2">在SWT/JFace中,container widgets是由Composite类来提供的。</font>
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/36656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-21 17:03 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/21/36656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3.2 Labels</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/21/36651.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Tue, 21 Mar 2006 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/21/36651.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/36651.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/21/36651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/36651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/36651.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">用于在GUI中显示静态的信息：String或Image</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>风格和分隔符</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">对齐方式：SWT.CENTER,SWT.LEFT, and SWT.RIGHT.<br />分隔符：SWT.SEPARATOR;SWT.VERTICAL, SWT.HORIZONTAL;SWT.SHADOW_IN, SWT.SHADOW_OUT, and SWT.SHADOW_NONE.</font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">Label的方法</font>
				</li>
		</ul>
		<p>
				<img style="WIDTH: 467px; HEIGHT: 183px" height="175" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap7.jpg" width="478" />
		</p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/36651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-21 16:32 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/21/36651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3.1 Introducing the Widget and Control classes</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/21/36641.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Tue, 21 Mar 2006 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/21/36641.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/36641.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/21/36641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/36641.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/36641.html</trackback:ping><description><![CDATA[
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Widget类</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">是所有widget的父类。为抽象类，而且Eclipse.org也强烈反对去继承它，因此你既不能继承他，也不能直接使用它<br />Widget类中的重要方法，如下：</font>
		</p>
		<p>
				<img style="WIDTH: 445px; HEIGHT: 166px" height="237" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap3.jpg" width="542" />
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Control objects</strong>
						</font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">Control类中的对象在OS中有一个直接的副本，你可以通过类的handle field来直接access.然而SWT还提供了一些在Control类之外的widgets,如下所示：</font>
				<br />
				<img style="WIDTH: 402px; HEIGHT: 204px" height="221" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap4.jpg" width="445" /> <br /><br /><font face="Verdana" size="2">Control类的两类方法：</font><br /><img height="202" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap5.jpg" width="443" /><br /><br /><img style="WIDTH: 458px; HEIGHT: 205px" height="232" src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap6.jpg" width="494" /></p>
<img src ="http://www.blogjava.net/joeyjong/aggbug/36641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-21 15:11 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/21/36641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.2 Programming in SWT/JFace</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/15/35451.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Wed, 15 Mar 2006 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/15/35451.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/35451.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/15/35451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/35451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/35451.html</trackback:ping><description><![CDATA[
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>Model-based adapters</strong>
						</font>
				</li>
		</ul>
		<p>
				<font size="2">
						<font face="Verdana">与SWT widgets一起工作的JFace类可称为model-based adapters [或helper classes].这些adapter可以分为4类：<br />1.Viewers<br />将GUI组件中的信息与外观分离 [与SWT不同]<br />2.Actions and contributions<br /><span id="BlogViewId">简化了事件的处理，</span>将用户命令的反应与引发反应的事件分离<br />3.Image and font registries<br />注册机制，<span id="BlogViewId">资源可以被按需分配和释放</span></font>
				</font>
				<br />
				<font face="Verdana" size="2">4.Dialogs and wizards<br />信息框、错误框、进度框与向导框等</font>
		</p>
		<ul>
				<font face="Verdana" size="2">
						<li>
								<strong>SET/JFace应用程序的三段式结构</strong>
						</li>
				</font>
		</ul>
		<span id="BlogViewId">
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">package com.swtjface.Ch2;</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.jface.window.*;</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.*;</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.widgets.*;</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif">
								<br />
								<font size="2">
								</font>
						</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public class HelloSWT_JFace extends ApplicationWindow {</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public HelloSWT_JFace() {</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">super(null); //1.Window allocation</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">protected Control createContents(Composite parent) {</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">Text helloText = new Text(parent, SWT.CENTER);</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">helloText.setText("Hello SWT and JFace!");</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">parent.pack();</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">return parent; //2.Window presentation<br /></font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">
								<font color="#008000">/*<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif" size="2">处理窗口的设计,由于ApplicationWindow的可视部分不能被直接access，此方法连同一个Composite来控制GUI的显示，此container对象[Composite]是所有被加入应用程序的GUI组件的父件</font></span>*/</font>
								<br />
								<br />}</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public static void main(String[] args) {</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">HelloSWT_JFace awin = new HelloSWT_JFace();</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">awin.setBlockOnOpen(true);</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">awin.open();</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">Display.getCurrent().dispose();  //3.Window operation<br /><br />/*负责GUI的实际运作。在分派好ApplicationWindow的资源之后，main方法使窗口显示，当setBlockOnOpen()方法以一个true参数被调用的时候，窗口关闭。然后ApplicationWindow的open()方法被调用，根据createContent()方法所返回的Composite来显示窗口。然后程序通过dispose()方法释放GUI的Display实例.因为此程序中的所有widget都是display的child，所以一旦释放Display，所有的widget都被释放*/<br /><br /></font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
				</p>
				<ul>
						<li>
								<font face="Verdana" size="2">
										<strong>SWT与SWT/JFace的区别</strong>
								</font>
						</li>
				</ul>
				<p>
						<font face="Verdana" size="2">SWT将GUI的外观和操作都放在它的Shell类里，而SWT/JFace却将两者分离开来了，其中外观由createContents()方法内的Compsite来控制，而操作部分大体上是通过ApplicationWindow类的实例来实现的。</font>
				</p>
				<ul>
						<li>
								<font face="Verdana" size="2">
										<strong>ApplicationWindow</strong>
								</font>
						</li>
				</ul>
				<p>
						<font face="Verdana" size="2">SWT/JFace同样需要一个单独的Display实例，但是只要ApplicationWindow通过一个null参数来构建，那么就会创建它自己的Shell。参阅下图<br /><img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap2.jpg" /><br />ApplicationWindow在Shell的基础上提供了更多的途径来设计窗口，其相关方法如下：<br /><strong><u>addMenuBar() <br /></u></strong>Configures the window with a top-level menu<br /><strong><u>addToolBar()</u></strong><br />Adds a toolbar beneath the main menu<br /><strong><u>addStatusLine() <br /></u></strong>Creates a status area at the bottom of the window<br /><strong><u>setStatus(String)</u></strong><br />Displays a message in the status area<br /><strong><u>getSeparator() <br /></u></strong>Returns the line separating the menu from the window<br /><strong><u>setDefaultImage(Image) <br /></u></strong>Displays an image when the application has no shell<br /><strong><u>setExceptionHandler(IExceptionHandler）</u></strong><br />Configures the application to handle exceptions according to the specified interface<br /></font>
				</p>
		</span>
<img src ="http://www.blogjava.net/joeyjong/aggbug/35451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-15 17:07 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/15/35451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.1 Programming in SWT</title><link>http://www.blogjava.net/joeyjong/archive/2006/03/15/35403.html</link><dc:creator>小笼馒头</dc:creator><author>小笼馒头</author><pubDate>Wed, 15 Mar 2006 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/joeyjong/archive/2006/03/15/35403.html</guid><wfw:comment>http://www.blogjava.net/joeyjong/comments/35403.html</wfw:comment><comments>http://www.blogjava.net/joeyjong/archive/2006/03/15/35403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/joeyjong/comments/commentRss/35403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/joeyjong/services/trackbacks/35403.html</trackback:ping><description><![CDATA[
		<ul>
				<li>
						<font face="Verdana" size="2">
								<strong>SWT应用程序的三段式结构：</strong>
						</font>
						<br />
				</li>
		</ul>
		<span id="BlogViewId">
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">package com.swtjface.Ch2;</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.*;</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">import org.eclipse.swt.widgets.*;</font>
				</p>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public class HelloSWT {</font>
				</p>
				<blockquote dir="ltr">
						<p>
								<font face="Verdana, Geneva, Arial, Sans-serif" size="2">public static void main (String [] args) {</font>
						</p>
						<blockquote dir="ltr">
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">Display display = new Display();</font>
								</p>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#ff1493" size="2">Shell shell = new Shell(display); //1.Allocation and initialization。<br /><font color="#ff1493">/*生成一个<font size="2">Display</font><font size="2">和</font><font size="2">Shell</font><font size="2">类的实例，<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font color="#ff1493"><font size="2">GUI</font><font size="2">获取底层平台的资源并开辟了一个主窗口。*/</font></font></font></span></font></font></font>
								</p>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">Text helloText = new Text(shell, SWT.CENTER);</font>
								</p>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">helloText.setText("Hello SWT!");</font>
								</p>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#008000" size="2">helloText.pack();//2.Adding widgets to the shell<br /></font>
								</p>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">
												<font color="#008000">/*</font>
												<font color="#006400">
														<span id="BlogViewId">
																<font face="Verdana, Geneva, Arial, Sans-serif">
																		<font color="#008000">
																				<font size="2">在</font>
																				<font size="2">Shell</font>
																				<font size="2">上加入一个文本小部件。The code in this section also sets the parameters for these widgets, containers, and events to make sure they look and act as required.其中pack()方法是tell the Shell and Text components to use only as much space as they need.*/</font>
																		</font>
																</font>
														</span>
														<br />
												</font>
												<br />shell.pack();</font>
								</p>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">shell.open();</font>
								</p>
						</blockquote>
				</blockquote>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">
						</font>
				</p>
				<blockquote dir="ltr">
						<blockquote dir="ltr">
								<p dir="ltr">
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">while (!shell.isDisposed()){</font>
								</p>
								<blockquote dir="ltr">
										<p>
												<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">if (!display.readAndDispatch()) display.sleep();</font>
										</p>
								</blockquote>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">}</font>
								</p>
								<p>
										<font face="Verdana, Geneva, Arial, Sans-serif" color="#ffa500" size="2">display.dispose(); //3.GUI operation<br /></font>
								</p>
						</blockquote>
						<p>
								<font face="Verdana, Geneva, Arial, Sans-serif" size="2">
										<font color="#ffa500">/*一旦Shell的open()方法被调用,应用程序的主窗口和其子部件都会被呈现。只要Shell保持在打开状态，Display实例就会通过它的readAndDispatch()方法来追踪<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font color="#ffa500" size="2">在操作系统事件队列中</font></font></span>的相关用户事件。当<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font color="#ffa500"><font size="2">窗口关闭时，与</font><font size="2">Display</font><font size="2">对象（包括</font><font size="2">Shell</font><font size="2">以及其子部件等）相联系的资源就全部释放</font></font></font></span>*/<br /></font>
										<br />}</font>
						</p>
				</blockquote>
				<p>
						<font face="Verdana, Geneva, Arial, Sans-serif" size="2">}</font>
				</p>
				<ul>
						<li>
								<font face="Verdana" size="2">
										<strong>Display 类</strong>
								</font>
						</li>
				</ul>
				<p>
						<span id="BlogViewId">
								<font face="Verdana, Geneva, Arial, Sans-serif">
										<font size="2">Display</font>
										<font size="2">类并不是可见的，但它负责监管着</font>
										<font size="2">GUI</font>
										<font size="2">的资源并管理着和操作系统的通信。<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">它不光要关注着它自己的窗口是如何显示、移动和重画的，还同时要确保诸如鼠标点击、键盘敲击等事件送达widgets并去处理它们。</font></font></span></font>
								</font>
						</span>
				</p>
				<p>
						<span>
								<font size="2">
										<span>
												<span id="BlogViewId">
														<font face="Verdana">
																<font size="2">是任何</font>
																<font size="2">SWT</font>
																<font size="2">和</font>
																<font size="2">JFace</font>
																<font size="2">应用程序的承载着，无论你是用</font>
																<font size="2">SWT/JFace</font>
																<font size="2">开发或是单用</font>
																<font size="2">SWT</font>
														</font>
														<font face="Verdana" size="2">开发，你必须在你的程序中包含这个类的一个实例。<br /></font>
												</span>
												<br />
												<span id="BlogViewId">
														<font face="Verdana">
																<font size="2">Display</font>
																<font size="2">
																		<span lang="zh-CN">类的主要任务就是负责将你的代码重的</span>
																</font>
																<font size="2">SWT</font>
																<font size="2">
																		<span lang="zh-CN">和</span>
																</font>
																<font size="2">JFace</font>
														</font>
														<font size="2">
																<span lang="zh-CN">
																		<font face="Verdana">命令翻译成底层的命令来调取操作系统。</font>
																		<span id="BlogViewId">
																				<font size="2">
																						<span lang="zh-CN">
																								<font face="Verdana">这一过程包含了两部分：</font>
																								<span id="BlogViewId">
																										<font size="2">
																										</font>
																										<font face="Verdana">
																												<font size="2">1.Display</font>
																												<font size="2">对象构建一个代表着操作系统平台的</font>
																												<font size="2">OS</font>
																												<font size="2">类的实例；这个类通过一系列被称之为native methods的特殊</font>
																												<font size="2">Java</font>
																										</font>
																										<font size="2">
																												<font face="Verdana">程序提供了接触计算机底层资源的途径。2.</font>
																												<span id="BlogViewId">
																														<font face="Verdana">
																																<font size="2">这个</font>
																																<font size="2">Display</font>
																														</font>
																														<font size="2">
																																<font face="Verdana">对象使用这些方法来直接指令操作系统并向应用程序传达用户动作。<br /><br />if any features in your operating system aren’t incorporated into SWT, you can use the Java Native Interface to add them yourself.All it requires is a native Java method in the SWT package and a C function in the native graphics library that calls the operating system.<br /><br /></font>
																																<span id="BlogViewId">
																																</span>
																														</font>
																												</span>
																										</font>
																								</span>
																						</span>
																				</font>
																		</span>
																</span>
														</font>
												</span>
										</span>
								</font>
						</span>
				</p>
				<ul>
						<li>
								<strong>
										<font face="Verdana">
												<font size="2">Display</font>
												<font size="2">
														<span lang="zh-CN">类的方法</span>
												</font>
										</font>
								</strong>
						</li>
				</ul>
				<p>
						<font face="Verdana">
								<font size="2">
										<span lang="zh-CN">
												<u>
														<strong>1.Display()--Allocates platform resources and creates a Display object<br /></strong>
												</u>must be used in any SWT-based GUI.<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">它产生一个Display类的实例并将其和</font><font size="2">GUI</font><font size="2">相联系</font></font></span><br /><u><strong>2.getCurrent()--Returns the user-interface thread<br /></strong></u>must be used in any SWT-based GUI.<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">它返回一个应用程序的主线程，用户界面线程,通常和dispose()一起使用来结束Display的操作。</font></font></span><br /><u><strong>3.readAndDispatch()--Display object interprets events and passes them to receiver<br /></strong></u>enable the application to receive notifications from the operating system whenever the user takes an action associated with the GUI.<br />accesses the operating system’s event queue and determines whether any of the user’s actions are related to the GUI.<br />Using this method, the HelloSWT class knows whether the user has decided to dispose of the Shell. If so, the method returns TRUE, and the application ends. Otherwise, the Display object invokes its sleep() method, and the application continues waiting.<br /><u><strong>4.sleep()--Display object waits for events<br /></strong></u>enable the application to receive notifications from the operating system whenever the user takes an action associated with the GUI.<br /></span>
								</font>
						</font>
				</p>
				<ul>
				</ul>
		</span>
		<font face="Verdana" size="2">
				<li>
						<strong>Shell 类</strong>
				</li>
				<p>The Shell class accesses the operating system through the OS class to an extent, but only to keep track of opening, activating, maximizing, minimizing, and closing the main window.<br /><br />The main function of the Shell class is to provide a common connection point for the containers, widgets, and events that need to be integrated into the GUI. Shell serves as the parent class to these components.<br /><img src="http://www.blogjava.net/images/blogjava_net/joeyjong/8717/o_Snap1.jpg" /><br />attached to the Display的shell--top-level shells<br />NOT directly attached to the Display instance的shell--secondary shell<br /><br /><span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">在你的</font><font size="2">GUI</font><font size="2">之内，你可以设定</font><font size="2">shell</font><font size="2">或其他小部件的风格参数值，若是多个值则可以用“</font><font size="2">|”</font><font size="2">相连.<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">除了提到的属性，默认为“<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2"></font><font size="2">SHELL_TRIM</font></font></span>”。<br /><br /><span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2"></font><font size="2">SHELL_TRIM--<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">有一个标题栏</font><font size="2">(SWT.TITLE)</font><font size="2">和用户可以最小化</font><font size="2">SWT.MIN)</font><font size="2">、最大化</font><font size="2">(SWT.MAX)</font><font size="2">、改变尺寸</font><font size="2">(SWT.RESIZE)</font><font size="2">和关闭</font><font size="2">(SWT.CLOSE)</font></font></span><br /></font></font></span><span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">DIALOG_TRIM--<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">有一个标题栏、一个活动区的边界</font><font size="2">(SWT.BORDER)</font><font size="2">和被关闭的能力</font></font></span></font><font size="2"></font></font></span><br /><br />你还可以确定</font><font size="2">shell</font><font size="2">的形态，以限定用户修改</font><font size="2">shell</font><font size="2">的modality,如A modal dialog box<span id="BlogViewId"><font face="Verdana, Geneva, Arial, Sans-serif"><font size="2">不能被移动或是改变尺寸，只可以使用给予的按钮关闭或是取消。</font></font></span></font></font></span><br /><br />NOT every platform can render these properties in GUI components.</font></font></span></p>
		</font>
<img src ="http://www.blogjava.net/joeyjong/aggbug/35403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/joeyjong/" target="_blank">小笼馒头</a> 2006-03-15 13:51 <a href="http://www.blogjava.net/joeyjong/archive/2006/03/15/35403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>