在模型更改时更新虚拟TableViewer的条目

问题描述 投票:0回答:1

我目前正在重新编码TableViewer以使其完全虚拟工作。到目前为止,我对结果非常满意,但是仍然存在一个问题,即表中的所有可见元素都在固定的计时器上刷新。尽管模型不断变化。这意味着,如果在定期更新发生之前单击某个条目,该表将加载该位置的实际值,但所有其他元素均保持不变。由于这是为TableViewer设置的LazyContentProvider的工作方式,因此这不是什么大问题。由于我的TableViewer是传入事件的实时查看器,而最新的条目将所有其他项都向下移动,因此我想在添加新事件时刷新所有可见元素。

我尝试在添加新项目时使用TableViewer.refresh(),但这似乎无济于事。

由于完整的代码非常复杂,并且是较大代码的一部分,所以我将提供代码的基本表示形式:

public class MyClass{
  public TableViewer liveViewer;
  public List<String> myItems=new ArrayList<>();

  void init(){
   liveViewer = new TableViewer(liveComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.VIRTUAL);
    liveViewer.setContentProvider(new LiveViewerContentProvider(liveViewer));
    liveViewer.setLabelProvider(someLabelProvider);
    liveViewer.setUseHashlookup(true);
    ClassThatProvidesItems.addListener(new ItemAddedListener(){
         @Override
         void itemAdded(String item){
          myItems.add(0,item);
         }
    }
  }

}

public class LiveViewerContentProvider implements ILazyContentProvider{
    private TableViewer viewer;
    private List<String> input;

    public LiveViewerContentProvider(TableViewer viewer) {
        this.viewer = viewer;
    }

    @Override
    public void dispose() {
    }

    @Override
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        this.input = (List<String>) newInput;
    }

    @Override
    public void updateElement(int index) {
        viewer.replace(input.get(index), index);
    }
}


我知道,对于总是在头部添加一个元素的ArrayList可能不是最佳选择,但是现在请忽略它。我试图执行一个liveViewer.refresh();在侦听器回调的末尾,但似乎并没有刷新我的元素。我该怎么做才能在添加新项目时强制刷新所有可见项目?

提前感谢。

java swt virtual jface tableviewer
1个回答
0
投票

我刚刚注意到,我的解决方案几乎可以正常工作。问题是,整个代码都在一个奇怪的try-catch-block内,只是默默地吞下了Exceptions,并且没有给我我不执行不执行liveViewer.refresh而应该得到的invalid-Thread-access异常。显示线程。像这样包装线解决了问题:

Display.getDefault().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        liveViewer.refresh();
                    }
                });
© www.soinside.com 2019 - 2024. All rights reserved.