1

我正在创建 Eclipse RCP 应用程序,并且在显示视图时被传递参数卡住了。作为第一种方法,我尝试从 View1 在 View2 中设置一个静态变量并打开该视图(如下所示)。有用。

IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();               
String viewIdToClose = studentListView.ID;
IViewPart viewToClose = activePage.findView(viewIdToClose);
TableItem item = studentTable.getItem(studentTable.getSelectionIndex());
String text = item.getText(ListViewConstants.TABLE_COLUMN_ONE);
activePage.hideView(viewToClose);
try {
    String viewIdToOpen = StudentReview.ID;
    StudentReview.userId = text;
     activePage.showView(viewIdToOpen);                 
} catch (PartInitException e) {...}

由于这似乎不是一个好方法,我按照以下链接中提到的建议进行了尝试(接受的答案)。 将参数传递给视图 。在这种方法中,我们只能在显示视图后传递参数。

但我遇到的问题是,在调用 showView() 时,要打开的视图应该具有选定行的值,即,我想根据视图 1 的选择填充视图 2 中的参数。有什么办法可以做到这一点?使用 PULL 代替 PUSH 方法好吗?任何建议表示赞赏。谢谢!!!

更新1:将参数传递给视图 接口中提到的方法:

public interface ICommunicationView extends IViewPart{
   public void accept(Object parameter);
}

调用accept():

IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
String viewIdToClose = StudentListView.ID;
IViewPart viewToClose = activePage.findView(viewIdToClose);
TableItem item = studentTable.getItem(studentTable.getSelectionIndex());
String text = item.getText(ListViewConstants.TABLE_COLUMN_ONE);
activePage.hideView(viewToClose);
try {
   String viewIdToOpen = StudentReview.ID;
   ICommunicationView viewToOpen = (ICommunicationView) activePage.showView(viewIdToOpen);
   viewToOpen.accept(text);//Sending userId to Review view
} catch (PartInitException e) { ... }

学生评论查看:

private String studentId;
//getters and setters
@Override
public void accept(Object parameter) {
  setStudentId(parameter.toString());
}

public void createPartControl(final Composite parent) {
   ...
  System.out.println("Student Id" + this.getStudentId());    
}

它将学生 ID 打印为空。

我错过了一些明显的东西吗?

谢谢!

4

3 回答 3

2

这是好的链接试试这个..

http://tomsondev.bestsolution.at/2011/02/07/enhanced-rcp-how-views-can-communicate-the-e4-way/

于 2013-06-20T07:07:45.863 回答
1

createPartControl当视图被打开时平台调用activePage.showView(viewIdToOpen)。所以不要在createPartControl. 在setStudentId被调用时执行。

于 2013-06-20T15:25:44.653 回答
0

我也遇到了这个问题。通过重新打包需要更新的特定视图组件找到了解决方法。这是一个设置字符串的概念证明:

设置器接口:

public interface ViewSetter {    
    void setMessage(String message); 
}

被初始化的视图:

//view that implements ViewSetter  

@Override
public void createPartControl(Composite parent) {       
    label = new Label(parent, SWT.NONE); //label is a field
}

@Override
public void setMessage(final String message) {
    Display.getDefault().syncExec(new Runnable() {  
        @Override
        public void run() {
            label.setText(message);
            label.pack(true);
        }
    });
}

创建和初始化视图的代码:

IViewPart view = page.showView(viewID);
ViewSetter viewSetter = (ViewSetter)view;
viewSetter.setMessage("Hello World");
于 2014-02-03T22:37:45.617 回答