SWT/JFace的基本介紹
1.1 Face與其他圖形界面設(shè)計工具的比較
Java圖形界面實現(xiàn)方式有很多,比如AWT、SWING和SWT等。AWT和SWING不論是在速度上還是美觀上都有很大的不足;對于比較龐大而復(fù)雜的系統(tǒng),用AWT或SWING相很難實現(xiàn),因為運行的速度會相當?shù)穆?/span>SWT直接使用操作系統(tǒng)提供的本地圖形接口,具備本地化的Look & Feel,效率高且美觀。因此,本項目選擇SWT作為圖形界面開發(fā)基礎(chǔ)工具包。
圖2-1為SWT原理圖,圖2-2為JFace原理圖
圖2-1

|
圖2-2

|
SWT把Win32的API簡單的包裝了一下,系統(tǒng)在SWT這一層調(diào)用的方法、傳遞的參數(shù)被原封不動的代理到了Win32層。這是SWT的核心思想。SWT有一個很重要的設(shè)計原則,那就是,SWT的API一對一的封裝OS的API,完全忠實于操作系統(tǒng)的API實現(xiàn)的行為,如果有bug,那也是OS的bug,它不會嘗試去“糾正”操作系統(tǒng),因為那樣會潛在的破壞本地化的一些行為。忠實于OS也使得調(diào)用者不必但心自己的SWT程序會跟OS的本地GUI有不一致的地方。因此,SWT擁有標準的與操作系統(tǒng)相同的外觀,幾乎沒有人能看出你的程序是用Java寫出來的,更為重要的是,其程序運行的效率可以和VC++寫出的程序向媲美,而且開發(fā)的效率也不在AWT/SWING之下。
1.2 如何創(chuàng)建簡單的SWT/JFace程序
1.2.1如何在Eclipse中建立一個SWT/JFace工程
依次File→New→other 就會看到

