带有窗体的Eclipse RCP视图不刷新



我正在学习如何使用表单创建Eclipse RCP应用程序,并正在构建一个简单的原型。我在Windows x64平台上使用64位Eclipse 3.7和Java 1.7。

我尝试做的是相当标准的:应用程序左侧的视图包含一个树(ViewTree),右侧的视图(ViewDetail)使用eclipse表单来显示有关树选择的详细信息。我将ViewTree设置为选择提供者,并且将ViewDetail设置为监听ViewTree。我希望ViewDetail用每一个新的树选择来刷新自己。

以下是ViewTree:的相关代码

public class ViewTree extends ViewPart
{
private TreeViewer treeViewer;
public ViewTree() {
super();
}
@Override
public void createPartControl(Composite parent) {
treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
getSite().setSelectionProvider(treeViewer);
treeViewer.setLabelProvider(new TreeObjLabelProvider());
treeViewer.setContentProvider(new TreeObjContentProvider());
}

以下是ViewDetail:的相关代码

public class ViewDetail extends ViewPart implements ISelectionListener 
{
private FormToolkit toolkit;
private ScrolledForm form;
private Composite compParent;
public ViewDetail() {}
@Override
public void createPartControl(Composite parent) {
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createScrolledForm(parent);
compParent = parent;
// register as a selection listener with the workbench
getSite().getPage().addSelectionListener(ViewTree.ID, (ISelectionListener) this);
}

因为我希望ViewDetail中的表单擦除自身,并为每个新选择重新绘制新信息,所以在ViewDetail的selectionChanged(IWorkbenchPart part, ISelection selection)函数中,我调用form.dispose();擦除它,然后使用以下方法重新创建表单:form = toolkit.createScrolledForm(compParent);然后我确定选择了什么类型的对象,并相应地构建表单。

问题是,一旦我在树中选择了一个对象,我的表单就会被丢弃,ViewDetail就会变为空白。在调整窗口大小之前,视图中不会显示任何内容。表单构建完成后,我会尝试通过调用来刷新它:form.getBody().layout();但这似乎于事无补。关于下一步该做什么有什么想法吗?

直接执行form.layout(true)

你甚至可以试试form.reflow()

编辑:

关于这个主题的进一步阅读,请点击此处。阅读"倾听事件"部分。

我可以通过调用来重新绘制表单,而无需调整大小

compParent.layout();

所以我使用layout命令是正确的,我只需要在顶层调用它——父Composite,而不是窗体,它是父Composite的子级。感谢@GGeorge的帮助。

最新更新