Java 如何在TableViewer中更新ProgressBar?

Java 如何在TableViewer中更新ProgressBar?,java,eclipse,eclipse-plugin,Java,Eclipse,Eclipse Plugin,在我的TableViewer中,我有一个OwnerDrawLabelProvider,其中对于表中的特定列,我向TableEditor实例添加一个ProgressBar 我的问题如下: 我可以设置ProgressBar的选择,但在尝试更新时,它保持相同的值 代码: @覆盖 公共无效更新(ViewerCell单元格){ 如果(columnIndex==4){ Table=tableViewer.getTable(); 表项目; 表项[]项; 表格编辑器; items=table.getItems(

在我的TableViewer中,我有一个OwnerDrawLabelProvider,其中对于表中的特定列,我向TableEditor实例添加一个ProgressBar

我的问题如下:

我可以设置ProgressBar的选择,但在尝试更新时,它保持相同的值

代码:

@覆盖
公共无效更新(ViewerCell单元格){
如果(columnIndex==4){
Table=tableViewer.getTable();
表项目;
表项[]项;
表格编辑器;
items=table.getItems();
ProgressBar=新的ProgressBar(表,SWT.NONE);
设置最小值(0);
最大设定压力(100巴);
巴设置状态(SWT正常);
律师资格(0);
setLayoutData(新网格数据(SWT.FILL,SWT.CENTER,true,true));
if(mediator.isSent()){
List itemsSendToSubmit=mediator.getItemsSendToSubmit();
如果(!itemsSendToSubmit.isEmpty()){
for(Iterator itematerator=itemsSendToSubmit.Iterator();itemtiterator.hasNext();)
{
ItemItemSubmited=itemIterator.next();
对于(TableItem TableItem:items)
{if(tableItem.getText(0.contains)(itemSubmited.getId()))
{                   
bar.setSelection(PluginUtility.getBuildProgress(itemSubmited.getPlan());
编辑器=新表格编辑器(表格);
editor.grabHorizontal=true;
editor.grabVertical=true;
编辑器.setEditor(条,表项,4);
}
}                   
}
}
}
}
}
捕获(例外e)
{
e、 printStackTrace();
}
}
我读到一个问题,setSelection method for ProgressBar存在一些问题。我通过扩展基类创建了自己的ProgressBar,并用修复代码重写了setSelection方法,但仍然不起作用

在正常的main函数中,这是有效的

我可以得到一些关于问题的建议,或者在TableViewer中添加此ProgressBar如何影响其行为的建议吗

编辑:如果在创建标签提供程序时创建progressbar的单个实例,然后将其传递给tableeditor,它将更新最后一个元素的progressbar,我称之为editor.setEditor(bar,tableItem,4);
但是我需要为每个项目显示一个进度条,并为每个项目更新它

可能会发生更新,但视觉效果不会更新,具体取决于您如何调用此代码

在执行此更新时,必须确保没有激活ui线程

在Eclipse3.x中,这意味着使用

Display.getDefault().asyncExec(new Runnable() {
  public void run() {
    // ... do any work that updates the screen ...
  }
});
或者在4.x中使用注入来获得UI同步

基本上把选举代码放在那里

请参阅这篇关于eclipse插件中后台处理的文章:

更新ProgressBar的值后,需要重新绘制/重新绘制TableViewer及其所有属性,然后它将显示更新ProgressBar。希望这能解决您的问题。

您是否正在更新相同的ProgressBar实例?或者在每次更新时创建一个新的。如果您使用相同的实例,您应该只调用setSelection(…)更新其状态;每次更新时都会有一个新实例。事实上,这并不重要,因为我总是创建编辑器并为其设置新实例。您能告诉我表将包含多少项吗?对于大量的项目,我建议绘制进度条以节省资源。我不知道表中的项目数量,这是动态的!
Display.getDefault().asyncExec(new Runnable() {
  public void run() {
    // ... do any work that updates the screen ...
  }
});