EclipseRCP开发之动态的加入视图

本文详细介绍了如何在Eclipse RCP应用中动态地加入视图。首先在Perspective类中指定视图位置,然后通过视图的show方法控制显示,最后在需要时销毁并重新打开视图。同时提到了allowMultiple属性和secondaryId的使用,以应对多个相同视图的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求如题,解决如下:

一、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());
   }
  }

以上介绍了三点,在不同的需求下,会有不同的解决方法,相信需求是多变的,方法是灵活的。欢迎交流学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值