JFace
的
Hello,world
!
我們?nèi)匀皇菑囊粋€(gè)最簡單的
Hello,world!
開始介紹
JFace
。為了更形象一些,首先把程序列出來:
?1?
?2?public?class?HelloJface?extends?Window?{
?3?
?4?????public?HelloJface(Shell?arg0)?{
?5?????????super(arg0);
?6?????}
?7???????@Override
?8?????protected?Control?createContents(Composite?parent)?{
?9?????????Text?text?=?new?Text(parent,?SWT.NONE);
10?????????text.setText("Hello,world!");
11?????????return?parent;
12?
13?????}
14?????/**
15??????*?@param?args
16??????*/
17?????public?static?void?main(String[]?args)?{
18?
19?????????HelloJface?demo?=?new?HelloJface(null);
20?????????demo.setBlockOnOpen(true);
21?????????demo.open();
22?????????Display.getCurrent().dispose();
23?
24?????}
25?}
26?
代碼段12
首先我們從這段代碼來看一下使用
JFace
和單純地使用
swt
寫程序有什么不一樣:
在
swt
程序中,我們需要自己創(chuàng)建
Display
,自己創(chuàng)建
Shell
,但是在這里,我們只需要:
創(chuàng)建一個(gè)繼承自
Window
(
org.eclipse.jface.window.Window
)的類
在這個(gè)類的
createContents
方法中為窗口添加部件
將這個(gè)對象的
blockOnOpen
屬性設(shè)定為
true
,這個(gè)屬性的含義就和它的名字一樣,窗口會一直保持打開的狀態(tài)(接收各種事件)直到被關(guān)閉。
調(diào)用這個(gè)對象的
open
方法即打開了窗口
由于設(shè)定了
blockOnOpen
,窗口會保持接受各種事件,知道用戶(或者程序)關(guān)閉了它。
在關(guān)閉以后,程序繼續(xù)向下運(yùn)行,我們需要將資源釋放掉,所以有了這樣一句話:
Display.getCurrent().dispose();
其中
Display.getCurrent()
得到了程序的
display
對象,并進(jìn)而調(diào)用
dispost()
方法釋放了各種資源。
其實(shí)這也是我們寫一個(gè)
JFace
程序一般的步驟,當(dāng)然我們可能還會添加事件處理之類,但是大體上都是這樣的。
因?yàn)檫@個(gè)程序運(yùn)行的結(jié)果其實(shí)和我們以前
swt
的
Hello,world!
是一樣的,所以在這里我也不再貼圖了。大家可以自己運(yùn)行看一下。
Window
,
ApplicationWindow
,
Dialog
關(guān)于
Window
的
Q&A
JFace
中的
Window
就是一個(gè)窗口。我們知道在
swt
中窗口是用
Shell
表示的,而
JFace
中的
Window
其實(shí)也可以看作是對于
Shell
的一種封裝。
在
org.eclipse.jface.window.Window
中,有幾個(gè)方法需要我們注意,為了更加突出各自的功能,我把這些介紹寫成
Q&A
的形式:
Q
:如何為窗體添加各種功能部件?
A
:
方法就是重載
createContents
方法,這個(gè)方法中我們可以給窗體中創(chuàng)建一些子部件,比如
Text,Lable,Composite
之類,在前面的
demo
中我們是只創(chuàng)建了一個(gè)文本框。
Q
:如何定義窗體的風(fēng)格?
A
:
可以通過調(diào)用
setShellStyle
方法來設(shè)定窗體的風(fēng)格,比如如果我們在前面程序的
main
函數(shù)中添加這樣一句話(在
demo.open();
之前):
demo.setShellStyle(SWT.DIALOG_TRIM);
那么出現(xiàn)的就是一個(gè)對話框風(fēng)格的窗體。
Q:
如何定義窗體的
Layout
,標(biāo)題等屬性
A
:
可以通過重載
configureShell
方法實(shí)現(xiàn),比如下面這樣一段程序:
@Override
????
protected
?
void
?configureShell(Shell?shell)?{
????????
??????shell.setText(
"
JFace?Window
"
);
??????shell.setLayout(
new
?RowLayout(SWT.VERTICAL));
????}
就設(shè)定了窗口標(biāo)題為“
JFace Window
”,
Layout
也設(shè)定為
RowLayout
。
默認(rèn)窗體的
Layout
為
GridLayout
。
這個(gè)簡短的
Q&A
就到這里為止。對于
Window
的介紹也到這里告一段落,下面我們簡單地看一下
Window
的兩個(gè)子類:
ApplicationWindow
(
org.eclipse.jface.window.ApplicationWindow
)和
Dialog
(
org.eclipse.jface.dialogs.Dialog
)
ApplicationWindow
ApplicationWindow
除了具有
Window
的特性以外,還允許我們方面地添加菜單,工具條(
Toolbar
或者
Coolbar
),狀態(tài)條之類的。關(guān)于這方面的特性我會在后面的文章中做單獨(dú)介紹,這里就不再贅述了。
對話框
JFace
中的
Dialog
是一個(gè)抽象類,所以你必須使用它的子類或者自己寫一個(gè)它的子類。當(dāng)然了,實(shí)際上你根本沒有必要去自己繼承。
離題萬里:
swt
中的
MessageBox
關(guān)于對話框,首先我要給大家介紹的卻是一個(gè)
swt
中的
MessageBox
(
org.eclipse.swt.widgets.MessageBox
)。實(shí)際上,如果你看過這個(gè)系列文章中介紹
swt
事件模式的內(nèi)容的話,可能早就注意到我在里面使用過
MessageBox
了。
Swt
中的
MessageBox
允許我們通過指定風(fēng)格來改變對話框的外觀,比如如果對話框的風(fēng)格中包含
SWT.OK
,它就會有一個(gè)確定按鈕;如果包含
SWT.CANCEL
,就會有一個(gè)取消按鈕,如果包含
ICON_QUESTION
那么彈出的對話框就有一個(gè)問號圖標(biāo),等等吧。
比如我們看下面這段程序:
??????MessageBox?dialog
=
new
?MessageBox(shell,SWT.OK
|
SWT.ICON_INFORMATION);
??????dialog.setText(
"
Hello
"
);
??????dialog.setMessage(
"
Hello,world!
"
);
??????dialog.open();
代碼段
13
這里我們從構(gòu)造函數(shù)的
style
參數(shù)可以看出,這是一個(gè)帶有信息圖標(biāo)(一個(gè)感嘆號)和一個(gè)確定按鈕的對話框。具體圖示見下面:
圖
?14
對比:
JFace
中的
MessageDialog
前面一小節(jié)中,我簡單介紹了一下
swt
中的
MessageBox
。在
JFace
中,我們使用
MessageDialog
(
org.eclipse.jface.dialogs.MessageDialog
)來實(shí)現(xiàn)類似的功能。
如果要實(shí)現(xiàn)我們在上面所演示的那樣一個(gè)帶信息提示和確定按鈕的對話框,我們只需要這樣寫:
MessageDialog.openInformation(shell,
"
Hello
"
,
"
Hello,world
"
);
運(yùn)行出來以后,對話框的大小可能和
swt
中的有一些區(qū)別。不過這樣是不是很方便呢?其實(shí)
JFace
能做的事情通過
swt
編程也都可以做到,不過一般說來,
JFace
都簡化了編程。
在
MessageDialog
中,類似于
openXxxx
的靜態(tài)方法還有好幾個(gè),比如:
openWarning
:打開一個(gè)帶警告圖標(biāo)的對話框
openConfirm
:打開一個(gè)只有確定和取消按鈕的對話框
…
不過你也許注意到了,這些靜態(tài)方法返回類型都不一樣,有的是
void,
有的是
boolean
,這些返回值(如果有的話)就反應(yīng)了用戶選擇了哪個(gè)按鈕。比如
openConfirm
,如果按了確定,那么返回的就是
true
。
輸入框:
InputDialog
相對來說,輸入對話框的用法可能會比較負(fù)責(zé)一些,你必須
InputDialog
對象,然后調(diào)用它的
open
方法打開對話框,獲得這個(gè)方法的返回值(以確定用戶是點(diǎn)擊了確定還是取消)。然后再通過
getValue()
方法獲得用戶的輸入。
為了更加形象,我們舉一個(gè)例子。我們還是用前面的
Hello,world!
程序,不過把它的
createContents
方法改成下面一段代碼:
?1?@Override
?2?????protected?Control?createContents(final?Composite?parent)?{
?3?????????Button?button?=?new?Button(parent,?SWT.NONE);
?4?????????button.setText("Click?me!");
?5?????????button.addSelectionListener(new?SelectionAdapter()?{
?6?????????????@Override
?7?????????????public?void?widgetSelected(SelectionEvent?arg0)?{
?8?
?9?????????????????InputDialog?input?=?new?InputDialog(parent.getShell(),
10?????????????????????????"Input?Dialog?Title",?"Please?input?some?string?here:",
11?????????????????????????"initial?value",?null);
12?????????????????if(input.open()==?Window.OK)
13?????????????????{
14?????????????????????System.out.println(input.getValue());
15?????????????????}
16?????????????}
17?
18?????????});
19?????????return?parent;
20?????}
21?
代碼段
14
運(yùn)行之后,界面如下面圖示:
圖
15
如果按了確定的話,控制臺會顯示你輸入的信息
小結(jié)
因?yàn)榍耙欢斡行┦虑椋远家恢睕]有來得及寫這個(gè)系列的文章。今天貼出的這篇文章中,通過一個(gè)簡單程序演示了一個(gè)
JFace
程序的基本寫法,同時(shí)也順便提了一下
Window
和它的兩個(gè)子類。關(guān)于對話框我只向大家介紹了兩種最常用的,其實(shí)還是有很多的,這需要大家在實(shí)踐中不斷探索。