亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用JFace和SWT構建簡單的應用程序(1)

2019-11-18 13:03:35
字體:
來源:轉載
供稿:網友

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

  
圖 1. Eclipse Workbench、JFace 和 SWT

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

  
圖 2. Hello(版本 2)

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

  
圖 3. 您的代碼、JFace Window 和 SWT Shell 之間的關系

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

  
圖 4. 應用程序窗口的各個部分

  
  讓我們改進 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();
  }
  }
  
  您編寫的構造函數必須調用超類構造函數(如往常一樣)。讓我們暫時不考慮該構造函數的參數。運行該程序的結果與前一個程序沒有任何不同。缺省情況下,程序不會為我們顯示任何裝飾性的東西。我們的程序要創建一個帶有文本“Hello, World”的按鈕。這個按鈕要顯示在內容(Contents)區域。要做到這一點,我們必須實現 Control createContents(Composite parent) 方法。
  
  ApplicationWindow 將在所有其它窗口構件已經創建之后但窗口在屏幕上顯示之前調用該方法。參數 parent 是代表內容區域的復合窗口構件。這里的想法是您創建一個復合窗口構件,將其添加到 parent,然后添加您的窗口構件,并返回您創建的復合窗口構件。圖 5 演示了實例層次結構。
  
 用JFace和SWT構建簡單的應用程序(1)(圖五)

  
圖 5. Application Window 的實例層次結構

  
  我們的內容目前非常簡單: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();
  }
  }
  
  結果是圖 6
  
 用JFace和SWT構建簡單的應用程序(1)(圖六)

  
