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

首頁 > 開發(fā) > 綜合 > 正文

利用視圖鏈接使Eclipse應(yīng)用程序更豐富

2024-07-21 02:14:57
字體:
供稿:網(wǎng)友

最大的網(wǎng)站源碼資源下載站,

  豐富的 gui 中的視圖可以以各種方式顯示信息,從而改善用戶體驗。非常自然,ui 視圖之間是相互依賴的,需要進(jìn)行交互。eclipse 簡化了鏈接 ui 視圖的工作,并提供了將視圖鏈接應(yīng)用到非 ui 場景的方式。

  簡介

  eclipse 平臺允許使用可插入組件 —— 插件 —— 幫助創(chuàng)建豐富的圖形用戶界面(graphical user interface,gui)應(yīng)用程序。例如,插件可以向 gui 提供視圖。但是,在現(xiàn)實的應(yīng)用程序中,ui 視圖不能是孤立的。它們需要根據(jù)其他視圖的狀態(tài)進(jìn)行交互和對本身進(jìn)行更新。

  一個簡單的例子是描述世界各地的主要旅游目的地的 gui 應(yīng)用程序。這個 gui 可能有一個 select city 視圖,用于顯示旅游景點和公共交通信息。


圖 1. 視圖鏈接的例子

  本文介紹在 eclipse 中結(jié)合視圖的方式以及如何對其他視圖的狀態(tài)做出響應(yīng)。還討論鏈接視圖方式在哪些情況下可能比其他方式合適。

  eclipse 開發(fā)人員可以依賴以下方法對視圖進(jìn)行鏈接:

  選擇提供器 - 選擇監(jiān)聽器(selection provider-selection listener)模式,從而讓視圖對其他視圖中的選擇做出反應(yīng)
  iadaptable 接口,與某些事件結(jié)合使用
  屬性改變監(jiān)聽器,它允許視圖將屬性改變事件告之已注冊的監(jiān)聽器

  選擇提供器 - 選擇監(jiān)聽器范型

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

  視圖應(yīng)該能夠識別并利用 ui 選擇事件。org.eclipse.ui.iselectionlistener 是接收 ui 選擇事件的監(jiān)聽器接口。選擇監(jiān)聽器必須注冊到工作臺頁面。工作臺頁面實現(xiàn) org.eclipse.ui.iselectionservice 接口定義的服務(wù),從而將 ui 選擇事件告之監(jiān)聽器。選擇監(jiān)聽器必須注冊到選擇服務(wù)。

  用于顯示可選擇的 ui 項的視圖還應(yīng)該能夠公布 ui 選擇。視圖通過將 “選擇提供器” 注冊到它們各自的工作臺站點來實現(xiàn)這一點。eclipse 中的每個 ui 部分通過 org.eclipse.ui.iworkbenchpartsite 引用與工作臺站點聯(lián)絡(luò)。選擇提供器注冊到工作臺站點。

  在使用選擇提供器 - 選擇監(jiān)聽器模式鏈接視圖時,視圖可以將本身作為監(jiān)聽器添加到工作臺頁面,而希望公布選擇的其他視圖必須將選擇提供器添加到它們各自的工作臺站點。org.eclipse.ui.iselectionlistener 接口如下所示。

public void selectionchanged(iworkbenchpart part, iselection selection);

  要使視圖能夠監(jiān)聽選擇改變,視圖必須實現(xiàn) iselectionlistener 接口并必須將自己注冊到工作臺頁面。清單 1 顯示一個例子。

  清單 1. 將選擇監(jiān)聽器添加到工作臺頁面

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 選擇的更好的方法是,將消費者視圖作為監(jiān)聽器注冊到特定的視圖部分。正如在下面的例子中可以看到的,源視圖部分的視圖 id 在注冊選擇監(jiān)聽器期間被作為一個參數(shù)。

getsite().getpage().addselectionlistener("sampleviewid",(iselectionlistener)this);

  這種方式可以避免對消費者視圖進(jìn)行多余的回調(diào),如果視圖被注冊為非特定的監(jiān)聽器,就會出現(xiàn)這種情況。 清單 2 中的代碼片段顯示一個視圖的 createpartcontrol() 方法,這個方法創(chuàng)建一個 jface tableviewer 并將它作為選擇提供器添加到工作臺站點。這些代碼使 tableviewer 中的任何 ui 選擇改變能夠傳播到頁面,并最終傳播到對這種事件感興趣的消費者視圖。

  清單 2. 設(shè)置選擇提供器

