在模型更改时更新虚拟 TableViewer 的条目
Updating entries of virtual TableViewer on model change
我目前正在重新编码 TableViewer 以完全虚拟地工作。到目前为止,我对结果非常满意,但我仍然有一个问题,即 table 中的所有可见元素都在固定计时器上刷新。虽然模型不断变化。这意味着,如果我在定期更新发生之前单击一个条目,table 会加载该位置的实际值,但不会影响所有其他元素。由于这是为 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();在侦听器回调结束时,但它似乎没有刷新我的元素。添加新项目时,我该怎么做才能强制刷新所有可见项目?
提前致谢。
我刚刚注意到,我的解决方案几乎可以正常工作。问题是,整个代码都在一个奇怪的 try-catch-block 中的某个地方,它只是默默地吞下了异常,并且没有给我因不执行 [=13= 而应该得到的无效线程访问异常] 在显示线程中。像这样换行解决了问题:
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
liveViewer.refresh();
}
});
我目前正在重新编码 TableViewer 以完全虚拟地工作。到目前为止,我对结果非常满意,但我仍然有一个问题,即 table 中的所有可见元素都在固定计时器上刷新。虽然模型不断变化。这意味着,如果我在定期更新发生之前单击一个条目,table 会加载该位置的实际值,但不会影响所有其他元素。由于这是为 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();在侦听器回调结束时,但它似乎没有刷新我的元素。添加新项目时,我该怎么做才能强制刷新所有可见项目?
提前致谢。
我刚刚注意到,我的解决方案几乎可以正常工作。问题是,整个代码都在一个奇怪的 try-catch-block 中的某个地方,它只是默默地吞下了异常,并且没有给我因不执行 [=13= 而应该得到的无效线程访问异常] 在显示线程中。像这样换行解决了问题:
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
liveViewer.refresh();
}
});