然后按向?qū)虏僮骷纯尚陆ㄒ粋€SWT/JFace工程,該工程跟其他的Jave工程沒有多大的區(qū)別
1.2.2一個簡單的HelloWorld小例子
publicclass HelloWorld{
publicstaticvoid main(String[] args){
Display display=new Display();
Shell shell=new Shell(display,SWT.V_SCROLL|SWT.SHELL_TRIM);
shell.setText("This is my label");
shell.setBounds(100,100,500,200);
shell.setLayout(new FillLayout());
//Color red=new Color(display,255,0,0);
Label label1=new Label(shell,SWT.CENTER);
label1.setText("Hello word");
label1.setLocation(100,100);
label1.setBackground(new Color(display,0,200,0));
new Label(shell,SWT.CENTER).setText("software college of neu");
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
|
程序的一些解釋:
1. Display類:該類是SWT的基礎(chǔ)類,它負責應(yīng)用程序和本地操作系統(tǒng)之間建立交互。Display類是從Decive繼承而來。
Display繼承關(guān)系圖
2. Shell類:該類是顯示在桌面上的窗口,可以使頂級窗口(Top Level Shells)或者是對話框窗口(Secondary Or Dialog Shells)
3. 設(shè)置消息循環(huán)進行監(jiān)聽,以便監(jiān)聽到界面的操作:
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
|
二. SWT基礎(chǔ)
2.1 SWT基本組件
2.1.1關(guān)于按鈕Button
類型
|
特點
|
創(chuàng)建代碼舉例
|
普通
|
呈突出狀
|
Button bt = new Button(shell,SWT.PUSH)
|
切換
|
單擊后保持按下狀態(tài),再次單擊時恢復(fù)。
|
Button bt = new Button(shell,SWT.TOGGLE)
|
箭頭
|
按鈕帶有小箭頭
|
Button bt = new Button(shell , SWT.ARROW|SWT.UP)向上的箭頭
|
單選
|
同一組只有一個選中
|
Group group = new Group(shell , SWT.SHADOW_ETCHED_OUT)
group.setLayout(new FillLayout(SWT.VERTICAL)
Button bt1 = new Button(group , SWT.RADIO|SWT.LEFT)
Button bt2 = new Button(group, SWT.RADIO|SWT.RIGHT)
bt1.setSelection(true)表示選定該按鈕
|
多選
|
同時可選幾個按鈕
|
Group group = new Group(shell , SWT.SHADOW_ETCHED_OUT)
group.setLayout(new FillLayout(SWT.VERTICAL)
Button bt1 = new Button(group , SWT.CHECK|SWT.LEFT)
Button bt2 = newButton(group, SWT.CHECK|SWT.RIGHT)
bt1.setSelection(true)表示選定該按鈕
|
2.1.2文本框Text
文本框是一個比較常用的組件,文本狂本身就支持復(fù)制,粘貼,刪除等基本的操作。因此這些常用的基本操作不用我們再去設(shè)計。
1.文本框的比較特殊的樣式
樣式常量
|
描述
|
SWT.READ_ONLY
|
只讀文本框
|
SWT.PASSWORD
|
輸入密碼框
|
SWT.MULTI
|
可以輸入多行的文本框
|
SWT.WRAP
|
可以輸入多行并且自動切換
|
SWT.H_SCROLL
|
帶水平滾動條的文本框
|
2.關(guān)于文本框的幾個操作的方法
設(shè)置文字的方向
|
setOrientation(int orientation)
|
SWT.RIGHT_TO_LEFT
則從右往左填充
|
設(shè)置文本輸入字符的格式
|
setEchoChar(char echo)
|
Example:setEchoChar(“*”),輸入時則顯示“*”
|
設(shè)置Tab退格的字符數(shù)
|
setTabs(int tabs)
|
tabs是多大就退幾格
|
全選
|
selectAll()
|
|
取消所有選擇
|
clearSelection()
|
|
將所選的字符復(fù)制到剪貼板
|
copy()
|
|
將所選的字符剪切到剪貼板
|
cut()
|
|
將剪貼板上的字符粘貼到文本框
|
paste()
|
|
2.2面板容器類
2.2.1自定義選項卡CTabFolder
自定義選項卡比TabFolder類的功能強大,我們可以給他添加一些最大化最小化的按鈕,可以做出仿eclipse編輯區(qū)的選項卡;
①. 帶有關(guān)閉的選項卡;初始化時將風(fēng)格設(shè)置為SWT.CLOSE即可;
CTabFolder tabFolder = new CTabFolder(shell,SWT.CLOSE);
②. 帶有最大化最小化按鈕
tabFolder.setMaxmizeVisible(true);//顯示最大化按鈕
tabFolder.setMininizeVisible(true);//顯示最小化按鈕
|
③. 設(shè)置選項卡(選中狀態(tài)標簽)的背景和顏色
l 單一的前景色和背景色
tabFolder.setSelectionForeground(display.getSystemColor(SWT.COLOR_WHITE));
tabFolder.setSelectionBackground(display.getSystemColor(SWT.COLOR_BLUE));
|
l 漸變的背景色
設(shè)置漸變背景的方法是setSelectionBackground(Color[] color, int[] percents)或setSelectionBackground(Color[] color, int[] percents, Boolean vertical),第二個方法的vertical表示是否垂直漸變;
Color[] color = new Color[4];
color[0] = display.getSystemColor(SWT.COLOR_DARK_BLUE);
color[1] = display.getSystemColor(SWT.COLOR_BLUE);
color[2] = display.getSystemColor(SWT.COLOR_WHITE);
color[3] = display.getSystemColor(SWT.COLOR_WHITE);
int[] intArray = newint[]{25, 50, 100};
tabFolder.setSelectionBackground(color,intArray);
|
l 設(shè)置背景圖片,setSelectionBackground(Image image);
④. 最大化最小化按鈕的監(jiān)聽;
添加監(jiān)聽的語句是
tabFolder.addCTabFolder2Listener(new CTabFolder2Adapter(){});
設(shè)置最大化,最小化和還原,實現(xiàn)以下方法
publicvoid mimimize(CTabFolderEvent e){}
publicvoid maximize(CTabFolderEvent e){}
publicvoid restore(CTabFolderEvent e){}
以下是最下化方法的代碼
tabFolder.setMinimized(true);//設(shè)置選項卡為最小化,決定了右上角的按鈕
tabFolder.setLayoutData(new GridData(SWT.FILL, SET.FILL, true, false));//改變布局,呈現(xiàn)最小化狀態(tài)
shell.layout(true);//刷新布局,否則新的布局不能呈現(xiàn)出來
|
⑤. CTabFolder還有許多有用的方法,以上說的基本上可以構(gòu)建出仿eclipse的選項卡了
2.2.2滾動面板ScrolledComposite
對于滾動面板ScrolledComposite,看起來好像很好用,如果對于布局確定的面板來說,實現(xiàn)滾動效果確實比較簡單,但對于一個沒有確定布局的面板(比如一個可以往上面隨意家圖形的畫布),那實現(xiàn)起來就要費一些心思。這里我們要實現(xiàn)一個沒有確定布局的,可以隨意添加圖形的而且要求可以無限變大的面板。
l 首先,我們新建一個ScrolledComposite sc,然后將我們的畫布canvas設(shè)為ScrolldeComposite的內(nèi)容sc.setContent(canvas);為了讓滾動條顯示出來,我們可以canvas設(shè)置一個適當?shù)拇笮?/span>
l 接下來最關(guān)鍵的是如何改變面板的大小,在改變大小之前,我們首先要判斷出面板是否到了邊界,因為這時才需要使面板的大小增大
(sc.getVerticalBar().getSize().y+sc.getVerticalBar().getSelection())
==sc.getVerticalBar().getMaximum())
如果等式成立就說明面板已經(jīng)到了邊界
l 這時只要在監(jiān)聽里重新設(shè)置面板的大小就可以了
2.2.3分割窗框SashForm
關(guān)于分割框的基本知識這里就不再介紹了,在這里主要講述使用分割框和選項卡實現(xiàn)最大化和還原,其實這也很簡單,只要用了setMaximizedControl(Control control)這個方法就可以了。
在我們點擊選項卡的最大化時:
form.setMaximizedControl(folder);
|
在點擊還原是只要form.setMaximizedControl(null);整個面板就會還原到初始的比例