我目前正在重新編碼 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(); 在偵聽器回調結束時,但它似乎沒有刷新我的元素。在添加新項目時,我該怎么做才能強制刷新所有可見項目?
1 回答

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