本篇主要介紹如何在SWT下構建一個應用,如何安裝SWT Designer並破解已進行SWT的可視化編程,Display以及Shell爲什麼物、有何用,SWT中的經常使用組件、面板容器以及事件模型等。html
1.可視化環境搭建(SWT Designer):shell
(1).首先下載SWT Designer插件包SWT Designer 6.9.5 for Eclipse.rar;編程
(2).將解壓好的插件包extplugins\swt\eclipse下的features和plugins導入Myeclipse的dropins文件夾下數組
SWT Designer 6.9.5 for Eclipse.rar:微信
Myeclipse的dropins:app
(3).下載個註冊機,激活所有可視化編程控件的使用(不然只能使用部分控件)eclipse
2.Display和Shellide
編寫swt程序的步驟,這些步驟是:函數
(1). 建立一個Display對象佈局
(2). 建立一個或者多個Shell對象,你能夠認爲Shell表明了程序的窗口。
(3). 在Shell內建立各類部件(widget)
(4). 對各個部件進行初始化(外觀,狀態等),同時爲各類部件的事件建立監聽器(listener)
(5). 調用Shell對象的open()方法以顯示窗體
(6). 各類事件進行監聽並處理,直到程序發出退出消息
(7). 調用Display對象的dispose()方法以結束程序。
舉例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
class
TestText {
public
static
void
main(String[] args) {
Display display =
new
Display();
// 建立一個display對象。
Shell shell =
new
Shell(display);
// shell是程序的主窗體
shell.setText(
"文本框示例"
);
Text text1 =
new
Text(shell, SWT.NONE | SWT.BORDER);
// 帶邊框
text1.setBounds(
10
,
10
,
70
,
30
);
Text text2 =
new
Text(shell, SWT.PASSWORD);
text2.setBounds(
90
,
10
,
70
,
30
);
Text text3 =
new
Text(shell, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
text3.setBounds(
10
,
50
,
70
,
70
);
Text text4 =
new
Text(shell, SWT.WRAP | SWT.V_SCROLL);
text4.setBounds(
90
,
50
,
70
,
70
);
shell.pack();
shell.open();
while
(!shell.isDisposed()) {
// 若是主窗體沒有關閉則一直循環
if
(!display.readAndDispatch()) {
// 若是display不忙
display.sleep();
// 休眠
}
}
display.dispose();
// 銷燬display
}
}
|
Display是SWT的基礎類,負責在應用程序和本地操做系統之間創建交互;
通常一個應用程序只要一個Display便可,其用於啓動一個專有的線程,將執行事件循環,而且保持UI線程。
經常使用方法:getShells、getPrimaryMonitor等。
Shell是顯示在桌面上的窗口。能夠是頂級窗口或是對話框。
樣式的調整經過構造函數進行設置,好比:Shell shell = new Shell(display, SWT.CLOSE)設置成只顯示關閉標誌的Shell窗口。
若是要使用多個樣式,則須要可使用「|」運算符進行疊加。
shell的繼承關係:
一個應用程序中能夠建立一個或多個Shell
3.基本組件介紹
Widget:窗口小部件,Widget類是各類用戶界面元素如按鈕、列表、數和菜單整個繼承體系的父類,抽象類
Controls和Composites:在SWT中,操做系統控件被定義爲抽象類Control的子類,如Button類,Text類等都是Control的子類。
每一個控件都會有本身的父部件,這個父部件能夠是Composite類或它的子類,shell也是Composite的子類。
SWT中控件體系的繼承關係爲:
Button:Button分爲普通按鈕(SWT.PUSH)、單選按鈕(SWT.RADIO)、多選按鈕(SWT.CHECK)、箭頭按鈕(SWT.ARROW)和切換按鈕(SWT.TOGGLE)
其樣式包括居中、居左等。
經常使用方法:setText、getSelect等
Label:分爲文本標籤(SWT.NONE)、分割線標籤(SWT.SEPARATOR)
Text(文本框):單行、多行、包裹
其方法有:選中全部字符selectAll、顯示設置的選取文本showSelection、取消全部選擇clearSelection、將選取的字符串複製到剪貼板copy等
List(列表框):SWT.SINGLE(默認只能選中一個)、SWT.MULTI(能夠選擇多行)
其方法有:添加選項add(String string)、remove(int index)刪除選項
Combo(組合框):下拉框
4.面板容器類
Composite(面板類):composite類繼承關係
Group(分組框):分組框是可以顯示標題分組的面板類
TabFolder(選項卡):一個TabFolder與多個TabItem進行對應
經常使用方法:得到選項卡數組getItems()、得到當前選中的選項卡getSelection()等
CTabFolder(自定義選項卡):功能與TabFolder相似,可是樣式更加豐富,如:
1 | final CTabFolder tabFolder = newCTabFolder(shell, SWT.CLOSE); |
能夠在每一個TabItem上顯示關閉窗口。
SashForm(分割窗框):能夠將屏幕的區域分紅幾部分,並能夠經過拖動窗框改變窗口的大小。
CBanner(自動以分割框):SashForm的變體,有3個控件,分別放在窗口的左側(left)、右側(right)、底部(bottom)。
ScrolledComposite(滾動面板)。
5.佈局管理器
絕對定位:setBounds(int x, int y, int width, int height)
託管定位:
FillLayout(充滿時佈局):組件大小相同,不能調節
RowLayout(行列式佈局):能夠調整邊距,不會等寬顯示組件,能夠折行,設置控件大小RowData
GridLayout(網格式佈局):設置單個控件的大小,使用GridData進行定製控件顯示
FormLayout(表格式佈局):使用FormData和FormAttachment定製控件顯示
StackLayout(堆棧式佈局)
6.事件模型
監聽器(Listener):接收事件發生的對象,負責處理事件到達後響應事件的代碼。監聽器對應是一個接口,要響應一個事件就要實現該接口中的方法。監聽器類的形式爲XXXListener,XXX標示某一類型的監聽器。
Event(事件):當一個事件到達事件監聽對象時,要攜帶一些該事件所附加的一些信息。
註冊監聽器
適配器(這些都是基本概念,不瞭解的能夠百度^_^)
鍵盤事件:e.character(表示輸入字符的Unicode編碼)、e.keyCode(按鍵所對應的ASCII代碼)、e.doit(是否繼續執行此事件,設置爲false,則取消該事件)、e.stateMask(按下其餘鍵的同時所使用的輔助鍵)
鍵盤事件舉例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
public
class
TestKeyListener {
protected
Shell shell;
/**
* Launch the application
* @param args
*/
public
static
void
main(String[] args) {
try
{
TestKeyListener window =
new
TestKeyListener();
window.open();
}
catch
(Exception e) {
e.printStackTrace();
}
}
/**
* Open the window
*/
public
void
open() {
final
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while
(!shell.isDisposed()) {
if
(!display.readAndDispatch())
display.sleep();
}
}
/**
* Create contents of the window
*/
protected
void
createContents() {
shell =
new
Shell();
shell.setSize(
500
,
375
);
shell.setText(
"SWT Application"
);
Button b =
new
Button(shell, SWT.PUSH|SWT.WRAP);
b.setText(
"有本事,來點我"
);
b.setBounds(
5
,
5
,
80
,
30
);
b.addKeyListener(
new
KeyListener() {
@Override
public
void
keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public
void
keyPressed(KeyEvent arg0) {
Control control = (Control)arg0.widget;
Rectangle bounds = control.getBounds();
int
bits = SWT.SHIFT|SWT.ALT|SWT.CTRL;
if
((arg0.stateMask & bits)!=
0
){
arg0.doit =
false
;
//取消該事件
return
;
}
if
(arg0.keyCode == SWT.ARROW_DOWN)
bounds.y++;
else
if
(arg0.keyCode == SWT.ARROW_UP)
bounds.y--;
else
if
(arg0.keyCode == SWT.ARROW_LEFT)
bounds.x--;
else
if
(arg0.keyCode == SWT.ARROW_RIGHT)
bounds.x++;
if
(arg0.character ==
'a'
){
System.out.println(
"您按下的是a鍵"
);
}
control.setBounds(bounds);
}
});
//
}
}
|
鼠標事件:MouseEvent(雙擊)、MouseMoveEvent(移動)、MouseTrackEvent(跟蹤)
鼠標監聽事件舉例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
package
com.cntrust.test.events;
import
org.eclipse.swt.SWT;
import
org.eclipse.swt.events.MouseEvent;
import
org.eclipse.swt.events.MouseListener;
import
org.eclipse.swt.events.MouseMoveListener;
import
org.eclipse.swt.events.MouseTrackListener;
import
org.eclipse.swt.graphics.Point;
import
org.eclipse.swt.graphics.Rectangle;
import
org.eclipse.swt.widgets.Button;
import
org.eclipse.swt.widgets.Control;
import
org.eclipse.swt.widgets.Display;
import
org.eclipse.swt.widgets.Shell;
public
class
TestMouseListener {
protected
Shell shell;
public
Button b ;
public
Shell getShell() {
return
shell;
}
public
void
setShell(Shell shell) {
this
.shell = shell;
}
public
Button getB() {
return
b;
}
public
void
setB(Button b) {
this
.b = b;
}
public
MyMouseListener getMml() {
return
mml;
}
public
void
setMml(MyMouseListener mml) {
this
.mml = mml;
}
public
static
MyMouseListener mml ;
/**
* Launch the application
* @param args
*/
public
static
void
main(String[] args) {
try
{
TestMouseListener window =
new
TestMouseListener();
window.open();
}
catch
(Exception e) {
e.printStackTrace();
}
}
/**
* Open the window
*/
public
void
open() {
final
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while
(!shell.isDisposed()) {
if
(!display.readAndDispatch())
display.sleep();
}
}
/**
* Create contents of the window
*/
protected
void
createContents() {
shell =
new
Shell();
shell.setSize(
500
,
375
);
shell.setText(
"SWT Application"
);
b =
new
Button(shell, SWT.PUSH);
b.setBounds(
10
,
10
,
80
,
30
);
b.setText(
"來,拖我一把"
);
mml =
new
MyMouseListener();
b.addMouseListener(mml);
b.addMouseTrackListener(mml);
//
}
public
class
MyMouseListener
implements
MouseMoveListener, MouseListener, MouseTrackListener{
@Override
public
void
mouseMove(MouseEvent arg0) {
Point point = Display.getCurrent().map(b, shell, arg0.x-
10
, arg0.y-
10
);
Rectangle bounds = b.getBounds();
b.setBounds(point.x, point.y, bounds.width, bounds.height);
}
@Override
public
void
mouseDoubleClick(MouseEvent arg0) {
}
@Override
public
void
mouseDown(MouseEvent arg0) {
b.addMouseMoveListener(mml);
}
@Override
public
void
mouseUp(MouseEvent arg0) {
b.removeMouseMoveListener(mml);
}
@Override
public
void
mouseEnter(MouseEvent arg0) {
}
@Override
public
void
mouseExit(MouseEvent arg0) {
}
@Override
public
void
mouseHover(MouseEvent arg0) {
}
}
}
|
若是以爲有用,歡迎點贊,可誠邀可視化朋友加入羣227963113^_^
本文連接《可視化(番外篇)——SWT總結》
友情贊助
若是你以爲博主的文章對你那麼一點小幫助,恰巧你又有想打賞博主的小衝動,那麼事不宜遲,趕忙掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。
1. 支付寶 2. 微信