需求如题,解决如下:
一、1.首先在Perspective类的public void createInitialLayout(IPageLayout layout)方法中将你需要动态加载的视图指定在固定区域:
// *****************
地图
视图*********************
IFolderLayout folderLayout = layout.createFolder("topRight", IPageLayout.RIGHT, 0.77f,editorArea);
folderLayout.addView(IEView.ID);
// 设置地图视图不能关闭、不能拖动
layout.getViewLayout(IEView.ID).setCloseable(false);
layout.getViewLayout(IEView.ID).setMoveable(false);
//将需要动态加载的视图指定在固定区域(与地图视图在同一个区域)
folderLayout.addPlaceholder(RegionListView.ID);
folderLayout.addPlaceholder(OperationAreaView.ID);
folderLayout.addPlaceholder(EquipmentView.ID);
folderLayout.addPlaceholder(RightView.ID);
folderLayout.addPlaceholder(ProjectInfoView.ID);
..............................
2.在你需要动态加载的视图中加上如下方法:
private Composite container;
public void show() {
if (container != null && container.isDisposed()) {
container.setVisible(true);
}
}
其中container即为你在视图中的public void createPartControl(Composite parent)方法中写的
container = new Composite(parent, SWT.NONE|SWT.EMBEDDED);只是将container设为全局变量
3.在需要动态加载视图的地方的事件或者Action的Run方法中加上如下
代码
:
IWorkbenchPage workbenchPage = getViewSite().getPage();
try {
DeviceListView deviceListView = (DeviceListView) workbenchPage.showView(DeviceListView.class.getName());
eviceListView.show();
} catch (PartInitException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
其中DeviceListView即为需要动态加载的视图,即可完成你所需要的功能。
二、上述方法能实现动态的指定往某个区域添加视图,但是不能实现多次添加同一个视图,即如果该视图已打开,则仅仅激活已打开的视图,而不会重新打开一个新的同样的视图。所以可以在打开视图之前去判断视图是否已经打开,如果已经打开,则先将其销毁掉,再重新打开
具体如下:
IWorkbenchPage workbenchPage = getViewSite().getPage();
try
{
//如果直放站管理页面已经打开,则将其销毁掉
IViewPart thisView = workbenchPage.findView(DeviceListView.ID);
if(thisView!=null){
workbenchPage.hideView(thisView);
thisView.dispose();
}
//重新创建直放站管理页面
DeviceListView deviceListView = (DeviceListView) workbenchPage.showView(DeviceListView.class.getName());
eviceListView.show();
}
catch (PartInitException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
我也觉得这个方法有点麻烦,并且不能实现多次添加同一个视图,只是针对不同的需求,上述方法都可灵活选择应用。
三、view可以设置allowMultiable,除了viewId以外,还可以有一个seconaryId,用于打开多个view时使用,Eclipse 新建plugin project的那个Email例子就是一个很好的实例。
首先,在plugin.xml中找到可以设置allowMultiable,将其设置为true
其次在需要打开试图的Action里的run方法中写上如下代码:
if(window != null) {
try {
window.getActivePage().showView(viewId, Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);
} catch (PartInitException e) {
MessageDialog.openError(window.getShell(), "Error", "Error opening view:" + e.getMessage());
}
}
以上介绍了三点,在不同的需求下,会有不同的解决方法,相信需求是多变的,方法是灵活的。欢迎交流学习!