国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

2019-11-18 13:03:35
字體:
供稿:網(wǎng)友

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

  
圖 1. Eclipse Workbench、JFace 和 SWT

  
  Hello, World
  
  讓我們從我能想到的最簡單的 JFace 程序開始,逐步擴(kuò)充它,將其構(gòu)建為最常見的“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)建了一個名為 Hello 的類,其中 main 方法僅僅創(chuàng)建了一個 ApplicationWindow,然后打開它。setBlockOnOpen() 使 open() 阻塞,直到窗口關(guān)閉為止。在窗口已關(guān)閉之后,我們獲取當(dāng)前的 Display 并除去它。這會釋放在操作系統(tǒng)中用到的資源。當(dāng)您運行該程序時,您會看到類似圖 2 的窗口:
  
 用JFace和SWT構(gòu)建簡單的應(yīng)用程序(1)(圖二)

  
圖 2. Hello(版本 2)

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

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

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

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

  
  讓我們改進(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ù)(如往常一樣)。讓我們暫時不考慮該構(gòu)造函數(shù)的參數(shù)。運行該程序的結(jié)果與前一個程序沒有任何不同。缺省情況下,程序不會為我們顯示任何裝飾性的東西。我們的程序要創(chuàng)建一個帶有文本“Hello, World”的按鈕。這個按鈕要顯示在內(nèi)容(Contents)區(qū)域。要做到這一點,我們必須實現(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)建一個復(fù)合窗口構(gòu)件,將其添加到 parent,然后添加您的窗口構(gòu)件,并返回您創(chuàng)建的復(fù)合窗口構(gòu)件。圖 5 演示了實例層次結(jié)構(gòu)。
  
 用JFace和SWT構(gòu)建簡單的應(yīng)用程序(1)(圖五)

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

  
  我們的內(nèi)容目前非常簡單: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)建簡單的應(yīng)用程序(1)(圖六)

  
圖 6. Hello(版本 3)

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

  
圖 7. TreeViewer、ContentProvider 和域?qū)ο?/center>
  
  當(dāng)然,您必須實現(xiàn) ContentProvider。對于 TreeViewer,您的類必須實現(xiàn) ITreeContentProvider 接口。實現(xiàn) TreeContentProvider
  
  有六個方法需要實現(xiàn)。實際上我們不用做全部的工作,只需實現(xiàn)其中的三個就行,因此,本著“即時滿足(instant gratification)”的精神,讓我們暫時只考慮那幾個方法吧。下面的代碼演示了樹查看器如何向內(nèi)容提供程序請求正好位于根元素下的頂級元素:
  
  ITreeContentProvider: public Object[] getElements(Object element)
  
  隨后,每當(dāng)它需要特定元素的子元素時,它就使用以下方法:
  
  ITreeContentProvider: public Object[] getChildren(Object element)
  
  為了知道某個節(jié)點是否有子元素(有的話會將小加號放到它旁邊),樹查看器只需請求該節(jié)點的子元素,然后會詢問有多少子元素。萬一您的代碼需要更快捷的方法來做到這一點,則您必須實現(xiàn)另一個方法:
  
  public boolean hasChildren(Object element)
  
  正如您所見,內(nèi)容提供程序不持有對任何域?qū)ο蟮囊谩3钟袑@些域?qū)ο蟮囊玫氖菢洳榭雌鞅旧?,它把這些域?qū)ο笞鳛閰?shù)傳遞給內(nèi)容提供程序中的各個方法。在我們的例子中,節(jié)點是 File 對象。為獲取子元素,我們使用 listFiles()。我們必須記得要檢查 listFiles() 是否返回 null,然后使其變成空數(shù)組。為了獲取頂級元素(正好位于根元素之下),我們只需重用 getChildren() 方法。
  
  getParent() 方法被用來實現(xiàn) reveal(Object element) 方法,后者使樹查看器滾動其 SWT 樹窗口構(gòu)件,以便顯示樹中特定的節(jié)點。問題是:假如此刻實際上并沒有顯示那個節(jié)點,那么應(yīng)該在哪里顯示它?JFace 會尋找其父元素,以及父元素的父元素等等,直到它達(dá)到已顯示的節(jié)點,然后它再次回頭尋找,直到目標(biāo)節(jié)點已顯示。
  
  hasChildren() 方法只是做了顯而易見(未優(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ā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 禄丰县| 韶山市| 堆龙德庆县| 望奎县| 蚌埠市| 石阡县| 永修县| 石家庄市| 柘荣县| 芦山县| 绥棱县| 沧源| 毕节市| 五大连池市| 东乡县| 巩义市| 招远市| 北海市| 南昌市| 绥阳县| 荆门市| 乌鲁木齐市| 开平市| 迁西县| 巴林左旗| 仁寿县| 长葛市| 大埔县| 西华县| 光泽县| 郸城县| 巴林左旗| 夏邑县| 咸阳市| 大悟县| 铜川市| 华阴市| 陇西县| 安康市| 阿克苏市| 东城区|