我的JAVA窩! - BlogJava

          SWT/JFace開(kāi)發(fā)入門指南(七)〈轉(zhuǎn)帖〉

          幾種特殊的部件

          好像因?yàn)榇蠹业谋г贡容^多,感覺(jué)這一段 csdn blog 似乎又有恢復(fù)穩(wěn)定的跡象了, ^_^

          前面的兩節(jié)中,我都沒(méi)有作一些詳細(xì)的介紹,而是推薦了兩篇文章給大家,可能你會(huì)覺(jué)得有點(diǎn)不習(xí)慣,不過(guò)我覺(jué)得作為一個(gè)軟件開(kāi)發(fā)者來(lái)說(shuō),最重要的一個(gè)技能就是你要能夠找到自己所需要的資源。而在 swt JFace )開(kāi)發(fā)方面呢,其實(shí)如果你能多看一看 eclipse 的聯(lián)機(jī)幫助和官方網(wǎng)站上的各種文檔的話,對(duì)你的開(kāi)發(fā)一定會(huì)大有幫助。其實(shí)我也都是這樣一步一步慢慢熟悉了的。

          在這一節(jié)中,我要向大家介紹幾種比較特殊的 widget ,包括 Composite , Menu 等。

          Composite

          其實(shí)我們已經(jīng)接觸過(guò) Composite 了,我們前面介紹過(guò) Shell , Shell 就是一種特殊的 Composite 。就如它的名字一樣, Composite 指的是可以嵌套其他部件的一種部件。

          我們先來(lái)看一段代碼,為了看起來(lái)更簡(jiǎn)明,我把 shell 創(chuàng)建之類的代碼都去掉了。

          ????????Composite?composite = new ?Composite(shell,SWT.V_SCROLL);
          ????????composite.setLayout(
          new ?RowLayout(SWT.VERTICAL));
          ????????Text?text
          = new ?Text(composite,SWT.NONE);
          ????????text.setSize(
          100 , 30 );

          代碼段 9

          這段程序意義不大,不過(guò)我們可以看出, Composite 可以作為其他部件的 parent ,可以有自己的 Layout 。

          我們?cè)谄渲卸x composite 的風(fēng)格時(shí)候用到了 SWT.V_SCROLL ,這是用來(lái)做什么的呢?它是用來(lái)定義這個(gè)部件有縱向滾動(dòng)條的。當(dāng)然相應(yīng)當(dāng) SWT.H_SCROLL 就定義了部件有橫向滾動(dòng)條。

          那么什么樣的部件可以有滾動(dòng)條呢?只要是 org.eclipse.swt.widgets.Scrollable 的子類就可以使用這兩個(gè)風(fēng)格定義自己的滾動(dòng)條。這是我們順便提到的一點(diǎn)題外話。

          如果你把上面的程序填充完整運(yùn)行一下的話會(huì)發(fā)現(xiàn)出來(lái)的樣子很難看。因?yàn)?/span> Composite 本身是看不到的。而可以孤零零地看到一個(gè)突出的滾動(dòng)條在那里。所以實(shí)際上單獨(dú)使用 Composite 意義不是很大,我們可以使用它的一些子類。

          打開(kāi) Composite javadoc ,你會(huì)發(fā)現(xiàn)它的子類實(shí)在是太多了。我們只揀兩個(gè)介紹一下, Group TabFolder 。

          比起 Composite 來(lái), Group 有一個(gè)邊框,你可以用 setText 方法設(shè)定它的標(biāo)題。所以這樣在視覺(jué)上會(huì)更好看一些。下面是一個(gè) Group 的圖示:

          11

          另外一種特殊 Composite 就是 TabFolder , TabFolder 允許我們定義標(biāo)簽頁(yè)式的窗體。就像下面圖示的那樣:

          12

          我們?cè)趺丛O(shè)定各個(gè)標(biāo)簽?zāi)兀看鸢甘鞘褂?/span> TabItem ??梢允褂?/span> TabItem setControl 方法設(shè)定標(biāo)簽頁(yè)上的控件。但是這樣又出現(xiàn)了一個(gè)疑問(wèn), setControl 中的參數(shù)不是數(shù)組,如果我們想設(shè)定好幾個(gè)控件應(yīng)該怎么辦呢?這個(gè)時(shí)候就用得上 Composite 了。我們可以首先建一個(gè) Composite 實(shí)例,然后在里面添加控件,再把這個(gè) Composite 實(shí)例本身作為參數(shù)傳遞給 TabItem setControl 方法。

          為了更清楚地說(shuō)明,我們可以看一下下面這段代碼:

          ?1??public?class?TabFolderDemo?{
          ?2?
          ?3?????/**
          ?4??????*?@param?args
          ?5??????*/
          ?6?????public?static?void?main(String[]?args)?{
          ?7?????????Display?display?=?new?Display();
          ?8?
          ?9?????????Shell?shell?=?new?Shell(display,?SWT.DIALOG_TRIM);
          10?????????shell.setLayout(new?RowLayout(SWT.HORIZONTAL));
          11?????????shell.setText("TabFolder?Demo");
          12?
          13?????????TabFolder?tf?=?new?TabFolder(shell,?SWT.NONE);
          14?????????tf.setLayout(new?FillLayout());
          15?????????TabItem?ti?=?new?TabItem(tf,?SWT.NONE);
          16?????????ti.setText("A?Simple?TalItem");
          17?????????Composite?composite?=?new?Composite(tf,?SWT.NONE);
          18?????????composite.setLayout(new?GridLayout(2,?true));
          19?
          20?????????for?(int?i?=?0;?i?<?3;?i++)?{
          21?????????????Label?label?=?new?Label(composite,?SWT.RIGHT);
          22?????????????Text?text?=?new?Text(composite,?SWT.NONE);
          23?????????????label.setText("Text"?+?i?+?":");
          24?
          25?????????}
          26?????????
          27?????????ti.setControl(composite);
          28?????????
          29?????????shell.pack();
          30?????????shell.open();
          31?
          32?????????while?(!shell.isDisposed())?{
          33?????????????if?(!display.readAndDispatch())?{
          34?????????????????display.sleep();
          35?????????????}
          36?????????}
          37?????????display.dispose();
          38?????}
          39?}
          40?

          代碼段 10

          菜單( Menu

          swt 中和菜單相關(guān)的兩個(gè)類是 Menu MenuItem 。顧名思義, Menu 代表的就是整個(gè)菜單,而 MenuItem 是菜單中一項(xiàng)一項(xiàng)的實(shí)體。打個(gè)不恰當(dāng)?shù)谋确絹?lái)說(shuō), Menu 就好比一個(gè)書(shū)架,而 MenuItem 就是書(shū)架上一個(gè)一個(gè)的格子。

          創(chuàng)建菜單

          如果我們要?jiǎng)?chuàng)建一個(gè)菜單,可以根據(jù)下面步驟來(lái)進(jìn)行:

          1. ????? 實(shí)例化一個(gè) Menu 對(duì)象, Menu 有好幾種格式的構(gòu)造函數(shù),你可以選擇一個(gè),比如像這樣:

          ?Menu?menu = new ?Menu(shell,SWT.BAR);

          與其他部件不同的是, Menu 的父控件并不一定需要是 Composite ,而是任何一個(gè) Control 都可以。而 Menu 的風(fēng)格有幾種:

          l ???????? SWT.POP_UP :彈出式菜單

          l ???????? SWT.BAR :程序中的頂級(jí)菜單,比如我們通??吹降陌?/span> 文件,編輯 之類的那個(gè)橫列的菜單欄

          l ???????? SWT.DROP_DOWN :下拉式菜單,比如我們?cè)?/span> Word 點(diǎn)擊 文件 之后出現(xiàn)的子菜單就是一個(gè)典型的下拉式菜單。

          注意 Menu 本身是沒(méi)有 setText 方法的,因?yàn)檫@些具體的顯示屬性你必須在相應(yīng)當(dāng) MenuItem 中設(shè)定。

          2. ????? Menu 添加 MenuItem 對(duì)象,一個(gè) MenuItem 的構(gòu)造函數(shù)如下所示:

          MenuItem(Menu?parent,? int ?style)

          或者是:

          ?MenuItem(Menu?parent,? int ?style,? int ?index)

          其中 parent 就是所屬的 Menu ,而 index 可以看成是排列順序。而 style 可以有以下幾種:

          l ???????? SWT.PUSH :就是一個(gè)普通道菜單項(xiàng),但是這樣的 MenuItem 不能有層疊的下一級(jí)菜單

          l ???????? SWT.CASCADE: 這樣的 MenuItem 可以有層疊的下一級(jí)菜單??梢允褂?/span> MenuItem setMenu 方法設(shè)定它的下一級(jí)菜單,作為參數(shù)的 Menu 風(fēng)格必須是 SWT.DROP_DOWN

          l ???????? SWT. SEPARATOR: 分隔符,也就是一道橫線,這樣的 MenuItem 是沒(méi)有文字的,所以 setText 不起作用。

          l ???????? SWT.CHECK: 菜單項(xiàng)前面有一個(gè)復(fù)選標(biāo)志。

          l ???????? SWT.RADIO: 菜單項(xiàng)前面有單選標(biāo)志。

          下面的圖示說(shuō)明了各種風(fēng)格不同的 Menu MenuItem

          13

          3. ????? 為有下級(jí)菜單的 MenuItem (風(fēng)格必須為 SWT.CASCADE )設(shè)定下級(jí)菜單的 Menu 對(duì)象(用 setMenu 方法),當(dāng)然了,你仍然需要為這個(gè)下一級(jí)的 Menu 設(shè)定其中的 MenuItem

          4. ????? 如果你的菜單風(fēng)格式 SWT.BAR ,你還需要調(diào)用 Shell setMenuBar (參數(shù)就是頂級(jí)菜單)方法設(shè)定窗體菜單。如果是彈出式菜單也就是 SWT.POP_UP ,你需要調(diào)用所在控件的 setMenu 方法設(shè)定彈出菜單為該菜單。

          處理菜單事件

          菜單的事件處理最主要的還是選擇菜單項(xiàng)時(shí)候要進(jìn)行的一些動(dòng)作,我們可以用 SelectionListener 進(jìn)行處理。你也可以為菜單展開(kāi)的事件添加 ArmListener 。

          下面這段簡(jiǎn)單的代碼展示了一個(gè)只有退出程序功能的文件菜單。

          ?1?public?class?MenuDemo?{
          ?2?
          ?3?????private?Shell?_shell;
          ?4?
          ?5?????/**
          ?6??????*?@return?Returns?the?_shell.
          ?7??????*/
          ?8?????public?Shell?getShell()?{
          ?9?????????return?_shell;
          10?????}
          11?
          12?????/**
          13??????*?@param?_shell
          14??????*????????????The?_shell?to?set.
          15??????*/
          16?????public?void?setShell(Shell?shell)?{
          17?????????this._shell?=?shell;
          18?????}
          19?
          20?????public?MenuDemo()?{
          21?????????Display?display?=?new?Display();
          22?????????Shell?shell?=?new?Shell(display,?SWT.SHELL_TRIM);
          23?????????setShell(shell);
          24?????????shell.setLayout(new?RowLayout(SWT.HORIZONTAL));
          25?????????shell.setText("Menu?Demo");
          26?
          27?????????Menu?menubar?=?new?Menu(shell,?SWT.BAR);
          28?????????MenuItem?fileitem?=?new?MenuItem(menubar,?SWT.CASCADE);
          29?????????fileitem.setText("&File");
          30?
          31?????????Menu?filemenu?=?new?Menu(shell,?SWT.DROP_DOWN);
          32?????????fileitem.setMenu(filemenu);
          33?????????MenuItem?exititem?=?new?MenuItem(filemenu,?SWT.PUSH);
          34?????????exititem.setText("&Exit");
          35?????????exititem.addSelectionListener(new?SelectionAdapter()?{
          36?????????????@Override
          37?????????????public?void?widgetSelected(SelectionEvent?arg0)?{
          38?????????????????MessageBox?messagebox?=?new?MessageBox(getShell(),?SWT.YES?|?SWT.NO);
          39?????????????????messagebox.setText("Exit");
          40?????????????????messagebox.setMessage("Exit?the?program?");
          41???????????????
          42?????????????????int?val=messagebox.open();
          43?????????????????if(val?==?SWT.YES)
          44?????????????????{
          45?????????????????????getShell().close();
          46?????????????????}
          47?????????????}
          48?
          49?????????});
          50?????????shell.setMenuBar(menubar);
          51?????????shell.setSize(800,?300);
          52?????????shell.open();
          53?
          54?????????while?(!shell.isDisposed())?{
          55?????????????if?(!display.readAndDispatch())?{
          56?????????????????display.sleep();
          57?????????????}
          58?????????}
          59?????????display.dispose();
          60?????}
          61?
          62?????public?static?void?main(String[]?args)?{
          63?
          64?????????MenuDemo?demo=new?MenuDemo();
          65?????}
          66?
          67?}
          68?

          代碼段 11

          加速鍵

          在使用 MenuItem setText 方法時(shí),可以在希望設(shè)為加速鍵的字母前面標(biāo) & ,比如

          exititem.setText( " &Exit " );

          就標(biāo)明了這個(gè)退出菜單項(xiàng)的加速鍵為 E 。

          另外也可以使用 setAccelerator 方法設(shè)定加速鍵。

          ToolBar CoolBar

          在這里,我要向大家說(shuō)一聲 sorry 了,因?yàn)槲也⒉淮蛩阍谶@里詳細(xì)介紹 Toolbar 的各種用法,這主要有兩個(gè)原因:

          1. ????????? 工具欄的用法和菜單是類似的,菜單是在實(shí)例化一個(gè) Menu 對(duì)象以后添加 MenuItem ,而工具欄則是在實(shí)例化 ToolBar 以后添加 ToolItem (或者實(shí)例化 CoolBar 以后添加 CoolItem )。甚至它們的一些風(fēng)格,事件也很類似。如果你對(duì)照著 ToolBar ToolItem CoolBar,CoolItem )的 API 文檔以及前面我對(duì)菜單用法的介紹看到話,很快就能比較熟悉工具條的用法。

          2. ????????? 我們?cè)诤竺娼榻B JFace 的時(shí)候,你會(huì)發(fā)現(xiàn)有更簡(jiǎn)單的辦法創(chuàng)建菜單和工具條。

          小結(jié)

          這一節(jié)介紹了幾種有限的部件,關(guān)于 swt 的介紹到這一節(jié)為止就暫時(shí)告一段落了。在以后的部分我會(huì)開(kāi)始給大家介紹 JFace 。當(dāng)然了,這并不意味著以后再也沒(méi)有 swt 的內(nèi)容介紹給大家了,只是我覺(jué)得到現(xiàn)在為止,大家應(yīng)該已經(jīng)可以寫一些簡(jiǎn)單的 swt 程序了,我如果再多介紹,就類似于對(duì) API 文檔的翻譯了。當(dāng)然如果以后有充足的時(shí)間的話,我也希望能夠向大家多介紹一些相關(guān)的內(nèi)容。

          posted on 2006-12-18 00:22 J2S 閱讀(248) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆檔案

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 射洪县| 祥云县| 同德县| 明星| 岳池县| 探索| 光泽县| 蓝田县| 乌拉特前旗| 南宫市| 阿荣旗| 广平县| 剑河县| 荔浦县| 贡觉县| 鄢陵县| 新巴尔虎左旗| 顺昌县| 贺兰县| 惠水县| 宿州市| 勐海县| 定陶县| 荔波县| 唐海县| 洛阳市| 平乐县| 遵化市| 临泉县| 社旗县| 麻栗坡县| 裕民县| 星座| 康保县| 香河县| 昭苏县| 什邡市| 即墨市| 满洲里市| 木兰县| 安图县|