最大的网站源码资源下载站,
丰富的 gui 中的视图可以以各种方式显示信息,从而改善用户体验。非常自然,ui 视图之间是相互依赖的,需要进行交互。eclipse 简化了链接 ui 视图的工作,并提供了将视图链接应用到非 ui 场景的方式。public void selectionchanged(iworkbenchpart part, iselection selection);
要使视图能够监听选择改变,视图必须实现 iselectionlistener 接口并必须将自己注册到工作台页面。清单 1 显示一个例子。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!
}
}
getsite().getpage().addselectionlistener("sampleviewid",(iselectionlistener)this);
这种方式可以避免对消费者视图进行多余的回调,如果视图被注册为非特定的监听器,就会出现这种情况。 清单 2 中的代码片段显示一个视图的 createpartcontrol() 方法,这个方法创建一个 jface tableviewer 并将它作为选择提供器添加到工作台站点。这些代码使 tableviewer 中的任何 ui 选择改变能够传播到页面,并最终传播到对这种事件感兴趣的消费者视图。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);
}
这个视图将它创建的 jface tableviewer 注册为选择提供器有两个原因:
这个视图打算使用这个 tableviewer 显示信息,而且用户将与 tableviewer 进行交互。
tableviewer 实现了选择提供器接口并能够向工作台部分站点传播选择事件。
因为 jface 查看器是选择提供器,所以在大多数情况下就不必创建选择提供器了。视图只需使用众多的 jface 查看器之一来显示信息,并将 jface 查看器注册为选择提供器。
另一种链接方式
某些情况需要另一种视图链接方式:
信息量可能太大,由于内存使用量增加,ui 选择对象无法有效地容纳它。
视图可能希望公布其他信息,而不只是公布可视化选择信息。公布的信息可能是根据选择进行某些后期处理的结果。
视图可能希望使用来自另一个插件的信息,而这个插件可能根本没有提供视图(使用包含的 jface 查看器)。在这种情况下,使用基于 ui 选择的链接是不可能的。
可以使用 org.eclipse.core.runtime.iadaptable 接口来缓解第一个问题,这个接口使选择对象能够在需要时传播更多信息。第二个和第三个问题需要用手工方式解决,属性改变监听器模式是合适的解决方案。
使用 iadaptable 接口
实现 iadaptable 接口的类能够动态地返回某些类型的适配器,然后可以使用这些适配器获取更多信息。如果查看器中的选择对象实现了 iadaptable 接口,那么根据它们可以返回的适配器类型,可以有效地获取更多信息或相关信息。org.eclipse.core.runtime.iadaptable 接口如下所示。
public void object getadapter(class adapter);
显然,调用者应该知道它期望选择返回的适配器接口类型。考虑一个 jface treeviewer,它在一个单层的树中显示城市。代表城市的对象是 cityclass 类型的。cityclass 对象应该包含关于此城市的基本信息,并只在需要时返回详细信息。在清单 3 中要注意,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;
}
}
//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);
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));
}
}
}
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
}
}
}
新闻热点
疑难解答