如何更新/刷新eclipse插件中的视图?

我有一个带有单一视图eclipse插件 (比如eclipse helloworld-view-plugin-project)。 在视图文件中, 当我想要更新视图时,我会收到一个事件

在此视图中,我在具有多个标签的组中具有GridData。 我有几个服务注册到程序,其状态应显示在此GridData中。

编辑:为了更好地显示我的问题,我更新了这篇文章并添加了整个代码:


的createPartControl():

public void createPartControl(Composite _parent) { parent = _parent; createContents(); addBindings(); makeActions(); contributeToActionBars(); } 

CreateContents():

 protected void createContents() { // fixed checkIcon = //... errorIcon = //... smallFont = SWTResourceManager.getFont("Segoe UI", 7, SWT.NORMAL); // content gl_shell = new GridLayout(1, false); //margins, etc. for gl_shell parent.setLayout(gl_shell); final Label lblGreeting = new Label(parent, SWT.NONE); lblGreeting.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1)); lblGreeting.setText("Hi " + Preferences.getPreName()); // -- GROUP YOUR STATS (show all services) createStatusGroupBox(); } 

createStatusGroupBox():

 private Group grpYourStatus = null; // outside the method for access in listener (below) private void createStatusGroupBox() { grpYourStatus = new Group(parent, SWT.NONE); grpYourStatus.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1)); grpYourStatus.setText("Your upload status"); grpYourStatus.setLayout(new GridLayout(3, false)); // add message if no service is registered if ( r.getServiceList().size() == 0 ) { Label status = new Label(grpYourStatus, SWT.NONE); status.setText("No service registered."); new Label(grpYourStatus, SWT.NONE); //empty new Label(grpYourStatus, SWT.NONE); //empty } // add labels (status, message, name) for each registered service for ( IRecorderObject service : r.getServiceList() ) { Label name = new Label(grpYourStatus, SWT.NONE); Label status = new Label(grpYourStatus, SWT.NONE); Label message = new Label(grpYourStatus, SWT.NONE); message.setFont(smallFont); message.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1)); service.getServiceViewItem().setLabelsAndIcons(name, status, message, checkIcon, errorIcon); //this also sets the values of the labels (label.setText(...) via data binding) } 

不幸的是,我不知道更新/重置它的正确方法是什么。 我尝试了以下方法:

监听器(应更新视图/服务列表):

 r.addPropertyChangeListener(BindingNames.SERVICE_ADDED, new PropertyChangeListener() { public void propertyChange(final PropertyChangeEvent evt) { Display.getDefault().asyncExec(new Runnable() { public void run() { // This "redraws" the view, but just places the whole content (generated in createStatusGroupBox()) above the other parts. //Display.getCurrent().update(); //createStatusGroupBox(); //parent.layout(true); //parent.redraw(); // disposes grpYourStatus-Group but doesn't show anything then grpYourStatus.dispose(); createStatusGroupBox(); grpYourStatus.layout(); grpYourStatus.redraw(); } }); } }); 

我也尝试了以下陈述(单独); 一切都没有成功:

 parent.redraw(); parent.update(); parent.layout(); parent.layout(true); parent.refresh(); 

在这篇文章中,我阅读了以下内容:

createPartControls是视图生命周期的时间,其中包含的小部件被创建(当视图最初可见时)。 此代码仅在视图生命周期中执行一次,因此您无法在此处直接添加任何内容来刷新视图。

Eclipse部件通常会更新其内容,以响应工作台内部更改的选择(例如,用户可能会在调试视图中单击另一个堆栈框架)。

不幸的是,我不知道我还能尝试什么,我没有找到任何有用的搜索… 谢谢你的帮助和建议

我终于找到了答案(连同AndreiC的帮助!):

我的听众现在看起来像这样:

 r.addPropertyChangeListener(BindingNames.SERVICE_ADDED, new PropertyChangeListener() { public void propertyChange(final PropertyChangeEvent evt) { Display.getDefault().asyncExec(new Runnable() { public void run() { // remove grpYourStatus from parent grpYourStatus.dispose(); // add grpYourStatus (with updated values) to parent createStatusGroupBox(); // refresh view parent.pack(); parent.layout(true); } }); } }); 

其余的与上面的代码相同。

我不知道API,但您尝试过parent.update()吗?