熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

利用視圖鏈接使Eclipse應用程序更豐富

2013-11-23 20:26:11  來源: Java開源技術 
豐富的 GUI 中的視圖可以以各種方式顯示信息從而改善用戶體驗非常自然UI 視圖之間是相互依賴的需要進行交互Eclipse 簡化了鏈接 UI 視圖的工作並提供了將視圖鏈接應用到非 UI 場景的方式

  簡介

  Eclipse 平台允許使用可插入組件 —— 插件 —— 幫助創建豐富的圖形用戶界面(graphical user interfaceGUI)應用程序例如插件可以向 GUI 提供視圖但是在現實的應用程序中UI 視圖不能是孤立的它們需要根據其他視圖的狀態進行交互和對本身進行更新

  一個簡單的例子是描述世界各地的主要旅游目的地的 GUI 應用程序這個 GUI 可能有一個 Select City 視圖用於顯示旅游景點和公共交通信息


Eclipse 視圖鏈接
視圖鏈接的例子
  本文介紹在 Eclipse 中結合視圖的方式以及如何對其他視圖的狀態做出響應還討論鏈接視圖方式在哪些情況下可能比其他方式合適

  Eclipse 開發人員可以依賴以下方法對視圖進行鏈接

  選擇提供器 選擇監聽器(selection providerselection listener)模式從而讓視圖對其他視圖中的選擇做出反應
  IAdaptable 接口與某些事件結合使用
  屬性改變監聽器它允許視圖將屬性改變事件告之已注冊的監聽器

  選擇提供器 選擇監聽器范型

  選擇提供器 選擇監聽器模式能夠方便地創建對其他視圖中的改變做出響應的視圖例如當用戶點擊代表城市名的 UI 項時另一個視圖可能需要顯示這個城市的景點詳情這樣的視圖可以使用 UI 選擇對象(可能是代表城市名的字符串對象)中包含的信息並使用它從模型中獲取和顯示其他信息

  視圖應該能夠識別並利用 UI 選擇事件orgeclipseuiISelectionListener 是接收 UI 選擇事件的監聽器接口選擇監聽器必須注冊到工作台頁面工作台頁面實現 orgeclipseuiISelectionService 接口定義的服務從而將 UI 選擇事件告之監聽器選擇監聽器必須注冊到選擇服務

  用於顯示可選擇的 UI 項的視圖還應該能夠公布 UI 選擇視圖通過將 選擇提供器 注冊到它們各自的工作台站點來實現這一點Eclipse 中的每個 UI 部分通過 orgeclipseuiIWorkbenchPartSite 引用與工作台站點聯絡選擇提供器注冊到工作台站點

  在使用選擇提供器 選擇監聽器模式鏈接視圖時視圖可以將本身作為監聽器添加到工作台頁面而希望公布選擇的其他視圖必須將選擇提供器添加到它們各自的工作台站點orgeclipseuiISelectionListener 接口如下所示

public void selectionChanged(IWorkbenchPart part ISelection selection);
  要使視圖能夠監聽選擇改變視圖必須實現 ISelectionListener 接口並必須將自己注冊到工作台頁面清單 顯示一個例子

  清單 將選擇監聽器添加到工作台頁面

public class MyView extends ViewPart implements ISelectionListener{


public void createPartControl(Composite parent) {

// add this view as a selection listener to the workbench page
getSite()getPage()addSelectionListener((ISelectionListener) this);

}

// Implement the method defined in ISelectionListener to consume UI selections
public void selectionChanged(IWorkbenchPart part ISelection selection) {
//Examine selection and act on it!
}

}
  使用 UI 選擇的更好的方法是將消費者視圖作為監聽器注冊到特定的視圖部分正如在下面的例子中可以看到的源視圖部分的視圖 ID 在注冊選擇監聽器期間被作為一個參數

getSite()getPage()addSelectionListener(SampleViewId(ISelectionListener)this);
  這種方式可以避免對消費者視圖進行多余的回調如果視圖被注冊為非特定的監聽器就會出現這種情況 清單 中的代碼片段顯示一個視圖的 createPartControl() 方法這個方法創建一個 JFace TableViewer 並將它作為選擇提供器添加到工作台站點這些代碼使 TableViewer 中的任何 UI 選擇改變能夠傳播到頁面並最終傳播到對這種事件感興趣的消費者視圖

  清單 設置選擇提供器

