2017-09-14 104 views
0

我使用下面的代碼片段來清除NatTable數據並在刷新操作上完成重新加載。NatTable在清除數據時保留行選擇並重新加載

natTable.getBodyDataProvider().getList().clear(); 
natTable.getBodyDataProvider().getList().addAll(inputList); 
natTable.refresh(); 

因爲數據被清除並重置,所以我無法在刷新前將行選擇設置回先前選擇的行。

不過,我現在用的是RowSelectionModel成功恢復選擇的排序

final RowSelectionModel<T> rowSelectionModel = new RowSelectionModel<T>(bodyLayer.getSelectionLayer(),bodyDataProvider, rowIdAccessor); 
bodyLayer.getSelectionLayer().setSelectionModel(rowSelectionModel); 

是否有可能恢復行選擇時,數據將被清除並重新加載?

我看到PreserveModel上存在的問題:How to use Nebula NatTable's PreserveSelectionModel?但它沒有回答我的問題。

感謝有人能提供更多關於此的指針。

問候, SDS

回答

1

IIRC當您清除基礎列表(我假設你正在使用GlazedLists所以當你做這樣的活動發射),該RowSelectionModel清除內部存儲選擇。這是一致的,因爲保留對已被移除的對象的選擇是沒有意義的。

所以你需要實現一個解決這個事實的解決方法。例如,可以實現一個自定義的ISelectionModel,它擴展了RowSelectionModel並以不同的方式確保與基礎列表的一致性。或者在清除基礎列表之前記住選擇,然後再次應用選擇。但要做到這一點,您需要在NatTable上註冊PaintListener以延遲應用選擇,否則內部事件將延遲清除選擇。

下面的代碼片段將總是選擇NatTable的主體區域中的第5行,這是NatTable中第6行,因爲列標題行。

natTable.addPaintListener(new PaintListener() { 

    @Override 
    public void paintControl(PaintEvent e) { 
     // use column 1 as column 0 in NatTable is the row header 
     // insert the rows to select that you previously cached 
     natTable.doCommand(
       new SelectRowsCommand(natTable, 1, 5, false, false)); 
    } 
}); 
+0

謝謝你的回覆Dirk。我正在緩存選擇對象,並清除並重新加載我使用rowSelectionProviderNatTable.setSelection(新的StructuredSelection(previousSelectedObj))設置選擇;這不會將選擇設置回表格。既然NatTable已經擁有了Paintlistener,那麼我可以使用DefaultPaintListner嗎? – SDS

+0

不明白這個問題。爲什麼不能添加另一個PaintListener? –

+0

我是NatTable和SWT PaintListener的新手。感謝您是否可以共享代碼段來設置行選擇。謝謝。 – SDS

相關問題