Java 在模型更改时更新virtual TableViewer的条目

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

我目前正在重新编写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);
    }
}


公共类MyClass{
公共TableViewer-liveViewer;
public List myItems=new ArrayList();
void init(){
liveViewer=新的TableViewer(liveComp,SWT.BORDER | SWT.FULL | u SELECTION | SWT.VIRTUAL);
setContentProvider(新的LiveViewerContentProvider(liveViewer));
setLabelProvider(someLabelProvider);
setUseHashlookup(true);
提供设计项的类。addListener(新项addListener(){
@凌驾
已添加无效项(字符串项){
myItems.add(0,item);
}
}
}
}
公共类LiveViewerContentProvider实现ILazyContentProvider{
私人桌面查看器;
私有列表输入;
公共LiveViewerContentProvider(TableViewer){
this.viewer=查看器;
}
@凌驾
公共空间处置(){
}
@凌驾
public void inputChanged(查看器、对象oldInput、对象newInput){
this.input=(List)newInput;
}
@凌驾
公共void updateElement(int索引){
viewer.replace(input.get(index),index);
}
}
我知道,ArrayList可能不是最好的选择,因为它总是在头部添加元素,但请暂时忽略它。我已尝试在侦听器回调结束时执行liveViewer.refresh();但它似乎没有刷新我的元素。在添加新项目时,如何强制刷新所有可见项目


提前感谢。

我刚刚注意到,我的解决方案几乎可以正常工作。问题是,整个代码都在一个奇怪的try-catch块中的某个地方,它只是默默地吞没了异常,并没有给我一个无效的线程访问异常,因为我没有在显示器中执行liveViewer.refresh-线程。像这样包装行修复了问题:

Display.getDefault().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        liveViewer.refresh();
                    }
                });