当视图之间有联系时,当关掉某个视图时,其他视图怎样知道并作出一些动作,找了很久,找到一些资料,加上自己的总结,放上来。
先转载这篇资料,来自:http://blog.csdn.net/starshus/archive/2006/01/04/570540.aspx
-----------------------------------------------------------------------------------------------
1.判断这个view当前是否为active的好方法:
private boolean isActivePart() {
IWorkbenchPart part = getViewSite().getPage().getActivePart();
return part != null && part.equals(this);
}
2.自己的rcp程序里有多个view,它们之间是有联系的,如果关掉其中一个view时,
要做些事,怎么知道它是什么时候关掉的呢?我在rcp的新闻组上找到了答案:
关掉Editor或Viewer时调用自己逻辑的方法:
1)如果是editor,那么让它实现org.eclipse.ui.ISaveablePart2接口.
2)如果是view,在view class里面加上下面这个方法,并且调用它,比如:
在ViewPart#init()里面:
private void initPartListener() {
getSite().getPage().addPartListener(new IPartListener() {
public void partOpened(IWorkbenchPart part) {
if (part != YourPartView.this) {
return;
} else {
// your logics
}
}
public void partDeactivated(IWorkbenchPart part) {
if (part != YourPartView.this) {
return;
} else {
// your logics
}
}
public void partClosed(IWorkbenchPart part) {
if (part != YourPartView.this) {
return;
} else {
// your logics
}
}
public void partBroughtToTop(IWorkbenchPart part) {
if (part != YourPartView.this) {
return;
} else {
// your logics
}
}
public void partActivated(IWorkbenchPart part) {
if (part != YourPartView.this) {
return;
} else {
// your logics
}
}
});
}
或者这样写也可以:
让这个view类实现PartListener接口
然后在这个view的createPartControl()里加上:
getViewSite().getPage().addPartListener(this);
或是这样写:
public void createPartControl(Composite parent) {
getSite().getWorkbenchWindow(). getPartService().addPartListener(this);
}
public void dispose() {
getSite().getWorkbenchWindow(). getPartService().removePartListener(this);
}
注意:
1)Views也能实现ISaveablePart2
2)在view关闭时要做什么事时,建议就用IPartListener2
3)View上的X是与关闭动作关联在一起的,要用别的方法达到目的你只有写自己的
关闭动作.
4)ISaveablePart有意义吗?
当然有,有些程序的data model在view上,它们能被修改,所以它们必须有在view
关闭时保存的能力.(所以用户的修改不会丢失)
有些时候editors不适合展示数据model.
-----------------------------------------------------------------------------------------------
以上文章转载自:http://blog.csdn.net/starshus/archive/2006/01/04/570540.aspx 感谢原作者。
实际使用中,发现其实有两个,IPartListener 和 IPartListener2 ,都在包org.eclipse.ui中。他们的区别在于IPartListener2 更加丰富一些,多了 Hidden,Visible,InputChanged 这三个事件,而且参数也有区别。
IPartListener 里面的方法的参数为 :IWorkbenchPart part
IPartListener2 里面的方法的参数为:IWorkbenchPartReference partRef
当使用 IPartListener2 时,要获取到part,这样就行: partRef.getPart(false)
关于IPartListener(2)结合view或action使用的方式,转载的文章已经讲得很清楚了,感觉不错,谢谢原作者。
在action中,我是在构造函数和dispose函数中分别加入和取消的,代码如下:
public class MenuHandler extends AbstractHandler implements ISelectionChangedListener , IPartListener {
/** *//**
* The constructor.
*
* @throws EngineException
*/
public MenuHandler() {
AuditPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
.getActivePage().addPartListener(this);
}
@Override
public void dispose() {
AuditPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
.getActivePage().removePartListener(this);
super.dispose();
}
@Override
public void partActivated(IWorkbenchPart part) {
System.out.println();
}
@Override
public void partBroughtToTop(IWorkbenchPart part) {
// TODO Auto-generated method stub
System.out.println();
}
@Override
public void partClosed(IWorkbenchPart part) {
// TODO Auto-generated method stub
}
@Override
public void partDeactivated(IWorkbenchPart part) {
// TODO Auto-generated method stub
}
@Override
public void partOpened(IWorkbenchPart part) {
// TODO Auto-generated method stub
if (part instanceof MyShootView) {
((MyShootView) part)
.addSelectionChangedListener(this);
}
}
不过需要注意,eclipse里面有些视图,例如 ContentOutline视图即大纲视图,当你第一次打开它,会触发partOpen 事件,然后立刻触发 partVisible 事件,当你再关掉它,则只会触发 partHidden 事件,而不会触发close。所以他们实际上是没有真正的关闭,当第一次打开以后,都会一直存在,知道eclipse退出。
而用户自己建立的view,好像就不是这样运作的,当第一次打开的时候,会触发open和visible事件,当关闭时,会触发hidden和close事件。
这种情况,就要使用IPartListener2来实现了。