public void createPartControl(Composite parent) {
// Set up a JFace Viewer
viewer = new TableViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL);
viewersetContentProvider(new ViewContentProvider());
viewersetLabelProvider(new ViewLabelProvider());
viewersetSorter(new NameSorter());
viewersetInput(getViewSite());

// ADD the JFace Viewer as a Selection Provider to the View site
getSite()setSelectionProvider(viewer);

}
  這個視圖將它創建的 JFace TableViewer 注冊為選擇提供器有兩個原因

  這個視圖打算使用這個 TableViewer 顯示信息而且用戶將與 TableViewer 進行交互

  TableViewer 實現了選擇提供器接口並能夠向工作台部分站點傳播選擇事件

  因為 JFace 查看器是選擇提供器所以在大多數情況下就不必創建選擇提供器了視圖只需使用眾多的 JFace 查看器之一來顯示信息並將 JFace 查看器注冊為選擇提供器

  另一種鏈接方式

  某些情況需要另一種視圖鏈接方式

  信息量可能太大由於內存使用量增加UI 選擇對象無法有效地容納它

  視圖可能希望公布其他信息而不只是公布可視化選擇信息公布的信息可能是根據選擇進行某些後期處理的結果

  視圖可能希望使用來自另一個插件的信息而這個插件可能根本沒有提供視圖(使用包含的 JFace 查看器)在這種情況下使用基於 UI 選擇的鏈接是不可能的

  可以使用 reruntimeIAdaptable 接口來緩解第一個問題這個接口使選擇對象能夠在需要時傳播更多信息第二個和第三個問題需要用手工方式解決屬性改變監聽器模式是合適的解決方案
  使用 IAdaptable 接口

  實現 IAdaptable 接口的類能夠動態地返回某些類型的適配器然後可以使用這些適配器獲取更多信息如果查看器中的選擇對象實現了 IAdaptable 接口那麼根據它們可以返回的適配器類型可以有效地獲取更多信息或相關信息reruntimeIAdaptable 接口如下所示

public void object getAdapter(Class adapter);
  顯然調用者應該知道它期望選擇返回的適配器接口類型考慮一個 JFace TreeViewer它在一個單層的樹中顯示城市代表城市的對象是 CityClass 類型的CityClass 對象應該包含關於此城市的基本信息並只在需要時返回詳細信息在清單 中要注意CityClass 支持的適配器類型使調用者能夠在需要時獲得更多信息

  清單 JFace TreeViewer 中的 CityClass

class CityClass implements IAdaptable {
 private String cityName;

 public CityClass(String name) {
  thisname = name;
 }
 public String getName() {
  return name;
 }
 public CityClass getParent() {
  return parent;
 }
 public String toString() {
  return getName();
 }
 public Object getAdapter(Class key) {
  if (keygetName()equals(ITransportationInfo))
   return CityPlugingetInstance()getTransportAdapter();
  else (keygetName()equals(IPlacesInfo))
   return CityPlugingetInstance()getPlacesAdapter();
  return null;
 }
}
  熟悉 Eclipse IDE 工作台的開發人員都了解 Outline 視圖這個視圖提供了編輯器中打開的文件的結構化視圖這個 Outline 視圖展示了 IAdaptable 接口如何與某些事件類型結合使用從而有效地根據其他視圖的內容對視圖進行初始化編輯器必須為用戶打開的文件創建一個 Content Outline 頁面Content Outline 頁面符合 IContentOutlinePage 接口編輯器還必須實現 IAdaptable 接口這樣就能夠向編輯器查詢 IContentOutlinePage 類型的適配器使用這個適配器來獲取和顯示文件的大綱信息

  IAdaptable 接口的另一個例子是 Properties 視圖Properties 視圖跟蹤對活動部分的選擇並調用當前選擇對象上的 getAdapter 方法查詢的適配器類型是 IPropertySource然後Properties 視圖使用 IPropertySource 適配器來獲取要顯示的信息

  在這些視圖鏈接例子中應用程序在接到 Selection Changed 或 Part Activation 通知時通過 IAdaptable 獲取信息因此如果選擇對象實現了 IAdaptable那麼與從選擇對象本身獲取的信息量相比用戶可以通過適配器獲得多得多的信息

  屬性改變監聽器范型

  可以使用屬性改變監聽器類型的交互來解決前面提到的另外兩個問題視圖如何使用來自未提供視圖的插件的信息以及視圖如何公布在可視化選擇之後某些處理所生成的信息?

  可以建立一個插件來接受屬性改變監聽器的注冊並在需要時通知注冊的監聽器應用程序可以將定制的事件告之監聽器事件中還可以包含要共享的信息

  與選擇提供器的情況不同屬性改變提供器不需要實現特定的接口您必須決定將監聽器注冊到提供器的語義清單 中的代碼片段是一些方法它們允許在屬性提供器視圖或插件類中添加或刪除屬性改變監聽器

  清單 添加和刪除屬性改變監聽器

