1.
SWT
SWT
是由IBM所提出的,一个用于做用户界面的包。她与Sun的Swing具有很多的相似之处,因此如果掌握了Swing,那么要学习SWT将是非常简单的。SWT在Eclipse中得到了很大的使用,但是,在Eclipse当中更多情况下,我们使用的是对SWT再进行了一层封装的JFACE包。因此,如果想进行Eclipse的插件开发,我们需要先掌握SWT和JFACE。
2.
从例子开始
a)
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test1 {
public static void main(String[] args) {
Display d = new Display();
Shell s = new Shell(d);
s.setText("Test");
Label l = new Label(s, SWT.NONE);
l.setText("Hello World");
l.pack();
s.pack();
s.open();
while (!s.isDisposed()) {
if (!d.readAndDispatch()) {
d.sleep();
}
}
d.dispose();
}
}
a)
运行图:
b)
说明:
从上述程序,我们可以大约的得到一些SWT与Swing不一样的地方:
1.
当我们需要实例化一个控件时,我们需要在构造函数中提供父控件的引用。
2.
通过构造函数,我们不需要进行显式的add()操作,来组织控件树。
3.
我们需要手动的启动消息循环(while部分)。
4.
程序结束的时候,我们需要手工的对资源进行释放。
3.
控件:
a)
Label
:
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test1 {
public Test1() {
init();
}
private void init() {
…
Label b1 = new Label(s, SWT.NONE);
b1.setText("Label 1");
b1.setBackground(new Color(d, 0, 0, 255));
Label b2 = new Label(s, SWT.BORDER | SWT.CENTER);
b2.setText("Label 2");
Label b3 = new Label(s, SWT.WRAP);
b3.setText("Label 3");
Label b4 = new Label(s, SWT.SEPARATOR | SWT.HORIZONTAL);
…
}
public static void main(String[] args) {
Test1 t = new Test1();
}
}
ii.
运行图:
iii.
说明:
1.
Label
实例化的时候需要提供一个Style参数,从后面的例子可以看到,这个Style参数在SWT当中被广泛使用,通过Style参数的使用,我们可以比在Swing当中接触到更少的子类。
2.
Label
可以使用的Style参数有:BORDER, CENTER, LEFT, RIGHT, WRAP和SEPARATOR。BORDER用于为控件添加边框;CENTER,LEFT,RIGHT用于Label内容的对齐;WRAP用于当文本内容超出Label一行的最大长度时,进行自动换行。当使用SEPARATOR时,可以配合HORIZONTAL,VERTICAL,SHADOW_IN, SHADOW_OUT和SHADOW_NONE使用。
b)
Text
:
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test2 {
public Test2() {
init();
}
private void init() {
…
Text t1 = new Text(s, SWT.NONE);
/**
*
相当于密码输入框
*/
Text t2 = new Text(s, SWT.BORDER);
t2.setEchoChar('*');
t2.setTextLimit(10); //
限制最大输入字符数为10个
/**
*
不能换行,相当于TextField
*/
Text t3 = new Text(s, SWT.SINGLE);
t3.setText("Hello World");
/**
*
支持换行
*/
Text t4 = new Text(s, SWT.MULTI);
t4.setText("Hello World");
/**
*
相当于TextArea
*/
Text t5 = new Text(s, SWT.H_SCROLL | SWT.V_SCROLL);
/**
*
支持自动换行
*/
Text t6 = new Text(s, SWT.WRAP);
…
}
public static void main(String[] args) {
Test2 t = new Test2();
}
}
ii.
运行图:
iii.
说明:
1.
Text
可以使用的Style参数有:BORDER,H_SCROLL,V_SCROLL,MULTI,SINGLE,READ_ONLY,WRAP。BORDER用于添加边框;H_SCROLL和V_SCROLL用于提供滚动,当使用滚动时即表明Text可以添加多行内容;MULTI和SINGLE用于表示Text的内容时多行还是单行;READ_ONLY用于表示Text为止读。WRAP用于当文本内容超出Text一行的长度时,进行自动换行。
c)
Button
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test3 {
public Test3() {
init();
}
private void init() {
…
/**
*
普通按钮
*/
Button b1 = new Button(s, SWT.PUSH | SWT.LEFT);
b1.setText("Button 1");
/**
*
单选按钮
*/
Button b2 = new Button(s, SWT.CHECK);
b2.setText("Button 2");
/**
* Radio
按钮
*/
Button b3 = new Button(s, SWT.RADIO);
b3.setText("Button 3");
/**
*
箭头按钮
*/
Button b4 = new Button(s, SWT.ARROW | SWT.BORDER);
b4.setText("Button 4");
/**
* Toggle
按钮
*/
Button b5 = new Button(s, SWT.TOGGLE);
b5.setText("Button 5");
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Button
可以使用的Style有:PUSH,CHECK,RADIO,TOGGLE,ARROW,FLAT, BORDER, LEFT, RIGHT和CENTER。其中,前5个用于改变按钮的类别;后5个用于改变按钮的外观。
2.
由于SWT没有提供类似于Swing当中的ButtonGroup的概念,因此,我们需要以手工的方式来处理按钮间的互斥选择问题。
d)
List
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test4 {
…
private void init() {
…
/**
*
多选
*/
List l1 = new List(s, SWT.MULTI | SWT.H_SCROLL | SWT.BORDER);
l1.add("Item 1");
l1.add("Item 2");
l1.add("Item 3");
/**
*
单选
*/
List l2 = new List(s, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
l2.setItems(new String[] { "Item 1", "Item 2", "Item 3" });
…
}
…
}
ii.
运行图:
iii.
说明:
1.
List
可以使用的Style有:BORDER,H_SCROLL,V_SCROLL,SINGLE和MULTI。SINGLE和MULTI用于表示单选和多选。
e)
Combo
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test5 {
private Combo c2 = null;
public Test5() {
init();
}
private void init() {
…
/**
*
没有编辑框
*/
Combo c1 = new Combo(s, SWT.DROP_DOWN | SWT.READ_ONLY);
c1.setItems(new String[] { "Item 1", "Item 2", "Item 3" });
Combo c2 = new Combo(s, SWT.SIMPLE | SWT.BORDER);
c2.setItems(new String[] { "Item 1", "Item 2", "Item 3" });
/**
*
没有选项
*/
Combo c3 = new Combo(s, SWT.DROP_DOWN);
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Combo
可以使用的Style有:BORDER,DROP_DOWN,READ_ONLY,SIMPLE。DROP_DOWN表示只提供下拉框;SIMPLE表示既有下拉框又有编辑框。
f)
Composite
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test6 {
…
private void init() {
…
/**
* Composite
就是一个容器,他类似于JPanel
*/
Composite c = new Composite(s, SWT.BORDER);
c.setBackground(new Color(d, 255, 0, 0));
Label l = new Label(c, SWT.BORDER);
l.setText("Hello World");
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Composite
是一个容器,相当于Swing当中的JPanel。
2.
Composite
可以使用的Style有:BORDER,H_SCROLL和V_SCROLL。
g)
Group
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test7 {
…
private void init() {
…
Group g1 = new Group(s, SWT.BORDER | SWT.SHADOW_ETCHED_IN);
g1.setText("Group 1");
g1.setBackground(new Color(d, 255, 0, 0));
Button b = new Button(g1, SWT.PUSH);
b.setText("Button");
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Group
是Composite的一个子类,所以他也是一个容器,不过它与Composite的区别就是,她比Composite多加了一个框。
2.
Group
可以使用的Style有:BORDER,SHADOW_ETCHED_IN,SHADOW_ETCHED_OUT,SHADOW_IN,SHADOW_OUT和SHADOW_NONE。
4.
事件监听
a)
SelectionListener
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test1 {
…
private void init() {
…
Button b = new Button(s, SWT.PUSH);
b.setText("Button");
b.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
System.out.println("Button was pressed");
}
});
…
}
…
}
ii.
说明:
1.
SelectionListener
的作用与Swing当中的ActionListener同。
b)
KeyListener
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test2 {
…
private void init() {
…
Text t = new Text(s, SWT.BORDER);
t.addKeyListener(new KeyAdapter() {
@Override public void keyPressed(KeyEvent e) {
if (e.character == 'a') {
System.out.println("a is forbidden");
//
通过doit属性,可以禁止输入的字符
e.doit = false;
} else {
System.out.println("Pressed " + e.character);
}
}
});
…
}
…
}
ii.
说明:
1.
SWT
没有为按键提供与Swing中类似的平台无关的VK码。
2.
我们可以通过KeyEvent中的doit属性,来对输入框的内容进行约束。这是比Swing要方便的地方,如果我们想要在Swing当中完成相同的操作的话,可能需要获取TextField中对应的module对象,并进行操作。
c)
MouseListener
,MouseMoveListener,MouseTrackListener
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test3 {
…
private void init() {
…
Button b1 = new Button(s, SWT.PUSH | SWT.BORDER);
b1.setText("Button 1");
b1.addMouseListener(new MouseAdapter() {
@Override public void mouseDown(MouseEvent e) {
System.out.println("Pressed at (" + e.x + "," + e.y + ")");
}
});
Button b2 = new Button(s, SWT.PUSH | SWT.BORDER);
b2.setText("Button 2");
b2.addMouseMoveListener(new MouseMoveListener() {
public void mouseMove(MouseEvent e) {
System.out.println("Pressed at (" + e.x + "," + e.y + ")");
}
});
Button b3 = new Button(s, SWT.PUSH | SWT.BORDER);
b3.setText("Button 3");
b3.addMouseTrackListener(new MouseTrackAdapter() {
@Override public void mouseHover(MouseEvent e) {
System.out.println("Pressed at (" + e.x + "," + e.y + ")");
}
});
…
}
…
}
ii.
说明:
1.
SWT
增加了MouseTrackerListener,用于监听鼠标进入,离开和在控件上停留的事件。
d)
FocusListener
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test5 {
…
private void init() {
…
Button[] bs = new Button[3];
int i = 0;
for (Button b : bs) {
b = new Button(s, SWT.PUSH);
b.setText("Button " + i);
b.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
System.out.println(e.getSource() + " Gains Focus");
}
});
b.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
System.out.println("Don't use Tab to Traverse.");
e.doit = false;
}
}
});
i++;
}
…
}
…
}
ii.
说明:
1.
FocusListener
在控件获取到焦点之后得到通知。
2.
TraverseListener
在控件获得焦点之前得到通知,通过TraverseEvent的detail值可以得知控件是通过什么方式获得焦点,而通过doit值,可以限制是否让控件获取该焦点。
5.
高级控件
a)
Table
:
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test1 {
private Table table = null;
…
private void init() {
…
table = new Table(s, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.FULL_SELECTION);
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn name = new TableColumn(table, SWT.CENTER);
name.setText("Name");
name.setWidth(100);
TableColumn sex = new TableColumn(table, SWT.CENTER);
sex.setText("Sex");
sex.setWidth(50);
TableColumn age = new TableColumn(table, SWT.CENTER);
age.setText("Age");
age.setWidth(50);
TableItem i1 = new TableItem(table, SWT.NONE);
i1.setText(new String[] { "nick", "m", "24" });
TableItem i2 = new TableItem(table, SWT.NONE);
i2.setText(new String[] { "cen", "m", "24" });
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem ti = table.getSelection()[0];
for (int i = 0; i < 3; i++)
System.out.print(ti.getText(i) + "\t");
System.out.println();
}
});
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Table
可以使用的Style值:BORDER,H_SCROLL,V_SCROLL,SINGLE,MULTI,CHECK,FULL_SELECTION和HIDE_SELECTION。其中SINGLE,MULTI用于支持单选和多选;CHECK用于为第一列增加一个CheckBox;FULL_SELECTION用于当选择某一列时,可以把该项所在的行全部选中。HIDE_SELECTION用于禁止表格的项被选中。
iv.
结构图:
b)
TabFolder
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test2 {
…
private void init() {
…
TabFolder tf = new TabFolder(s, SWT.BORDER);
Composite c1 = new Composite(tf, SWT.BORDER);
c1.setLayout(new RowLayout());
Label b1 = new Label(c1, SWT.BORDER);
b1.setText("Label 1");
Composite c2 = new Composite(tf, SWT.BORDER);
c2.setLayout(new RowLayout());
Label b2 = new Label(c2, SWT.BORDER);
b2.setText("Label 2");
TabItem page1 = new TabItem(tf, SWT.NONE);
page1.setText("Page 1");
page1.setControl(c1);
TabItem page2 = new TabItem(tf, SWT.NONE);
page2.setText("Page 2");
page2.setControl(c2);
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Tab
可以使用的Style有:BORDER。
iv.
结构图:
c)
Slider
,Scale和ProgressBar
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test3 {
private Slider slider = null;
private Scale scale = null;
private ProgressBar pb = null;
…
private void init() {
…
slider = new Slider(s, SWT.HORIZONTAL);
slider.setMinimum(0);
slider.setMaximum(100);
slider.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
System.out.println("slider is:"+ slider.getSelection());
}
});
scale = new Scale(s, SWT.HORIZONTAL);
scale.setMinimum(0);
scale.setMaximum(100);
scale.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
System.out.println("scale is:"+ scale.getSelection());
}
});
pb = new ProgressBar(s, SWT.HORIZONTAL | SWT.SMOOTH);
pb.setMinimum(0);
pb.setMaximum(100);
pb.setSelection(75);
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Slider
,Scale,ProgressBar可以使用的Style有BORDER,HORIZONTAL和VERTICAL。
d)
菜单:
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test4 {
…
private void init() {
…
Menu bar = new Menu(s, SWT.BAR);
s.setMenuBar(bar);
MenuItem fMenu = new MenuItem(bar, SWT.CASCADE);
fMenu.setText("File");
Menu fileMenu = new Menu(s, SWT.DROP_DOWN);
fMenu.setMenu(fileMenu);
MenuItem miOpen = new MenuItem(fileMenu, SWT.PUSH);
miOpen.setText("&Open\tCtrl+o");
miOpen.setAccelerator(SWT.CTRL + 'o');
MenuItem miClose = new MenuItem(fileMenu, SWT.PUSH);
miClose.setText("&Close");
MenuItem eMenu = new MenuItem(bar, SWT.CASCADE);
eMenu.setText("Edit");
Menu editMenu = new Menu(s, SWT.DROP_DOWN);
eMenu.setMenu(editMenu);
MenuItem miCopy = new MenuItem(editMenu, SWT.CHECK);
miCopy.setText("&Copy");
MenuItem miPaste = new MenuItem(editMenu, SWT.RADIO);
miPaste.setText("&Paste");
miOpen.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
System.out.println("Open Selected");
}
});
Button b = new Button(s, SWT.PUSH);
b.setText("Button");
/**
*
弹出式菜单
* */
Menu mPopup = new Menu(s, SWT.POP_UP);
MenuItem miFile = new MenuItem(mPopup, SWT.CASCADE);
miFile.setText("File");
Menu pfileMenu = new Menu(s, SWT.DROP_DOWN);
miFile.setMenu(pfileMenu);
MenuItem pmiOpen = new MenuItem(pfileMenu, SWT.PUSH);
pmiOpen.setText("Open");
pmiOpen.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
System.out.println("Open Selected");
}
});
MenuItem pmiCopy = new MenuItem(mPopup, SWT.PUSH);
pmiCopy.setText("Copy");
b.setMenu(mPopup);
…
}
…
}
ii.
运行图:
iii.
说明:
1.
与菜单相关的类只有Menu和MenuItem。而为了组成整个菜单栏,我们需要通过不同的Style来标识不同的控件。
2.
当Menu的Style为Bar时,表示这个Menu是个MenuBar。
3.
如果需要新建一个菜单,我们需要:
MenuItem fMenu = new MenuItem(bar, SWT.CASCADE);
fMenu.setText("File");
Menu fileMenu = new Menu(s, SWT.DROP_DOWN);
fMenu.setMenu(fileMenu);
其中,前两行是为MenuBar添加了一个Style为CASCADE的MenuItem。第三行是新建一个菜单,他的Style为DROP_DOWN,表示为一个下来菜单。然后第4行,是把菜单项和这个菜单关联起来,这于待会提到的上下文菜单类似,即把fileMenu看作是fMenu的弹出菜单。
4.
如果需要建立一个弹出式菜单,我们需要新建一个Style为POP_UP的菜单,他的作用与2中提到的MenuBar类似,后续的工作都是基于这个新建的POP_UP菜单继续的。
5.
MenuItem
可以使用的Style有:PUSH,CHECK,RADIO,SEPARATOR,CASCADE。
iv.
结构图:
e)
树:
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test5 {
private Tree tree = null;
…
private void init() {
…
tree = new Tree(s, SWT.SINGLE | SWT.BORDER | SWT.CHECK);
tree.setSize(300, 300);
TreeItem tiC = new TreeItem(tree, SWT.NONE);
tiC.setText("C");
TreeItem tiD = new TreeItem(tree, SWT.NONE);
tiD.setText("D");
TreeItem tiPro = new TreeItem(tiC, SWT.NONE);
tiPro.setText("Program File");
TreeItem tiJava = new TreeItem(tiD, SWT.NONE);
tiJava.setText("Java");
tree.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
TreeItem[] tis = tree.getSelection();
for (TreeItem ti : tis) {
System.out.println(ti.getText() + " was selected "
+ ti.getChecked());
}
}
});
…
}
…
}
ii.
运行图:
iii.
说明:
1.
Tree
可以使用的Style有:MULTI,SINGLE和CHECK。其中MULTI和SINGLE表示单选和多选;CHECK是为每个树节点添加复选框。
iv.
结构图:
f)
ToolBar
:
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test6 {
…
private void init() {
…
ToolBar tb = new ToolBar(s, SWT.BORDER | SWT.HORIZONTAL);
ToolItem tiOpen = new ToolItem(tb, SWT.PUSH);
tiOpen.setText("Open");
ToolItem tiClose = new ToolItem(tb, SWT.PUSH);
tiClose.setText("Close");
Group g = new Group(s, SWT.BORDER);
g.setText("Group");
…
}
…
}
ii.
运行图:
iii.
说明:
iv.
结构图:
g)
CoolBar
:
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test7 {
…
private void init() {
…
CoolBar cb = new CoolBar(s, SWT.BORDER);
cb.setLayout(new RowLayout());
CoolItem ci1 = new CoolItem(cb, SWT.BORDER);
CoolItem ci2 = new CoolItem(cb, SWT.BORDER);
Button b = new Button(cb, SWT.PUSH);
b.setText("Button");
ToolBar tb = new ToolBar(cb, SWT.BORDER | SWT.HORIZONTAL);
ToolItem tiOpen = new ToolItem(tb, SWT.PUSH);
tiOpen.setText("Open");
ToolItem tiClose = new ToolItem(tb, SWT.CHECK);
tiClose.setText("Close");
ci1.setControl(b);
ci2.setControl(tb);
…
}
…
}
ii.
运行图:
iii.
说明:
iv.
结构图:
h)
消息框
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test9 {
…
private void init() {
…
MessageBox box = new MessageBox(s, SWT.ICON_QUESTION | SWT.YES | SWT.NO);
box.setMessage("Are you a student?");
box.setText("Question");
int res = box.open();
switch (res) {
case SWT.YES:System.out.println("Select Yes");
break;
case SWT.NO:System.out.println("Select No");
break;
}
ColorDialog cd = new ColorDialog(s);
cd.setText("Selected Color");
cd.setRGB(new RGB(255, 0, 0));
RGB rgb = cd.open();
System.out.println("Select color is " + rgb);
DirectoryDialog dd = new DirectoryDialog(s);
dd.setText("Selected Dir");
dd.setFilterPath("D:/");
String path = dd.open();
System.out.println("Select path is " + path);
FileDialog fd = new FileDialog(s, SWT.OPEN);
fd.setText("Select File");
fd.setFilterPath("D:/");
fd.setFileName("*.java");
String file = fd.open();
System.out.println("Select path is " + file);
FontDialog fod = new FontDialog(s);
FontData fontd = new FontData("
新宋体", 9, SWT.NONE);
fod.setText("Select Font");
fod.setFontList(new FontData[] { fontd });
fod.setRGB(new RGB(0, 0, 0));
FontData font = fod.open();
System.out.println("Select font is " + font);
PrintDialog pd = new PrintDialog(s);
PrinterData pdata = pd.open();
System.out.println("Print data is " + pdata);
…
}
…
}
ii.
运行图:
MessageBox
ColorDialog
DirectoryDialog
FileDialog
FontDialog
PrintDialog
iii.
说明:
iv.
结构图:
6.
绘图:
a)
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test8 {
private Canvas canvas = null;
…
private void init() {
…
canvas = new Canvas(s, SWT.BORDER);
canvas.setSize(200, 200);
s.pack();
s.open();
GC graphic = new GC(canvas);
paint(graphic, d);
graphic.dispose();
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
paint(e.gc, e.display);
}
});
…
}
private void paint(GC g, Display d) {
Color red = d.getSystemColor(SWT.COLOR_RED);
Font f = new Font(d, "
新宋体", 9, SWT.NONE);
Image i = new Image(d, "11.jpg");
g.setForeground(red);
g.setFont(f);
g.drawRectangle(0, 0, 80, 80);
g.drawText("Hello World", 20, 20);
g.drawImage(i, 0, 0, i.getBounds().width, i.getBounds().height, 30, 40,40,
40);
i.dispose();
f.dispose();
}
…
}
b)
运行图:
c)
说明:
i.
SWT
提供一个叫做GC(GraphicContext)的东西用于绘图,每个控件都可以属于他自己的GC。
ii.
在SWT中,字体,颜色,图片都是重量对象,因此使用完以后,应该进行显式的dispose()操作。
iii.
由于,我们不能像Swing当中那样,通过子类化的方法,对绘图方法进行重载,因此我们需要通过事件处理的方式进行图像的重绘。
7.
布局
a)
FillLayout
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test1 {
…
private void init() {
Display d = new Display();
Shell s = new Shell();
s.setText("FillLayout");
s.setSize(200, 200);
s.setLayout(new FillLayout());
Button[] bs = new Button[4];
for (int i = 0; i < bs.length; i++) {
bs[i] = new Button(s, SWT.PUSH | SWT.BORDER);
bs[i].setText("Button " + i);
}
s.pack();
s.open();
while (!s.isDisposed()) {
if (!d.readAndDispatch()) {
d.sleep();
}
}
d.dispose();
}
public static void main(String[] args) {
Test1 t = new Test1();
}
}
ii.
运行图:
iii.
说明:
1.
FillLayout
的作用与Swing当中的FlowLayout相似。
b)
RowLayout
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test2 {
…
private void init() {
…
RowLayout layout = new RowLayout();
layout.wrap = true;
s.setLayout(layout);
Button[] bs = new Button[4];
for (int i = 0; i < bs.length; i++) {
bs[i] = new Button(s, SWT.PUSH | SWT.BORDER);
bs[i].setText("Button " + i);
}
…
}
…
}
ii.
运行图:
iii.
说明:
1.
RowLayout
通过wrap属性,可以使得当一行不能容下所有控件时,自动把控件下移到下一行。
c)
GridLayout
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test3 {
…
private void init() {
…
GridLayout layout = new GridLayout();
layout.numColumns = 2;
s.setLayout(layout);
Button[] bs = new Button[4];
for (int i = 0; i < bs.length; i++) {
bs[i] = new Button(s, SWT.PUSH | SWT.BORDER);
bs[i].setText("Button " + i);
}
…
}
…
}
ii.
运行图:
iii.
说明:
1.
GridLayout
的使用与Swing中的GridLayout类似。
d)
FormLayout
i.
说明:太复杂了,不管。
8.
其他有趣功能
a)
使用系统托盘(Tray)
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test1 {
private Menu mPop = null;
…
private void init() {
Display d = new Display();
Shell s = new Shell();
Tray tray = d.getSystemTray();
TrayItem ti = new TrayItem(tray, SWT.NONE);
ti.setToolTipText("My Tray");
Image i = new Image(d, "11.jpg");
ti.setImage(i);
i.dispose();
mPop = new Menu(s, SWT.POP_UP);
MenuItem miOpen = new MenuItem(mPop, SWT.NONE);
iOpen.setText("Open");
ti.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event e) {
mPop.setVisible(true);
}
});
ti.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
System.out.println("Selected My Tray");
}
});
…
}
…
}
ii.
运行图:
iii.
说明:
b)
浏览器
i.
代码:
/**
* @author cenyongh@mails.gscas.ac.cn
*/
public class Test4 {
private Browser b = null;
private Text t = null;
…
private void init() {
…
Composite c = new Composite(s, SWT.NONE);
c.setLayout(new GridLayout(2, false));
GridData data2 = new GridData();
data2.widthHint = 60;
Label l = new Label(c, SWT.NONE);
l.setText("Address:");
l.setLayoutData(data2);
data2 = new GridData(GridData.FILL_HORIZONTAL);
t = new Text(c, SWT.BORDER);
t.setLayoutData(data2);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
c.setLayoutData(data);
data = new GridData(GridData.FILL_BOTH);
b = new Browser(s, SWT.BORDER);
b.setLayoutData(data);
t.addKeyListener(new KeyAdapter() {
@Override public void keyPressed(KeyEvent e) {
if (e.character == SWT.CR) {
String url = t.getText();
System.out.println(url);
b.setUrl(url);
}
}
});
…
}
…
}
ii.
运行图:
iii.
说明:
9.
参考资料:
a)
http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html
b)
http://www.cs.umanitoba.ca/~eclipse/