麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)

2019-11-18 13:03:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  簡(jiǎn)介
  開放源碼 Eclipse 項(xiàng)目是 java 領(lǐng)域中最有趣的新近開發(fā)項(xiàng)目之一。Eclipse 把自己描述成“一種通用的工具平臺(tái) — 開放的可擴(kuò)展 IDE,可用于任何用途且沒(méi)有非凡之處”。它的兩個(gè)主要組件是名為 SWT 的圖形庫(kù)和與其匹配的名為 JFace 的實(shí)用程序框架。
  
  SWT 是一個(gè)窗口構(gòu)件集和圖形庫(kù),它集成于本機(jī)窗口系統(tǒng)但有獨(dú)立于 OS 的 API。
  
  JFace 是用 SWT 實(shí)現(xiàn)的 UI 工具箱,它簡(jiǎn)化了常見(jiàn)的 UI 編程任務(wù)。JFace 在其 API 和實(shí)現(xiàn)方面都是獨(dú)立于窗口系統(tǒng)的,它旨在使用 SWT 而不隱藏它。圖 1 演示了 Eclipse、JFace 和 SWT 之間的關(guān)系。
  
 用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)(圖一)

  
圖 1. Eclipse Workbench、JFace 和 SWT

  
  Hello, World
  
  讓我們從我能想到的最簡(jiǎn)單的 JFace 程序開始,逐步擴(kuò)充它,將其構(gòu)建為最常見(jiàn)的“Hello, World”程序。
  
  清單 1. Hello(版本 1)
  
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.widgets.*;
  public class Hello
  {
  public static void main(String[] args)
  {
  applicationWindow w = new ApplicationWindow(null);
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  這里我們創(chuàng)建了一個(gè)名為 Hello 的類,其中 main 方法僅僅創(chuàng)建了一個(gè) ApplicationWindow,然后打開它。setBlockOnOpen() 使 open() 阻塞,直到窗口關(guān)閉為止。在窗口已關(guān)閉之后,我們獲取當(dāng)前的 Display 并除去它。這會(huì)釋放在操作系統(tǒng)中用到的資源。當(dāng)您運(yùn)行該程序時(shí),您會(huì)看到類似圖 2 的窗口:
  
 用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)(圖二)

  
圖 2. Hello(版本 2)

  
  就是如此。它甚至沒(méi)有說(shuō)“Hello, World”。在修正它之前,讓我們把話題轉(zhuǎn)到 JFace 窗口。
  
  JFace 應(yīng)用程序窗口
  窗口是頂級(jí)窗口(換句話說(shuō),由 OS 窗口治理器治理的窗口)的 JFace 類。JFace 窗口實(shí)際上不是頂級(jí)窗口的 GUI 對(duì)象(SWT 已經(jīng)提供了一個(gè),名為 Shell)。相反,JFace 窗口是助手對(duì)象,它知道對(duì)應(yīng)的 SWT Shell 對(duì)象,并提供代碼來(lái)幫助創(chuàng)建/編輯它,以及偵聽(tīng)它的事件等。圖 3 演示了您的代碼、JFace 和 SWT 之間的關(guān)系。
  
 用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)(圖三)

  
圖 3. 您的代碼、JFace Window 和 SWT Shell 之間的關(guān)系

  
  事實(shí)上,這一模型是理解 JFace 如何工作的要害。它并不真的是 SWT 之上的層,而且它沒(méi)有試圖向您隱藏 SWT。相反,JFace 意識(shí)到有幾種使用 SWT 的常用模式,而且它提供了一些實(shí)用程序代碼,以幫助您更方便地對(duì)這些模式編程。為了做到這一點(diǎn),JFace 提供可使用的對(duì)象,或提供可將其子類化的類(有時(shí)它兩者都提供)。
  
  盡管我們僅僅直接使用了一個(gè) ApplicationWindow,但實(shí)際上它們被設(shè)計(jì)為可以子類化也可以加入特定行為。它們有現(xiàn)成的菜單欄、工具欄、供您插入特定于應(yīng)用程序的內(nèi)容的區(qū)域和狀態(tài)欄 — 全都是可選的。圖 4 用 JFace File EXPlorer 示例本身演示了這些區(qū)域。
  
 用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)(圖四)

  
