2013-03-14 104 views
0

我想在执行操作时打开包含表格的视图。Eclipse RCP - 如何以编程方式创建和打开View?

我可以viewId通过代码开放的观点:在plugin.xml中定义

display.asyncExec(new Runnable(){ 

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

    }}); 

这种观点的ID,但我要传递一些参数表上的这一观点。我可以以编程方式创建自定义视图,但是这次我无法打开它,因为我没有它的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 

    } 

} 

那么如何访问这个编程创建的视图并打开它?

+0

什么Eclipse版本你使用3.x或4.x的? – Chriss 2013-03-14 10:50:12

+0

我正在使用3.x.顺便说一句,我会尝试你的答案,谢谢。 – cgrgcn 2013-03-14 11:28:19

回答

7

在Eclipse 3.x中,你可以打开这样的一个观点:

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

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

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

设定一些内容,您可以只需在您的ViewPart中添加一个像void setInput(MyContent input)这样的方法,并在打开它之后将所需的参数传递给此方法。

+0

“MyView view =(MyView Viewer)”上的查看器是什么?我尝试像这样'MyView view =(MyView)PlatformUI.getWorkbench()。getActiveWorkbenchWindow()。getActivePage()。showView(viewer_ID);'但它抛出空指针异常。 – cgrgcn 2013-03-14 11:38:43

+0

对不起,这是一个错字! NPE可能是因为调用不是在UI线程中完成的,或者工作台尚未启动。试着用'Display#asyncExec(..)'或WorkbenchJob来包装代码。 – Chriss 2013-03-15 08:56:29

+0

RCP视图有一个很大的限制,因为它们是由工作台实例化的,并且不支持手动实例化(抽象方法不能使用)。是的,您可以在创建后通过方法传递参数,但不能从视图返回值! – marcolopes 2017-03-31 18:17:12

0

From @Chriss answer;

我添加了一个方法setInput(parameter)我的看法,然后我可以通过我的价值观我的自定义视图这样

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

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


    }}); 

和工作原理。

+1

视图应该由扩展点创建,而不是由您自己创建。否则,以后可能会遇到一些麻烦。 – Chriss 2013-03-15 09:02:11

+0

是的,你说得对。 – cgrgcn 2013-03-15 13:30:51

+0

如果我的答案可以随意标记为“回答” – Chriss 2015-10-23 07:12:11

1

我有完全相同的问题。我想从插件中注册的视图创建更多视图。这些网址会得到你想要的东西:

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); 
+0

该问题解决了另一个问题(将参数传递到创建的视图)。您的答案显示了如何打开相同视图的MULTIPLE实例(使用视图的“secondaryId”) – marcolopes 2017-03-31 18:26:43

相关问题