//To add a listener for property changes to this notifier:

public void addPropertyChangeListener(IPropertyChangeListener listener);

//To remove the given content change listener from this notifier:

public void removePropertyChangeListener(IPropertyChangeListener listener);
  屬性提供器應該使用 orgeclipsejfaceutilPropertyChangeEvent 來創建一個可以有效填充和傳播的事件另外屬性提供器要負責維護監聽器列表並對它們進行回調

  作為一個例子請考慮一個每小時調用 World Weather Web Service 來查詢主要城市的氣象的插件它要使這些信息可供其他插件和視圖使用CityWeatherPlugin 可以公開一個稱為 CitiesWeatherXML 的屬性消費者可以將本身作為 PropertyChange 監聽器注冊到 CityWeatherPlugin為此監聽器必須了解 CityWeatherPlugin 中的注冊方法這樣才能將本身注冊為氣象數據事件的監聽器CityWeatherPlugin 應該跟蹤並通知監聽器它使用 PropertyChangeEvent 向監聽器提供數據

  清單 創建屬性提供器

class CityPopulationPlugin {
 ArrayList myListeners;

 // A public method that allows listener registration
 public void addPropertyChangeListener(IPropertyChangeListener listener) {
  if(!ntains(listener))
   myListenersadd(listener);
 }

 // A public method that allows listener registration
 public void removePropertyChangeListener(IPropertyChangeListener listener) {
  myListenersremove(listener);
 }

 public CityPopulationPlugin (){
  // method to start the thread that invokes the population \
  web service once every hour
  // and then notifies the listeners via the propertyChange() callback method
  initWebServiceInvokerThread( myListeners );
 }

 void initWebServiceInvokerThread(ArrayList listeners) {
  // Code to Invoke Web Service Periodically and retrieve information

  // Post Invocation inform listeners
  for (Iterator iter = erator(); iterhasNext();) {
   IPropertyChangeListener element = (IProperty\
   ChangeListener) iternext();
   elementpropertyChange(new PropertyChangeEvent(this \CitiesWeatherXML null CityWeatherXMLObj));
  }
 }
}
  屬性改變監聽器必須實現 orgeclipsejfaceutilIPropertyChangeListener 接口以便允許屬性改變提供器對它進行回調這個接口有一個方法 public void propertyChange(PropertyChangeEvent event)

  清單 實現 IPropertyChangeListener

class MyView implements IPropertyChangeListener {

 public void createPartControl() {
  //register with a Known Plugin that sources Population Data
  CityPopulationPlugingetInstance()addPropertyChangeListener(this);
 }

 public void propertyChange(PropertyChangeEvent event) {

  //This view is interested in the Population Counts of the Cities
  //The population data is being sourced by another
  plugin in the background

  if( eventgetProperty()equals(CitiesWeatherXML)) {
   Object val = eventgetNewValue();
   // do something with val
  }
 }
}
  這種方式的靈活性在於應用程序可以在需要時通知監聽器並根據各種場景向它們傳遞信息傳遞的信息不必直接與 UI 選擇相關這些信息可以是某些後期處理的結果另外它可以與其他後台作業的狀態相關或者是定期從模型中獲取的最新信息例如City Selector View 可能不只是傳播選擇的城市還使用 PropertyChange 范型將當前選擇的城市的氣象信息異步地傳播給其他消費者

  結束語

  本文討論了使視圖相互協作和響應的各種方式如果 UI 選擇本身不夠可以使用 IAdaptable 接口加強它們屬性改變監聽器也為滿足非 UI 場景提供了更大的靈活性

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28496.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.