圖 4. 應(yīng)用程序窗口的各個(gè)部分

  
  讓我們改進(jìn) Hello,使它成為 ApplicationWindow 的子類。更改的行在清單 2 中突出顯示。
  
  清單 2. Hello(版本 2)
  
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.widgets.*;
  public class Hello extends ApplicationWindow
  {
  public Hello()
  {
  super(null);
  }
  public static void main(String[] args)
  {
  Hello w = new Hello();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  您編寫的構(gòu)造函數(shù)必須調(diào)用超類構(gòu)造函數(shù)(如往常一樣)。讓我們暫時(shí)不考慮該構(gòu)造函數(shù)的參數(shù)。運(yùn)行該程序的結(jié)果與前一個(gè)程序沒(méi)有任何不同。缺省情況下,程序不會(huì)為我們顯示任何裝飾性的東西。我們的程序要?jiǎng)?chuàng)建一個(gè)帶有文本“Hello, World”的按鈕。這個(gè)按鈕要顯示在內(nèi)容(Contents)區(qū)域。要做到這一點(diǎn),我們必須實(shí)現(xiàn) Control createContents(Composite parent) 方法。
  
  ApplicationWindow 將在所有其它窗口構(gòu)件已經(jīng)創(chuàng)建之后但窗口在屏幕上顯示之前調(diào)用該方法。參數(shù) parent 是代表內(nèi)容區(qū)域的復(fù)合窗口構(gòu)件。這里的想法是您創(chuàng)建一個(gè)復(fù)合窗口構(gòu)件,將其添加到 parent,然后添加您的窗口構(gòu)件,并返回您創(chuàng)建的復(fù)合窗口構(gòu)件。圖 5 演示了實(shí)例層次結(jié)構(gòu)。
  
 用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)(圖五)

  
圖 5. Application Window 的實(shí)例層次結(jié)構(gòu)

  
  我們的內(nèi)容目前非常簡(jiǎn)單:parent 下的單一按鈕,如清單 3 所示。
  
  清單 3. Hello(版本 3)
  
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  public class Hello extends ApplicationWindow
  {
  public Hello()
  {
  super(null);
  }
  PRotected Control createContents(Composite parent)
  {
  Button b = new Button(parent, SWT.PUSH);
  b.setText("Hello World");
  return b;
  }
  public static void main(String[] args)
  {
  Hello w = new Hello();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  結(jié)果是圖 6
  
 用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)(圖六)

  
圖 6. Hello(版本 3)

  
  這就是我們要實(shí)現(xiàn)的。我們使用 JFace 創(chuàng)建的第一個(gè)“Hello, World”程序:包含單一按鈕的窗口。現(xiàn)在讓我們繼續(xù)討論文件資源治理器這一話題。首先,我們將創(chuàng)建顯示文件夾層次結(jié)構(gòu)的樹查看器。使用 TreeViewer 和 ApplicationWindow 一樣,TreeViewer 不是真正的 SWT 窗口構(gòu)件,它也沒(méi)有打算向您隱藏 SWT 窗口構(gòu)件。它使用 SWT 樹窗口構(gòu)件來(lái)顯示各項(xiàng),并且還使用許多其它對(duì)象來(lái)協(xié)助它。不象 ApplicationWindow,JFace TreeViewer 并不旨在被子類化。
  
  這里的想法是 TreeViewer 知道要顯示的樹的根元素。當(dāng)然,您必須告訴它那個(gè)對(duì)象是什么:TreeViewer: void setInput(Object rootElement)
  
  為了開始顯示,樹查看器向根元素請(qǐng)求子元素并顯示它們。然后,當(dāng)用戶展開其中的一個(gè)子元素時(shí),樹查看器向該節(jié)點(diǎn)請(qǐng)求子元素,以此類推。實(shí)際上,并不完全是那樣。TreeViewer 并不直接使用域?qū)ο?— 而是使用另一個(gè)名為 ContentProvider 的對(duì)象,這個(gè)對(duì)象才使用域?qū)ο螅鐖D 7 所示。
  
