如何在TableViewer中更新ProgressBar?

时间:2015-08-18 13:04:51

标签: java eclipse eclipse-plugin

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

我的问题如下:

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

CODE:

@Override
public void update(ViewerCell cell) {
if(columnIndex == 4){

            Table table = tableViewer.getTable();
            TableItem item;
            TableItem[] items;
            TableEditor editor;             

            items = table.getItems();
            ProgressBar bar = new ProgressBar(table, SWT.NONE);
            bar.setMinimum(0);
            bar.setMaximum(100);
            bar.setState(SWT.NORMAL);
            bar.setSelection(0);
            bar.setLayoutData(new GridData(SWT.FILL,SWT.CENTER,true,true));
            if(mediator.isSent()){
                List<Item> itemsSendToSubmit = mediator.getItemsSendToSubmit();
                if(!itemsSendToSubmit.isEmpty()){
                    for(Iterator<Item> itemIterator = itemsSendToSubmit.iterator(); itemIterator.hasNext(); )
                    {
                        Item itemSubmited = itemIterator.next();                        
                        for(TableItem tableItem: items)
                        {                               if(tableItem.getText(0).contains(itemSubmited.getId())) 
                            {                   
                            bar.setSelection(PluginUtility.getBuildProgress(itemSubmited.getPlan()));
                                editor = new TableEditor(table);
                                editor.grabHorizontal = true;
                                editor.grabVertical = true;

                                editor.setEditor(bar, tableItem, 4);                    

                            }
                        }                   
                    }
                }
            }
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

我读到了一个问题,即ProgressBar的setSelection方法存在一些问题。我通过扩展基类来创建自己的ProgressBar,并用修复代码覆盖了setSelection方法,但仍然无法正常工作。

在正常的主要功能中,这有效。

我是否可以获得一些可能是问题的建议,或者如何在TableViewer中添加此ProgressBar会影响其行为?

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

2 个答案:

答案 0 :(得分:0)

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

在进行此更新时,您必须确保没有动员ui线程。

在eclipse 3.x中,这意味着使用

Display.getDefault().asyncExec(new Runnable() {
  public void run() {
    // ... do any work that updates the screen ...
  }
});

或使用注入来获取4.x

中的UISynchronize

基本上将setSelection代码放在​​那里。

请参阅有关eclipse插件中后台处理的文章: http://www.vogella.com/tutorials/EclipseJobs/article.html

答案 1 :(得分:0)

当您更新ProgressBar的值时,之后您需要使用其所有属性重绘/重绘TableViewer,然后它将显示更新进度条。希望这能解决你的问题。