【问题标题】:Eclipse RCP - How to create and open View programmatically?Eclipse RCP - 如何以编程方式创建和打开视图?
【发布时间】:2013-03-02 15:00:21
【问题描述】:

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

我可以通过该代码按 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 或 4.x?
  • 我使用的是 3.x。顺便说一句,我会尝试你的答案,谢谢。

标签: java view eclipse-plugin swt eclipse-rcp


【解决方案1】:

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

MyView view = (MyView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(viewer_ID);

或者如果你正在实现一个命令处理程序,你可以调用:

HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().showView(viewId);

要设置一些内容,您只需将void setInput(MyContent input) 之类的方法添加到您的 ViewPart 并在打开该方法后将所需的参数传递给该方法。

【讨论】:

  • MyView view = (MyView Viewer) 的查看器是什么?我试过这样MyView view = (MyView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(viewer_ID);,但它抛出了空指针异常。
  • 对不起,这是一个错字! NPE 出现可能是因为未在 UI-Thread 中进行调用或工作台尚未启动。尝试使用 Display#asyncExec(..) 或 WorkbenchJob 包装代码。
  • RCP 视图有很大的局限性,因为它们是由工作台实例化的,不支持手动实例化(不能使用抽象方法)。是的,您可以在创建后通过方法传递参数,但不能从视图返回值!
【解决方案2】:

我遇到了完全相同的问题。我想从插件中注册的视图创建额外的视图。这些 URL 将为您提供您想要的:

http://wiki.eclipse.org/FAQ_How_do_I_open_multiple_instances_of_the_same_view

http://www.java-tips.org/other-api-tips/eclipse/how-to-create-multiple-instances-of-one-viewpart.html

PlatformUI.getWorkbench().getActiveWorkbenchWindow().
getActivePage().showView(String viewID,String secondaryID,int Mode);

【讨论】:

  • 该问题解决了另一个问题(将参数传递给创建的视图)。您的答案显示了如何打开同一视图的多个实例(使用视图的“secondaryId”)
【解决方案3】:

来自@Chriss 的回答;

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

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

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


    }});

这行得通。

【讨论】:

  • 视图应该由扩展点创建,而不是你自己。否则你以后可能会遇到麻烦。
  • 如果我的回答有效,请随时将其标记为“已回答”
  • RCP 视图由工作台实例化......我不明白你的代码!为什么要实例化视图?您应该在打开视图后找到视图,然后设置“输入”...您的代码根本不应该工作:\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2010-10-26
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多