public void createpartcontrol(composite parent) {
// set up a jface viewer
viewer = new tableviewer(parent, swt.multi | swt.h_scroll | swt.v_scroll);
viewer.setcontentprovider(new viewcontentprovider());
viewer.setlabelprovider(new viewlabelprovider());
viewer.setsorter(new namesorter());
viewer.setinput(getviewsite());

// add the jface viewer as a selection provider to the view site.
getsite().setselectionprovider(viewer);

}

  這個視圖將它創(chuàng)建的 jface tableviewer 注冊為選擇提供器有兩個原因:

  這個視圖打算使用這個 tableviewer 顯示信息,而且用戶將與 tableviewer 進(jìn)行交互。

  tableviewer 實現(xiàn)了選擇提供器接口并能夠向工作臺部分站點傳播選擇事件。

  因為 jface 查看器是選擇提供器,所以在大多數(shù)情況下就不必創(chuàng)建選擇提供器了。視圖只需使用眾多的 jface 查看器之一來顯示信息,并將 jface 查看器注冊為選擇提供器。

  另一種鏈接方式

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

  信息量可能太大,由于內(nèi)存使用量增加,ui 選擇對象無法有效地容納它。

  視圖可能希望公布其他信息,而不只是公布可視化選擇信息。公布的信息可能是根據(jù)選擇進(jìn)行某些后期處理的結(jié)果。

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

  可以使用 org.eclipse.core.runtime.iadaptable 接口來緩解第一個問題,這個接口使選擇對象能夠在需要時傳播更多信息。第二個和第三個問題需要用手工方式解決,屬性改變監(jiān)聽器模式是合適的解決方案。

  使用 iadaptable 接口

  實現(xiàn) iadaptable 接口的類能夠動態(tài)地返回某些類型的適配器,然后可以使用這些適配器獲取更多信息。如果查看器中的選擇對象實現(xiàn)了 iadaptable 接口,那么根據(jù)它們可以返回的適配器類型,可以有效地獲取更多信息或相關(guān)信息。org.eclipse.core.runtime.iadaptable 接口如下所示。

public void object getadapter(class adapter);

  顯然,調(diào)用者應(yīng)該知道它期望選擇返回的適配器接口類型。考慮一個 jface treeviewer,它在一個單層的樹中顯示城市。代表城市的對象是 cityclass 類型的。cityclass 對象應(yīng)該包含關(guān)于此城市的基本信息,并只在需要時返回詳細(xì)信息。在清單 3 中要注意,cityclass 支持的適配器類型使調(diào)用者能夠在需要時獲得更多信息。

  清單 3. jface treeviewer 中的 cityclass

class cityclass implements iadaptable {
 private string cityname;

 public cityclass(string name) {
  this.name = name;
 }
 public string getname() {
  return name;
 }
 public cityclass getparent() {
  return parent;
 }
 public string tostring() {
  return getname();
 }
 public object getadapter(class key) {
  if (key.getname().equals("itransportationinfo"))
   return cityplugin.getinstance().gettransportadapter();
  else (key.getname().equals("iplacesinfo"))
   return cityplugin.getinstance().getplacesadapter();
  return null;
 }
}

  熟悉 eclipse ide 工作臺的開發(fā)人員都了解 outline 視圖,這個視圖提供了編輯器中打開的文件的結(jié)構(gòu)化視圖。這個 outline 視圖展示了 iadaptable 接口如何與某些事件類型結(jié)合使用,從而有效地根據(jù)其他視圖的內(nèi)容對視圖進(jìn)行初始化。編輯器必須為用戶打開的文件創(chuàng)建一個 content outline 頁面。content outline 頁面符合 icontentoutlinepage 接口。編輯器還必須實現(xiàn) iadaptable 接口,這樣就能夠向編輯器查詢 icontentoutlinepage 類型的適配器。使用這個適配器來獲取和顯示文件的大綱信息。

  iadaptable 接口的另一個例子是 properties 視圖。properties 視圖跟蹤對活動部分的選擇,并調(diào)用當(dāng)前選擇對象上的 getadapter 方法。查詢的適配器類型是 ipropertysource。然后,properties 視圖使用 ipropertysource 適配器來獲取要顯示的信息。

  在這些視圖鏈接例子中,應(yīng)用程序在接到 selection changed 或 part activation 通知時,通過 iadaptable 獲取信息。因此,如果選擇對象實現(xiàn)了 iadaptable,那么與從選擇對象本身獲取的信息量相比,用戶可以通過適配器獲得多得多的信息。

  屬性改變監(jiān)聽器范型

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

  可以建立一個插件來接受屬性改變監(jiān)聽器的注冊,并在需要時通知注冊的監(jiān)聽器。應(yīng)用程序可以將定制的事件告之監(jiān)聽器,事件中還可以包含要共享的信息。

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

  清單 4. 添加和刪除屬性改變監(jiān)聽器

