在模型更改时更新虚拟 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);

    }

}



我知道,ArrayList 可能不是最好的选择,因为总是在头部添加元素,但请暂时忽略它。我尝试执行 liveViewer.refresh(); 在侦听器回调结束时,但它似乎没有刷新我的元素。在添加新项目时,我该怎么做才能强制刷新所有可见项目?


翻阅古今
浏览 93回答 1
1回答

至尊宝的传说

我刚刚注意到,我的解决方案几乎有效。问题是,整个代码位于一个奇怪的 try-catch-block 中的某个地方,它只是默默地吞噬了异常,并且没有给我无效的线程访问异常,而我应该因为没有在其中执行 liveViewer.refresh 而得到该异常显示线程。像这样换行解决了问题:Display.getDefault().asyncExec(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; liveViewer.refresh();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java