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

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

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

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

  實(shí)現(xiàn)頂級 EXPlorer 類
  我們將采用 Hello, World 程序,更改其名稱,然后用 createContents() 方法創(chuàng)建 TreeViewer(而不是創(chuàng)建一個按鈕),將其內(nèi)容提供程序設(shè)置為我們的文件樹內(nèi)容提供程序,然后將輸入設(shè)置到某個文件夾。在這個例子中,我選擇的文件夾是 C: 驅(qū)動器中的頂級文件夾。
  
  注:需要從 createContents() 返回 SWT 窗口構(gòu)件。正如前面提到的,JFace Tree Viewer 不是 SWT 窗口構(gòu)件,因此我們不能將它返回。我們需要從樹查看器獲取真正的窗口構(gòu)件。我們通過使用 getTree() 做到這一點(diǎn)。我們的主窗口類現(xiàn)在看起來與下面相似:
  
  清單 5. Explorer(版本 1)
  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  public class Explorer extends applicationWindow
  {
  public Explorer()
  {
  super(null);
  }
  PRotected Control createContents(Composite parent)
  {
  TreeViewer tv = new TreeViewer(parent);
  tv.setContentProvider(new FileTreeContentProvider());
  tv.setInput(new File("C://"));
  return tv.getTree();
  }
  public static void main(String[] args)
  {
  Explorer w = new Explorer();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  運(yùn)行該程序,您將看到與圖 8 相似的結(jié)果。
  
 用JFace和SWT構(gòu)建簡單的應(yīng)用程序(2)(圖一)

  
圖 8. Explorer(版本 1)

  
  除了樣板文件代碼,我們只需向 Hello, World 程序添加 9 行代碼就可做到這一點(diǎn)。正如您可能猜想的那樣,程序用 File 的 toString() 方法來顯示這些文件,這不是我們真正想要的。要改變這一點(diǎn),我們需要提供一個標(biāo)簽提供程序。
  
  實(shí)現(xiàn)標(biāo)簽提供程序
  正如有一個內(nèi)容提供程序?qū)ο罂捎脕慝@取樹節(jié)點(diǎn)的子元素一樣,當(dāng)需要實(shí)際顯示這些節(jié)點(diǎn)時,樹查看器有另一個助手對象:標(biāo)簽提供程序。和前面一樣,我們需要設(shè)置它:
  
  public void setLabelProvider(IBaseLabelProvider labelProvider)
  
  而且需要實(shí)現(xiàn)下面的方法以返回要為每個元素顯示的文本:
  
  public String getText(Object element)
  
  假如我們將標(biāo)簽提供程序添加到樹查看器圖中,就會得到圖 9。
  
 用JFace和SWT構(gòu)建簡單的應(yīng)用程序(2)(圖二)

  
圖 9. 顯示內(nèi)容提供程序和標(biāo)簽提供程序的樹查看器

  
  我們可以實(shí)現(xiàn)接口 ILabelProvider,但將缺省實(shí)現(xiàn) LabelProvider 子類化更輕易(假如沒有顯式地設(shè)置標(biāo)簽提供程序,則使用的就是這個類)。我們希望利用 getText() 做的事是返回文件名最后的部分 — 相對文件名而非 toString() 缺省使用的絕對文件名。圖 6 演示了代碼。
  
  圖 6. FileTreeLabelProvider(版本 1)
  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  public class FileTreeLabelProvider extends LabelProvider
  {
  public String getText(Object element)
  {
  return ((File) element).getName();
  }
  }
  
  而且我們必須記得使樹查看器使用這個標(biāo)簽提供程序,如清單 7 所示。
  
  清單 7. Explorer(版本 2)
  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  public class Explorer extends ApplicationWindow
  {
  public Explorer()
  {
  super(null);
  }
  protected Control createContents(Composite parent)
  {
  TreeViewer tv = new TreeViewer(parent);
  tv.setContentProvider(new FileTreeContentProvider());
  tv.setLabelProvider(new FileTreeLabelProvider());
  tv.setInput(new File("C://"));
  return tv.getTree();
  }
  public static void main(String[] args)
  {
  Explorer w = new Explorer();
  w.setBlockOnOpen(true);
  w.open();
  Display.getCurrent().dispose();
  }
  }
  
  這一次運(yùn)行該程序時,我們會獲得更清楚的視覺效果,如圖 10 所示。
  
 用JFace和SWT構(gòu)建簡單的應(yīng)用程序(2)(圖三)

  
圖 10. Explorer(版本 2)

  
  我們現(xiàn)在要做的是將樹查看器移到左邊,將一個表查看器放在右邊,以顯示在樹查看器中已選中的文件夾中的文件列表。
  
  使用表查看器
  為了處理表,JFace 有一個 TableViewer。和 TreeViewer 一樣,它有輸入(根對象)、內(nèi)容提供程序和標(biāo)簽提供程序。它比樹查看器簡單,因?yàn)樗恍枰幚順洹D 11 演示了內(nèi)容提供程序和標(biāo)簽提供程序。
  
 用JFace和SWT構(gòu)建簡單的應(yīng)用程序(2)(圖四)

  
