View EclipseRCP-如何以编程方式创建和打开视图?

View EclipseRCP-如何以编程方式创建和打开视图?,view,eclipse-plugin,swt,eclipse-rcp,View,Eclipse Plugin,Swt,Eclipse Rcp,我想在执行操作时打开一个包含表的视图 我可以通过以下代码按viewId打开视图: display.asyncExec(new Runnable(){ public void run() { ApplicationGIS.getView(true, viewId); }}); 此视图的id在plugin.xml上定义,但我必须将一些参数传递给此视图上的表。我可以通过编程创建自定义视图,但这次我无法打开它,因为我没有它的id。这是我的视图类: p

我想在执行操作时打开一个包含表的视图

我可以通过以下代码按viewId打开视图:

    display.asyncExec(new Runnable(){

        public void run() {
        ApplicationGIS.getView(true, viewId);

    }});
此视图的id在plugin.xml上定义,但我必须将一些参数传递给此视图上的表。我可以通过编程创建自定义视图,但这次我无法打开它,因为我没有它的id。这是我的视图类:

public class MyCustomView extends ViewPart {

    private Text text;
    private Table table;
    private TableViewer tableViewer;


    @Override
    public void createPartControl(Composite parent) {
        // TODO Auto-generated method stub
        parent.setLayout(new GridLayout(4, false));

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
        composite.setLayout(new GridLayout(2, false));

        text = new Text(composite, SWT.BORDER);
        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        Composite composite_1 = new Composite(composite, SWT.NONE);
        composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
        GridLayout gl_composite_1 = new GridLayout(1, false);
        gl_composite_1.horizontalSpacing = 0;
        gl_composite_1.marginHeight = 0;
        gl_composite_1.marginWidth = 0;
        gl_composite_1.verticalSpacing = 0;
        composite_1.setLayout(gl_composite_1);

        tableViewer = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION);

        table = tableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
    }

    @Override
    public void setFocus() {
        // TODO Auto-generated method stub

    }
}

那么,如何访问这个以编程方式创建的视图并将其打开呢?

在Eclipse 3.x中,您可以像这样打开一个视图:

MyView view = (MyView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(viewer_ID);
或者,如果要实现命令处理程序,可以调用:

HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().showView(viewId);
要设置某些内容,只需将void setInputMyContent input之类的方法添加到ViewPart,并在打开该方法后将所需参数传递给该方法

来自@Chriss-answer

我在我的视图中添加了一个方法setInputparameter,然后我可以像这样将我的值传递给我的自定义视图

    MyCustomView view = new MyCustomView();     
    view.setInput(parameter);
    display.asyncExec(new Runnable(){

        public void run() {
        ApplicationGIS.getView(true, viewId);


    }});

这就行了。

我也有同样的问题。我想从插件中注册的视图创建其他视图。这些URL将为您提供您想要的:


您使用的是3.x还是4.x版本的Eclipse?我使用的是3.x。顺便说一句,我会试试你的答案,谢谢。什么是MyView的查看器=MyView查看器?。我试着这样做:MyView view=MyView PlatformUI.getWorkbench.getActiveWorkbenchWindow.getActivePage.showViewviewer\u ID;但它抛出了空指针异常。抱歉,这是一个输入错误!NPE的出现可能是因为没有在UI线程中调用,或者工作台还没有启动。尝试用DisplayasyncExec包装代码。。或者WorkbenchJob.RCP视图有很大的限制,因为它们是由工作台实例化的,不支持手动实例化,因此无法使用抽象方法。是的,创建后可以通过方法传递参数,但不能从视图返回值!视图应该由扩展点创建,而不是由您自己创建。否则您以后可能会遇到一些麻烦。如果我的答案有效,请随意将其标记为answeredRCP视图由工作台实例化。。。我不懂你的密码!为什么要实例化视图?您应该在打开视图后找到它,然后设置输入。。。您的代码根本不应该工作:\n该问题解决了将参数传递给已创建视图的另一个问题。您的答案显示了如何使用视图的secondaryId打开同一视图的多个实例
PlatformUI.getWorkbench().getActiveWorkbenchWindow().
getActivePage().showView(String viewID,String secondaryID,int Mode);