用JFace和SWT構(gòu)建簡(jiǎn)單的應(yīng)用程序(1)(圖七)

  
圖 7. TreeViewer、ContentProvider 和域?qū)ο?/center>
  
  當(dāng)然,您必須實(shí)現(xiàn) ContentProvider。對(duì)于 TreeViewer,您的類必須實(shí)現(xiàn) ITreeContentProvider 接口。實(shí)現(xiàn) TreeContentProvider
  
  有六個(gè)方法需要實(shí)現(xiàn)。實(shí)際上我們不用做全部的工作,只需實(shí)現(xiàn)其中的三個(gè)就行,因此,本著“即時(shí)滿足(instant gratification)”的精神,讓我們暫時(shí)只考慮那幾個(gè)方法吧。下面的代碼演示了樹查看器如何向內(nèi)容提供程序請(qǐng)求正好位于根元素下的頂級(jí)元素:
  
  ITreeContentProvider: public Object[] getElements(Object element)
  
  隨后,每當(dāng)它需要特定元素的子元素時(shí),它就使用以下方法:
  
  ITreeContentProvider: public Object[] getChildren(Object element)
  
  為了知道某個(gè)節(jié)點(diǎn)是否有子元素(有的話會(huì)將小加號(hào)放到它旁邊),樹查看器只需請(qǐng)求該節(jié)點(diǎn)的子元素,然后會(huì)詢問(wèn)有多少子元素。萬(wàn)一您的代碼需要更快捷的方法來(lái)做到這一點(diǎn),則您必須實(shí)現(xiàn)另一個(gè)方法:
  
  public boolean hasChildren(Object element)
  
  正如您所見(jiàn),內(nèi)容提供程序不持有對(duì)任何域?qū)ο蟮囊谩3钟袑?duì)這些域?qū)ο蟮囊玫氖菢洳榭雌鞅旧恚堰@些域?qū)ο笞鳛閰?shù)傳遞給內(nèi)容提供程序中的各個(gè)方法。在我們的例子中,節(jié)點(diǎn)是 File 對(duì)象。為獲取子元素,我們使用 listFiles()。我們必須記得要檢查 listFiles() 是否返回 null,然后使其變成空數(shù)組。為了獲取頂級(jí)元素(正好位于根元素之下),我們只需重用 getChildren() 方法。
  
  getParent() 方法被用來(lái)實(shí)現(xiàn) reveal(Object element) 方法,后者使樹查看器滾動(dòng)其 SWT 樹窗口構(gòu)件,以便顯示樹中特定的節(jié)點(diǎn)。問(wèn)題是:假如此刻實(shí)際上并沒(méi)有顯示那個(gè)節(jié)點(diǎn),那么應(yīng)該在哪里顯示它?JFace 會(huì)尋找其父元素,以及父元素的父元素等等,直到它達(dá)到已顯示的節(jié)點(diǎn),然后它再次回頭尋找,直到目標(biāo)節(jié)點(diǎn)已顯示。
  
  hasChildren() 方法只是做了顯而易見(jiàn)(未優(yōu)化)的事情,最后我們有了清單 4 中所示的代碼。
  
  清單 4. FileTreeContentProvider(版本 1)
  
  import java.io.*;
  import java.util.*;
  import org.eclipse.jface.viewers.*;
  public class FileTreeContentProvider implements ITreeContentProvider
  {
  public Object[] getChildren(Object element)
  {
  Ob

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄色美女免费 | 久久综合婷婷 | 国产精品久久久久久久hd | 国产一区二区免费在线观看 | 天堂成人国产精品一区 | 欧美大电影免费观看 | 深夜网站在线观看 | 草久视频在线观看 | 午夜精品成人一区二区 | 国产午夜精品理论片a级探花 | 色a综合| 国产高潮好爽好大受不了了 | 91精品国产刺激国语对白 | 欧美日韩免费一区 | 91成人在线网站 | av在线直播观看 | 一本色道久久综合狠狠躁篇适合什么人看 | 午夜精品成人一区二区 | 在线 日本 制服 中文 欧美 | 在线观看国产一区二区 | 欧美a在线播放 | 亚洲午夜天堂吃瓜在线 | 大西瓜永久免费av在线 | 精品国产一区二区三区四区在线 | 亚洲一区在线免费视频 | 蜜桃网站在线观看 | 麻豆小视频在线观看 | a网站在线| 成人一区二区三区在线 | 日本成人一区 | 久草最新在线 | 久久久国产精品成人免费 | 91久久极品少妇韩国 | 久久99精品视频在线观看 | 精品一区二区三区毛片 | 国产精品成人一区二区三区电影毛片 | 久久久久99一区二区三区 | 色播视频在线播放 | 一级免费黄色免费片 | 国产在线看一区 | 高清国产午夜精品久久久久久 |