//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);

  屬性提供器應(yīng)該使用 org.eclipse.jface.util.propertychangeevent 來創(chuàng)建一個可以有效填充和傳播的事件。另外,屬性提供器要負(fù)責(zé)維護(hù)監(jiān)聽器列表并對它們進(jìn)行回調(diào)。

  作為一個例子,請考慮一個每小時調(diào)用 world weather web service 來查詢主要城市的氣象的插件,它要使這些信息可供其他插件和視圖使用。cityweatherplugin 可以公開一個稱為 citiesweatherxml 的屬性,消費者可以將本身作為 propertychange 監(jiān)聽器注冊到 cityweatherplugin。為此,監(jiān)聽器必須了解 cityweatherplugin 中的注冊方法,這樣才能將本身注冊為氣象數(shù)據(jù)事件的監(jiān)聽器。cityweatherplugin 應(yīng)該跟蹤并通知監(jiān)聽器。它使用 propertychangeevent 向監(jiān)聽器提供數(shù)據(jù)。

  清單 5. 創(chuàng)建屬性提供器

class citypopulationplugin {
 arraylist mylisteners;

 // a public method that allows listener registration
 public void addpropertychangelistener(ipropertychangelistener listener) {
  if(!mylisteners.contains(listener))
   mylisteners.add(listener);
 }

 // a public method that allows listener registration
 public void removepropertychangelistener(ipropertychangelistener listener) {
  mylisteners.remove(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 = listeners.iterator(); iter.hasnext();) {
   ipropertychangelistener element = (iproperty/
   changelistener) iter.next();
   element.propertychange(new propertychangeevent(this, /"citiesweatherxml" , null , cityweatherxmlobj));
  }
 }
}

  屬性改變監(jiān)聽器必須實現(xiàn) org.eclipse.jface.util.ipropertychangelistener 接口,以便允許屬性改變提供器對它進(jìn)行回調(diào)。這個接口有一個方法 public void propertychange(propertychangeevent event)。

  清單 6. 實現(xiàn) ipropertychangelistener

class myview implements ipropertychangelistener {

 public void createpartcontrol() {
  //register with a known plugin that sources population data
  citypopulationplugin.getinstance().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( event.getproperty().equals("citiesweatherxml")) {
   object val = event.getnewvalue();
   // do something with val
  }
 }
}

  這種方式的靈活性在于,應(yīng)用程序可以在需要時通知監(jiān)聽器,并根據(jù)各種場景向它們傳遞信息。傳遞的信息不必直接與 ui 選擇相關(guān);這些信息可以是某些后期處理的結(jié)果。另外,它可以與其他后臺作業(yè)的狀態(tài)相關(guān),或者是定期從模型中獲取的最新信息。例如,city selector view 可能不只是傳播選擇的城市,還使用 propertychange 范型將當(dāng)前選擇的城市的氣象信息異步地傳播給其他消費者。

  結(jié)束語

  本文討論了使視圖相互協(xié)作和響應(yīng)的各種方式。如果 ui 選擇本身不夠,可以使用 iadaptable 接口加強(qiáng)它們。屬性改變監(jiān)聽器也為滿足非 ui 場景提供了更大的靈活性。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛川县| 潢川县| 深州市| 突泉县| 杨浦区| 安溪县| 阳高县| 宜良县| 教育| 花莲市| 犍为县| 宁强县| 彭阳县| 大英县| 保德县| 泗水县| 长武县| 宿州市| 盐源县| 隆德县| 乳山市| 普陀区| 于都县| 成武县| 钦州市| 汉沽区| 定襄县| 剑阁县| 鞍山市| 许昌市| 凌源市| 大厂| 长丰县| 海林市| 甘孜| 乐安县| 贵港市| 郁南县| 贡觉县| 尼木县| 雷山县|