圖 11. 顯示內(nèi)容提供程序和標(biāo)簽提供程序的表查看器

  設(shè)置輸入對象的方法與前面相同:
  
  TableViewer: void setInput(Object rootElement)
  
  實(shí)現(xiàn)文件表查看器內(nèi)容提供程序
  讓我們考慮內(nèi)容提供程序。這一次,根元素比樹查看器根元素簡單。表查看器僅僅期望根對象有許多子元素,因此要實(shí)現(xiàn)的唯一有趣方法是獲取子元素的方法:
  
  public Object[] getElements(Object rootElement)
  
  要實(shí)現(xiàn)的接口是 IStrUCturedContentProvider。
  
  根對象是一個文件夾;其子元素是該文件夾包含的文件/文件夾。因此我們的文件表內(nèi)容提供程序類與清單 8 類似。
  
  清單 8. FileTableContentProvider(版本 1)
  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  public class FileTableContentProvider implements IStructuredContentProvider
  {
  public Object[] getElements(Object element)
  {
  Object[] kids = null;
  kids = ((File) element).listFiles();
  return kids == null ? new Object[0] : kids;
  }
  public void dispose()
  {
  }
  public void inputChanged(Viewer viewer, Object old_object, Object new_object)
  {
  }
  }
  
  因此我們現(xiàn)在有兩個查看器:樹查看器和表查看器。為了將它們相鄰地安置在一起,我們創(chuàng)建了 SWT SashForm 窗口構(gòu)件。該窗口構(gòu)件用一個用戶可以調(diào)節(jié)的邊框分隔其子元素。然后,我們將樹和表添加到框格表單(sash form)(圖 12)。
  
 用JFace和SWT構(gòu)建簡單的應(yīng)用程序(2)(圖五)

  
圖 12. 包含樹查看器和表查看器的框格表單

  
  接下來要做的是使表查看器查看用戶在樹查看器中選中的每個文件夾。要做到這一點(diǎn),我們必須偵聽事件。
  
  偵聽事件
  當(dāng)用戶在樹查看器中選中一項(xiàng)時,樹查看器發(fā)出 SelectionChangedEvent 事件。我們需要偵聽該事件,當(dāng)發(fā)出該事件時,需要將表的輸入設(shè)置為樹查看器中當(dāng)前選中的文件。為了偵聽來自樹查看器的選擇更改事件,我們使用下面的方法:
  
  public void addSelectionChangedListener
  (ISelectionChangedListener listener)
  
  當(dāng)用戶選中/取消選中樹查看器中的節(jié)點(diǎn)時,用下面的方法調(diào)用選擇更改偵聽器:
  
  public void selectionChanged(SelectionChangedEvent event)
  
  為了實(shí)現(xiàn)該偵聽器類,我們將在主資源治理器窗口中編碼一個匿名類。在 selectionChanged() 方法中,我們將需要獲得剛選中的對象,并使其成為表查看器的輸入。將所有的工作組合在一起,就得到了清單 9。
  
  清單 9. Explorer(版本 3)
  
  import java.io.*;
  import org.eclipse.jface.viewers.*;
  import org.eclipse.jface.window.*;
  import org.eclipse.swt.*;
  import org.eclipse.swt.custom.*;
  import org.eclipse.swt.widgets.*;
  public class Explorer extends ApplicationWindow
  {
  public Explorer()
  {
  super(null);
  }
  protected Control createContents(Composite parent)
  {
  SashForm sash_form = new SashForm(parent, SWT.HORIZONTAL SWT.NULL);
  TreeViewer tv = new TreeViewer(sash_form);
  tv.setContentProvider(new FileTreeContentProvider());
  tv.setLabelProvider(new FileTreeLabelProvider());
  tv.setInput(new File("C://"));
  final TableViewer tbv = new TableViewer(sash_form, SWT.BORDER);
  tbv.setContentProvider(new FileTableContentProvider());
  tv.addSelectionChangedListener(new ISelectionChangedListener()
  {
  public void selectionChanged(SelectionChangedEvent event)
  {
  IStructuredSelection selection =
  (IStructuredSelection) event.getSelection();

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩精品中文字幕在线播放 | 黄色免费小视频网站 | 亚洲国产精品一区二区三区 | 欧美爱爱一区二区 | 久久久久久久一区二区三区 | 亚洲5区 | 久久精品中文字幕一区二区 | 91色一区二区三区 | 久久精品中文 | 日本一区二区久久久 | 免费毛片播放 | 激情综合网俺也去 | 特级黄色一级毛片 | 成人三级免费电影 | 色屁屁xxxxⅹ免费视频 | 国产成人77亚洲精品www | 欧美特黄一级高清免费的香蕉 | 国产女厕一区二区三区在线视 | 国产亚洲精品久久久久婷婷瑜伽 | 国产女厕一区二区三区在线视 | 婷婷中文字幕一区二区三区 | 免费看搡女人无遮挡的视频 | 免费一级毛片在线播放视频老 | 欧美精品一区二区三区在线 | 成人午夜免费观看 | 午夜精品小视频 | 久久久成人999亚洲区美女 | avav在线播放| 亚洲国产成人久久成人52 | 久久精品一二三区 | 久久精品黄 | 国产精品av久久久久久久久久 | 欧美成网 | 欧美三级欧美成人高清www | 亚洲国产网址 | 97视频| 久久精品中文字幕一区 | 欧美性生活xxxxx | 日产精品一区二区三区在线观看 | 欧美在线观看禁18 | 久久经典国产视频 |