我的JAVA窩! - BlogJava

          SWT/JFace開發入門指南(九)〈轉帖〉

          JFace Hello,world

          我們仍然是從一個最簡單的 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 程序中,我們需要自己創建 Display ,自己創建 Shell ,但是在這里,我們只需要:

          創建一個繼承自 Window org.eclipse.jface.window.Window )的類

          在這個類的 createContents 方法中為窗口添加部件

          將這個對象的 blockOnOpen 屬性設定為 true ,這個屬性的含義就和它的名字一樣,窗口會一直保持打開的狀態(接收各種事件)直到被關閉。

          調用這個對象的 open 方法即打開了窗口

          由于設定了 blockOnOpen ,窗口會保持接受各種事件,知道用戶(或者程序)關閉了它。

          在關閉以后,程序繼續向下運行,我們需要將資源釋放掉,所以有了這樣一句話:

          Display.getCurrent().dispose();

          其中 Display.getCurrent() 得到了程序的 display 對象,并進而調用 dispost() 方法釋放了各種資源。

          其實這也是我們寫一個 JFace 程序一般的步驟,當然我們可能還會添加事件處理之類,但是大體上都是這樣的。

          因為這個程序運行的結果其實和我們以前 swt Hello,world! 是一樣的,所以在這里我也不再貼圖了。大家可以自己運行看一下。

          Window ApplicationWindow Dialog

          關于 Window Q&A

          JFace 中的 Window 就是一個窗口。我們知道在 swt 中窗口是用 Shell 表示的,而 JFace 中的 Window 其實也可以看作是對于 Shell 的一種封裝。

          org.eclipse.jface.window.Window 中,有幾個方法需要我們注意,為了更加突出各自的功能,我把這些介紹寫成 Q&A 的形式:

          Q :如何為窗體添加各種功能部件?

          A 方法就是重載 createContents 方法,這個方法中我們可以給窗體中創建一些子部件,比如 Text,Lable,Composite 之類,在前面的 demo 中我們是只創建了一個文本框。

          Q :如何定義窗體的風格?

          A 可以通過調用 setShellStyle 方法來設定窗體的風格,比如如果我們在前面程序的 main 函數中添加這樣一句話(在 demo.open(); 之前):

          demo.setShellStyle(SWT.DIALOG_TRIM);

          那么出現的就是一個對話框風格的窗體。

          Q: 如何定義窗體的 Layout ,標題等屬性

          A 可以通過重載 configureShell 方法實現,比如下面這樣一段程序:

          @Override
          ????
          protected ? void ?configureShell(Shell?shell)?{
          ????????
          ??????shell.setText(
          " JFace?Window " );
          ??????shell.setLayout(
          new ?RowLayout(SWT.VERTICAL));
          ????}

          就設定了窗口標題為“ JFace Window ”, Layout 也設定為 RowLayout

          默認窗體的 Layout GridLayout

          這個簡短的 Q&A 就到這里為止。對于 Window 的介紹也到這里告一段落,下面我們簡單地看一下 Window 的兩個子類: ApplicationWindow org.eclipse.jface.window.ApplicationWindow )和 Dialog org.eclipse.jface.dialogs.Dialog

          ApplicationWindow

          ApplicationWindow 除了具有 Window 的特性以外,還允許我們方面地添加菜單,工具條( Toolbar 或者 Coolbar ),狀態條之類的。關于這方面的特性我會在后面的文章中做單獨介紹,這里就不再贅述了。

          對話框

          JFace 中的 Dialog 是一個抽象類,所以你必須使用它的子類或者自己寫一個它的子類。當然了,實際上你根本沒有必要去自己繼承。

          離題萬里: swt 中的 MessageBox

          關于對話框,首先我要給大家介紹的卻是一個 swt 中的 MessageBox org.eclipse.swt.widgets.MessageBox )。實際上,如果你看過這個系列文章中介紹 swt 事件模式的內容的話,可能早就注意到我在里面使用過 MessageBox 了。

          Swt 中的 MessageBox 允許我們通過指定風格來改變對話框的外觀,比如如果對話框的風格中包含 SWT.OK ,它就會有一個確定按鈕;如果包含 SWT.CANCEL ,就會有一個取消按鈕,如果包含 ICON_QUESTION 那么彈出的對話框就有一個問號圖標,等等吧。

          比如我們看下面這段程序:

          ??????MessageBox?dialog = new ?MessageBox(shell,SWT.OK | SWT.ICON_INFORMATION);
          ??????dialog.setText(
          " Hello " );
          ??????dialog.setMessage(
          " Hello,world! " );
          ??????dialog.open();

          代碼段 13

          這里我們從構造函數的 style 參數可以看出,這是一個帶有信息圖標(一個感嘆號)和一個確定按鈕的對話框。具體圖示見下面:

          ?14

          對比: JFace 中的 MessageDialog

          前面一小節中,我簡單介紹了一下 swt 中的 MessageBox 。在 JFace 中,我們使用 MessageDialog org.eclipse.jface.dialogs.MessageDialog )來實現類似的功能。

          如果要實現我們在上面所演示的那樣一個帶信息提示和確定按鈕的對話框,我們只需要這樣寫:

          MessageDialog.openInformation(shell, " Hello " , " Hello,world " );

          運行出來以后,對話框的大小可能和 swt 中的有一些區別。不過這樣是不是很方便呢?其實 JFace 能做的事情通過 swt 編程也都可以做到,不過一般說來, JFace 都簡化了編程。

          MessageDialog 中,類似于 openXxxx 靜態方法還有好幾個,比如:

          openWarning :打開一個帶警告圖標的對話框

          openConfirm :打開一個只有確定和取消按鈕的對話框

          不過你也許注意到了,這些靜態方法返回類型都不一樣,有的是 void, 有的是 boolean ,這些返回值(如果有的話)就反應了用戶選擇了哪個按鈕。比如 openConfirm ,如果按了確定,那么返回的就是 true

          輸入框: InputDialog

          相對來說,輸入對話框的用法可能會比較負責一些,你必須 InputDialog 對象,然后調用它的 open 方法打開對話框,獲得這個方法的返回值(以確定用戶是點擊了確定還是取消)。然后再通過 getValue() 方法獲得用戶的輸入。

          為了更加形象,我們舉一個例子。我們還是用前面的 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

          運行之后,界面如下面圖示:

          15

          如果按了確定的話,控制臺會顯示你輸入的信息

          小結

          因為前一段有些事情,所以都一直沒有來得及寫這個系列的文章。今天貼出的這篇文章中,通過一個簡單程序演示了一個 JFace 程序的基本寫法,同時也順便提了一下 Window 和它的兩個子類。關于對話框我只向大家介紹了兩種最常用的,其實還是有很多的,這需要大家在實踐中不斷探索。

          posted on 2006-12-18 00:24 J2S 閱讀(273) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆檔案

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 游戏| 灵山县| 枣阳市| 盐亭县| 寿宁县| 三原县| 花莲市| 平遥县| 香港 | 丽水市| 卓尼县| 云龙县| 邹城市| 蛟河市| 青铜峡市| 东乡县| 廊坊市| 蓝山县| 中阳县| 东山县| 拉萨市| 乌兰县| 绥中县| 贺州市| 长子县| 闵行区| 德保县| 乌兰县| 民丰县| 凤庆县| 乳源| 宽城| 彭山县| 聂荣县| 汉寿县| 喀喇沁旗| 高清| 彭州市| 宜阳县| 宁安市| 皮山县|