我目前正在重新編碼 TableViewer 以完全虛擬地工作。到目前為止,我對(duì)結(jié)果非常滿意,但仍然有一個(gè)問(wèn)題,即表中的所有可見(jiàn)元素都是在固定計(jì)時(shí)器上刷新的。但模型不斷變化。這意味著,如果我在定期更新發(fā)生之前單擊某個(gè)條目,則表會(huì)加載該位置的實(shí)際值,但保持所有其他元素不變。由于這就是為 TableViewer 設(shè)置的 LazyContentProvider 的工作方式,因此這不是什么大問(wèn)題。由于我的 TableViewer 是傳入事件的實(shí)時(shí)查看器,最新條目將所有其他項(xiàng)目向下移動(dòng),因此我想在添加新事件時(shí)刷新所有可見(jiàn)元素。我嘗試使用 TableViewer.refresh() 添加新項(xiàng)目,但這似乎沒(méi)有任何作用。由于完整的代碼非常復(fù)雜,并且是更大代碼段的一部分,我將提供代碼的基本表示: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 可能不是最好的選擇,因?yàn)榭偸窃陬^部添加元素,但請(qǐng)暫時(shí)忽略它。我嘗試執(zhí)行 liveViewer.refresh(); 在偵聽(tīng)器回調(diào)結(jié)束時(shí),但它似乎沒(méi)有刷新我的元素。在添加新項(xiàng)目時(shí),我該怎么做才能強(qiáng)制刷新所有可見(jiàn)項(xiàng)目?
1 回答

至尊寶的傳說(shuō)
TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
我剛剛注意到,我的解決方案幾乎有效。問(wèn)題是,整個(gè)代碼位于一個(gè)奇怪的 try-catch-block 中的某個(gè)地方,它只是默默地吞噬了異常,并且沒(méi)有給我無(wú)效的線程訪問(wèn)異常,而我應(yīng)該因?yàn)闆](méi)有在其中執(zhí)行 liveViewer.refresh 而得到該異常顯示線程。像這樣換行解決了問(wèn)題:
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
liveViewer.refresh();
}
});
添加回答
舉報(bào)
0/150
提交
取消