初步体验
								widget 
								
										
										
								
						
				
		
		
				
						 
				
				
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						从
						Widget
						和
						Control
						开始
						
								
								
						
				
		
		
				
						Widget
						是
						Control
						的父类,而
						Control
						是我们使用的大多数部件的父类。我们在以前的一些编程语言中可能接触过
						“
						控件
						”
						或者
						“
						组件
						”
						之类的概念,部件(
						widget
						)的概念大体和这些相当。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						在
						org.eclipse.swt.widgets
						中定义了众多的
						widget
						,甚至我们前面介绍的
						Shell
						也被当成
						widget
						的一种。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						因为可用的
						widget
						如此之多,所以我大概没有办法全部一一介绍。在这一节中,我会介绍几种常用的
						widget
						。相信善于触类旁通的你通过这些极为简略的介绍应该可以开始使用各种
						widget
						,在使用中不断完善自己的认识。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						首先我们来介绍
						Widget
						。它是一个抽象类,也是所有
						widget
						的父类。通过介绍这个类,我们可以得出这所有
						widget
						的一些共有特性。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						Widget
						的方法中
						dispose()
						方法我们在以前曾经见到过,调用这个方法时候,所谓的接收者(
						receiver
						,譬如我们这样写:
						awidget.dispose()
						,那么
						awidget
						就是接收者,而这句话所处的对象成为调用者或者
						caller
						)和接收者中所包含的其他
						widget
						会释放它们所占用底层操作系统的资源。这也就是说你不必显式地为程序中创建的每个
						widget
						进行
						dispose()
						调用,而只需要确保最外层的
						widget
						(比如
						Display
						)进行了
						dispose()
						就可以了。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						另外还可以通过
						isDisposed()
						判断是否该
						widget
						(接收者)已经进行了
						dispose
						。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						Widget
						中的
						getStyle()
						方法得到
						widget
						的风格,而
						getDisplay()
						得到所处的
						Display
						对象。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						此外
						Widget
						中还有两个重要方法
						getData()
						和
						setData()
						,这两个方法允许我们为一个
						widget
						附加其他的信息。特别是在你需要跨模块传递
						widget
						的时候,这个功能显得非常有用。比如如果一个文本框中显示了一段文章中的某句话,如果我们同时希望把这整篇文章的题目和作者附加上的话可以这样写:
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						
								| 
										 
												
														atext.setData(“title”,”I Have A Dream”); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														atext.setData(“author”,” Martin Luther King”);
														
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
								 | 
						
				
		
		
				
						代码段
						
								
										3
								
								
										
										
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						在程序的其他部分可以用
						atext.getData(“title”)
						得到这篇文章的题目,或者用
						atext.getData(“author”)
						得到作者。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						在前面我们提到过,
						Control
						是今后我们所使用大部分
						widget
						的父类。在这里我不单独进行介绍,而是在后面的部分中介绍。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						创建部件
				
		
		
				
						和创建其
						他
						
								java object
						一样,我们通过使用
						new
						操作符创建部件的实例。有一点比较特殊的可能你需要使用带参数的构造函数进行
						new
						操作。类似下面的程序:
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						
								| 
										 
												
														Text text=new Text(shell,SWT.CENTER);
														
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
								 | 
						
				
		
		
				
						
								
								 
				
		
		
		
		
				
				 
		
		
		
				
				 
		
		
		
				
						这种方法适用于几乎所有的
						widget
						,其中第一个参数是父
						widget
						,也就是指明了该
						widget
						需要被放置道另外哪一个
						widget
						之中,而第二个参数是这个
						widget
						的风格。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						大小和位置
				
		
		
				
						仅仅创建一个部件并不足以让你看到它,因为一个部件初始的长和宽都是
						
								0
						
						。你还需要设定它的大小。你可以用
						
								setSize()
						
						或者
						
								setBounds()
						
						方法手动设定部件的大小,也可以让系统自动调整部件的大小到一个合适的值,这个值也被成为首选尺寸(
						
								preferred size
						
						)。
				
		
		
				
						可以通过调用
						
								pack()
						
						方法让系统调整控件大小。如果你希望系统自动调整,那么你需要首先设定控件需要表达的内容。举个例子来说,如果你的部件是一个文本框或者标签,你应该首先设定它所要显示的文本,这样系统可以通过文本的长度计算。
				
		
		
				
						对于部件的位置,同样可以使用
						
								setLocation()
						
						或者
						
								setBounds()
						
						进行设定。
				
		
		
				
						这里值得一提的是所谓的
						
								bounds
						
						,其实
						
								bounds
						
						可以看成是大小和尺寸的综合。比如
						
								setBounds(int x, int y,int width,int height)
						
						的参数中,
						
								x
						
						和
						
								y
						
						描述的是位置信息,而
						
								width
						
						和
						
								height
						
						描述了大小。
				
		
		
				
						隐藏与失效
				
		
		
				
						通过部件的
						
								setVisible
						
						方法可以控制部件进行隐藏或是显示。通过
						
								setEnabled
						
						方法可以控制部件是否有效。一个无效的部件不会对用户的任何动作作出响应。这两个方法的参数都是布尔型的。
				
		
		
				
						提示文本
				
		
		
				
						可以通过
						
								setToolTipText()
						
						方法设定部件的提示文本。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						几种常用的部件
				
		
		
				
						Label
				
		
		
				
						标签用来显示静态的文本或者图像。关于图像和色彩我会在后面的部分进行介绍。
				
		
		
				
						标签可以使用
						
								SWT.CENTER, SWT.LEFT, SWT.RIGHT
						
						中的一种指明文本的对齐方式(居中对齐,左对齐,右对齐)。
				
		
		
				
						你也可以通过设置标签属性为
						
								SWT. SEPARATOR 
						
						使标签成为一条分隔符。
				
		
		
				
						下面这个程序给出了标签的两种表现形式,其中使用了
						
								Layout
						
						,关于
						
								Layout
						
						的详细情况也会在后面的部分进行介绍:
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						
								| 
										 
												
														public class Labels { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																  
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																    public static void main(String[] args) { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        Display display = new Display(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        Shell shell = new Shell(display,SWT.SHELL_TRIM); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        RowLayout layout=new RowLayout(SWT.VERTICAL); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        shell.setLayout(layout); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        shell.setText("Labels"); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        Label label1=new Label(shell,SWT.CENTER); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        label1.setText("Label Demo"); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        Label label2=new Label(shell,SWT.SEPARATOR | SWT.HORIZONTAL); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        shell.setSize(100,100); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        shell.open(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																
																  
												
										 
										
										 
										
												
												  
										
										 
										
												
												  
										
										 
										
												
														
																        while (!shell.isDisposed()) { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            if (!display.readAndDispatch()) { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																                display.sleep(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																     
																       } 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        } 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																        display.dispose(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																    } 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														} 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
								 | 
						
				
		
		
				
						代码段
						
								
										4
								
						
				
		
		
				
						最后得到的效果可以参照下图:
				
		
		
				
						
				
		
		
				
						
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
								
										aspectratio="t" v:ext="edit">
								
								
								
								
						
				
		
		
				
						图
						
								
										4
								
						
				
		
		
				
						Text
				
		
		
				
						
								Text
						
						就是最简单的文本框,与标签一样,我们可以通过设定它的风格来表示它的对齐方式(
						
								SWT.CENTER
						
						,
						
								SWT.LEFT
						
						,
						
								SWT.RIGHT
						
						),另外还有其他一些用于文本支持的方法,比如
						
								insert()
						
						,
						
								paster()
						
						,
						
								copy()
						
						,
						
								setSelection()
						
						,
						
								selectAll()
						
						等,这些方法在后面介绍
						
								swt
						
						事件模式会进行更详细的介绍。
				
		
		
				
						Button
				
		
		
				
						在
						
								swt
						
						中,
						
								Button
						
						并不仅仅是按钮。构造时候定义的风格不同,所体现出的外观也不一样。
				
		
		
				
						如果风格定义成
						
								SWT.PUSH
						
						,它就是一个普通的按钮。
				
		
		
				
						如果定义为
						
								SWT.TOGGLE
						
						,它在被按下以后会保持按下的形状(而不会弹起来),直到鼠标再次在上面按一下才会回复弹起的形状。
				
		
		
				
						如果风格定义为
						
								SWT.ARROW
						
						,它是一个带箭头的按钮,箭头的指向可以选择
						
								SWT.LEFT
						
						,
						
								SWT.RIGHT
						
						,
						
								SWT.UP
						
						,
						
								SWT.DOWN
						
						中的一个。
				
		
		
				
						如果定义为
						
								SWT.CHECK
						
						,它是一个复选框。
				
		
		
				
						如果定义为
						
								SWT.RADIO
						
						,它是一个单选框。
				
		
		
				
						下面一段程序演示了各种不同的
						Button
						。
						
								
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						
								| 
										 
												
														public class Buttons { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																
																  
												
										 
										
										 
										
												
												  
										
										 
										
												
												  
										
										 
										
												
														
																        public static void main(String[] args) { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            Display display = new Display(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            Shell shell = new Shell(display,SWT.SHELL_TRIM); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            RowLayout layout=new RowLayout(SWT.VERTICAL); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            shell.setLayout(layout); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            shell.setText("Buttons"); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            Button pushbutton=new Button(shell,SWT.PUSH | SWT.CENTER); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            pushbutton.setText("SWT.PUSH"); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																
																  
												
										 
										
										 
										
												
												  
										
										 
										
												
												  
										
										 
										
												
														
																            Button togglebutton=new Button(shell,SWT.TOGGLE | SWT.LEFT); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            togglebutton.setText("SWT.TOGGLE"); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            togglebutton.setSelection(true); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            Button arrowbutton=new Button(shell,SWT.ARROW | SWT.LEFT); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            Button checkbox=new Button(shell,SWT.CHECK); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            checkbox.setText("SWT.CHECK"); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																          
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            Button radio=new Button(shell,SWT.RADIO); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            radio.setText("SWT.RADIO"); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            radio.setSelection(true); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            
																
																 
														
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            shell.pack(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            shell.open(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																
																  
												
										 
										
										 
										
												
												  
										
										 
										
												
												  
										
										 
										
												
														
																            while (!shell.isDisposed()) { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																                if (!display.readAndDispatch()) { 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																                    display.sleep(); 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																                } 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            } 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																            display.dispose();    
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														
																    } 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
												
														} 
												
										 
										
										 
										
										 
										
										 
										
										 
										
										 
								 | 
						
				
		
		
				
						代码段
						
								
										5
								
						
				
		
		
				
						最后得到的窗口如下图:
				
		
		
				
						
				
		
		
				
						
						
						
						
						
						
				
		
		
				
						图
						
								
										5
								
								
										
										
								
						
				
		
		
		
		
		
		
		
		
		
		
		
		
				
						小结
				
		
		
				
						在这一节中我向大家介绍了
						
								widget
						
						的一些基本知识,还有几种简单的
						
								widget
						
						。你可能注意到这些描述仅仅限于外观方面,如何让
						
								widget
						
						和用户交互起来呢?这需要我们处理各种用户事件,在下一节中我会向大家介绍
						
								swt
						
						的事件模式。