我正在创建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) { ... }
StudentReviewView:
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打印为null。
我是否缺少明显的东西?
谢谢!
为什么您提到的链接上接受的答案不能解决您的问题? 如果在调用showView之后将userId发送到StudentReviewView,它将在打开后立即填充,不是吗?
实际上,我将学生数据存储在名称为.xml的XML文件中。 在审阅视图的createPartControl()中,我将解组相应的XML文件并填充组件。 为此,我在调用createPartControl()时需要有StudentId。 在这种情况下,我将学生ID设置为null,因为在发送学生ID之前调用了createPartControl()。 我已经更新了我的问题。 PS:我已经将变量名从userId更改为StudentId。
这是个不错的链接,试试看。
感谢您的链接。 它有很多有用的信息。 不幸的是,由于我没有使用E4,因此上述方法不能满足我的要求。 另外我不确定是否可以使用事件处理机制,因为在显示它之前View2需要该值。
当activePage.showView(viewIdToOpen)打开视图时,平台调用createPartControl。 因此,请勿在createPartControl上填充字段。 调用setStudentId时执行此操作。
谢谢。 将尝试这种方法。
我也遇到了这个问题。 通过重新打包需要更新的特定视图组件,找到了解决之道。
这是设置字符串的概念证明:
设置器界面:
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");