圖 6. Hello(版本 3)

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

  
圖 7. TreeViewer、ContentProvider 和域對象

  
  當然,您必須實現 ContentProvider。對于 TreeViewer,您的類必須實現 ITreeContentProvider 接口。實現 TreeContentProvider
  
  有六個方法需要實現。實際上我們不用做全部的工作,只需實現其中的三個就行,因此,本著“即時滿足(instant gratification)”的精神,讓我們暫時只考慮那幾個方法吧。下面的代碼演示了樹查看器如何向內容提供程序請求正好位于根元素下的頂級元素:
  
  ITreeContentProvider: public Object[] getElements(Object element)
  
  隨后,每當它需要特定元素的子元素時,它就使用以下方法:
  
  ITreeContentProvider: public Object[] getChildren(Object element)
  
  為了知道某個節點是否有子元素(有的話會將小加號放到它旁邊),樹查看器只需請求該節點的子元素,然后會詢問有多少子元素。萬一您的代碼需要更快捷的方法來做到這一點,則您必須實現另一個方法:
  
  public boolean hasChildren(Object element)
  
  正如您所見,內容提供程序不持有對任何域對象的引用。持有對這些域對象的引用的是樹查看器本身,它把這些域對象作為參數傳遞給內容提供程序中的各個方法。在我們的例子中,節點是 File 對象。為獲取子元素,我們使用 listFiles()。我們必須記得要檢查 listFiles() 是否返回 null,然后使其變成空數組。為了獲取頂級元素(正好位于根元素之下),我們只需重用 getChildren() 方法。
  
  getParent() 方法被用來實現 reveal(Object element) 方法,后者使樹查看器滾動其 SWT 樹窗口構件,以便顯示樹中特定的節點。問題是:假如此刻實際上并沒有顯示那個節點,那么應該在哪里顯示它?JFace 會尋找其父元素,以及父元素的父元素等等,直到它達到已顯示的節點,然后它再次回頭尋找,直到目標節點已顯示。
  
  hasChildren() 方法只是做了顯而易見(未優化)的事情,最后我們有了清單 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产中文精品字幕自在自线| 日韩av片永久免费网站| 最近2019中文字幕mv免费看| 992tv成人免费视频| 91久久久久久久一区二区| 成人国产在线激情| 91嫩草在线视频| 国产91精品久久久久久| 亚洲高清福利视频| 久久亚洲私人国产精品va| 久久精品国产96久久久香蕉| 亚洲综合在线做性| 欧美电影免费观看高清完整| 精品久久久中文| 欧美在线激情视频| 亚洲视频在线观看免费| 久久韩国免费视频| 日韩一区二区在线视频| 国产一区二中文字幕在线看| 亚洲一区中文字幕在线观看| 亚洲一区精品电影| 国产精品综合不卡av| 亚洲精品av在线| 国产精品嫩草影院一区二区| 中文字幕日韩欧美在线| 国产91ⅴ在线精品免费观看| 久久久之久亚州精品露出| 成人免费午夜电影| 亚洲人午夜色婷婷| 精品亚洲男同gayvideo网站| 成人h视频在线观看播放| 精品久久久久久中文字幕大豆网| 亚洲人精品午夜在线观看| 日韩精品久久久久久久玫瑰园| 亚洲免费人成在线视频观看| 精品亚洲一区二区三区| 日韩在线视频免费观看高清中文| 在线观看欧美成人| 欧日韩不卡在线视频| 久久人人爽亚洲精品天堂| 性欧美长视频免费观看不卡| 色狠狠av一区二区三区香蕉蜜桃| 日本在线精品视频| 欧美日韩综合视频网址| 欧美亚洲午夜视频在线观看| 91在线视频成人| 色妞久久福利网| 精品福利视频导航| 精品香蕉在线观看视频一| 性色av一区二区三区免费| 日韩欧美综合在线视频| 日本精品一区二区三区在线| 在线播放国产精品| 国产精品男女猛烈高潮激情| 亚洲区一区二区| 久久久av免费| 大胆人体色综合| 亚洲天堂av网| 日韩中文综合网| 亚洲欧美日韩中文在线制服| 色噜噜狠狠色综合网图区| 欧美极品第一页| 美日韩丰满少妇在线观看| 欧美最猛性xxxxx(亚洲精品)| 久久精品成人一区二区三区| 亚洲国语精品自产拍在线观看| 欧美日韩亚洲国产一区| 欧美成人精品一区| 欧美成人午夜免费视在线看片| 亚洲欧美激情视频| 国产一区玩具在线观看| 久久国内精品一国内精品| 欧美另类极品videosbestfree| 中文字幕精品影院| 日韩一区二区精品视频| 亚洲日本中文字幕免费在线不卡| 亚洲综合中文字幕68页| 久久久久久久久中文字幕| 欧美国产极速在线| 日本午夜人人精品| 精品中文字幕在线观看| 日本精品在线视频| 国产91网红主播在线观看| 国产成人a亚洲精品| 欧美中文在线字幕| 欧美一级视频一区二区| 高跟丝袜欧美一区| 九九精品在线视频| 国a精品视频大全| 日韩国产在线看| 国产精品久久不能| 欧美自拍视频在线| 国产精品一区二区在线| 日韩在线一区二区三区免费视频| 欧美日韩国产一区中文午夜| 色伦专区97中文字幕| 91高清在线免费观看| 亚洲新中文字幕| 国产精品亚洲一区二区三区| 国产精品91免费在线| 久久久亚洲天堂| 国产欧美一区二区三区久久人妖| 亚洲美女精品成人在线视频| 国产精品视频网| 国产精品热视频| 热re99久久精品国产66热| 欧美人与物videos| 国产精品国产福利国产秒拍| 欧美日韩视频免费播放| 91精品国产免费久久久久久| 国产视频观看一区| 欧美日韩电影在线观看| 久久97久久97精品免视看| 精品无人国产偷自产在线| 欧美日韩国产页| 久久91精品国产91久久跳| 亚洲精品之草原avav久久| 国产精品自拍偷拍视频| 九九热99久久久国产盗摄| 欧美在线观看日本一区| 欧美日韩国产精品一区二区不卡中文| 国产欧美一区二区三区在线| 亚洲的天堂在线中文字幕| 久久久久九九九九| 97高清免费视频| 久久久www成人免费精品| 国产日韩精品综合网站| 日韩国产精品视频| 亚洲精品成人久久电影| 伊人男人综合视频网| 国内伊人久久久久久网站视频| 亚洲欧美综合精品久久成人| 日韩在线视频观看正片免费网站| 亚洲人成网站免费播放| 一区二区三区视频免费| 久久综合伊人77777尤物| 色噜噜狠狠色综合网图区| 日韩精品中文在线观看| 精品国产乱码久久久久久虫虫漫画| 成人xvideos免费视频| 亚洲永久免费观看| 欧美亚洲日本黄色| 国产午夜一区二区| 91久久国产婷婷一区二区| 欧美乱大交做爰xxxⅹ性3| 精品国产一区二区三区久久久狼| 久久99久久99精品免观看粉嫩| 国产欧美一区二区三区在线看| 日韩女优在线播放| 成人激情视频小说免费下载| 日韩高清电影好看的电视剧电影| 成人www视频在线观看| 成人欧美一区二区三区黑人| 久久中国妇女中文字幕| 69久久夜色精品国产69乱青草| 91亚洲永久免费精品| 成人激情免费在线| www.日韩.com| 国产高清在线不卡| 97福利一区二区| 麻豆成人在线看| 国产精品国模在线| 日韩女优人人人人射在线视频| 久久资源免费视频|