初步体验
widget
大家好,五一已经过去了,你们玩得开心么?
在前面的两篇文章中,我向大家介绍了
swt
的一些基本知识,现在让我们继续下去讨论一下
swt
中的
widget
相关的一些知识以及介绍几种最为简单的
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
的时候,这个功能显得非常有用。比如如果一个文本框中显示了一段文章中的某句话,如果我们同时希望把这整篇文章的题目和作者附加上的话可以这样写:
1
atext.setData(
"
title
"
,
"
I Have A Dream
"
);
2
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
的详细情况也会在后面的部分进行介绍:
1
public
class
Labels
{
2
3
public
static
void
main(String[] args)
{
4
Display display
=
new
Display();
5
Shell shell
=
new
Shell(display,SWT.SHELL_TRIM);
6
RowLayout layout
=
new
RowLayout(SWT.VERTICAL);
7
shell.setLayout(layout);
8
shell.setText(
"
Labels
"
);
9
Label label1
=
new
Label(shell,SWT.CENTER);
10
label1.setText(
"
Label Demo
"
);
11
Label label2
=
new
Label(shell,SWT.SEPARATOR
|
SWT.HORIZONTAL);
12
shell.setSize(
100
,
100
);
13
shell.open();
14
15
while
(
!
shell.isDisposed())
{
16
if
(
!
display.readAndDispatch())
{
17
display.sleep();
18
}
19
}
20
display.dispose();
21
}
22
}
23
代码段
4
最后得到的效果可以参照下图:
图
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
。
1
public
class
Buttons
{
2
3
public
static
void
main(String[] args)
{
4
Display display
=
new
Display();
5
Shell shell
=
new
Shell(display,SWT.SHELL_TRIM);
6
RowLayout layout
=
new
RowLayout(SWT.VERTICAL);
7
shell.setLayout(layout);
8
shell.setText(
"
Buttons
"
);
9
10
Button pushbutton
=
new
Button(shell,SWT.PUSH
|
SWT.CENTER);
11
pushbutton.setText(
"
SWT.PUSH
"
);
12
13
Button togglebutton
=
new
Button(shell,SWT.TOGGLE
|
SWT.LEFT);
14
togglebutton.setText(
"
SWT.TOGGLE
"
);
15
togglebutton.setSelection(
true
);
16
17
Button arrowbutton
=
new
Button(shell,SWT.ARROW
|
SWT.LEFT);
18
19
20
Button checkbox
=
new
Button(shell,SWT.CHECK);
21
checkbox.setText(
"
SWT.CHECK
"
);
22
23
Button radio
=
new
Button(shell,SWT.RADIO);
24
radio.setText(
"
SWT.RADIO
"
);
25
radio.setSelection(
true
);
26
27
shell.pack();
28
shell.open();
29
30
while
(
!
shell.isDisposed())
{
31
if
(
!
display.readAndDispatch())
{
32
display.sleep();
33
}
34
}
35
display.dispose();
36
}
37
}
代码段
5
最后得到的窗口如下图:
图
5
小结
在这一节中我向大家介绍了
widget
的一些基本知识,还有几种简单的
widget
。你可能注意到这些描述仅仅限于外观方面,如何让
widget
和用户交互起来呢?这需要我们处理各种用户事件,在下一节中我会向大家介绍
swt
的事件模式。