從第一個答案的例子顯示了基本的解決方案,但將無法工作開箱。無法更改最終的「selectedRow」。所以應該使用可變整數(例如AtomicInteger)。 tamleModelListener調度到任務擺動,以便稍後調用 - 在大多數情況下,在表更改已經移除選擇之後。所以在大多數情況下,selectedRow將是-1。
我已經改變了上面的例子有點(並添加單細胞的選擇,但它也適用於全行):
final AtomicInteger selectedRow=new AtomicInteger(-1);
final AtomicInteger selectedCol=new AtomicInteger(-1);
tblZeiten.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e)
{
selectedRow.set(tblZeiten.getSelectedRow());
selectedCol.set(tblZeiten.getSelectedColumn());
}
});
tblZeiten.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e)
{
TableCellEditor editor=tblZeiten.getCellEditor();
if (editor!=null) editor.cancelCellEditing();
final int row=selectedRow.get();
final int col=selectedCol.get();
if (row<0||col<0) return;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// http://book.javanb.com/the-java-developers-almanac-1-4/egs/javax.swing.table/Sel.html
tblZeiten.changeSelection(row,col, false, false);
}
});
}
});
向我們展示一些代碼。你目前如何保存/恢復選擇狀態? –
我的錯。代碼添加到問題中。 – Lampapos
如果您不必觸發dataChanged,那麼首先請檢查您的模型,如果您確實發生了內容更新和刪除/添加的大量混合變化。如果不是,則觸發一個或多個適當的更受限制的事件類型 - 表格將保持選擇同步。或者相反:如果表格不能顯示,任何自定義代碼都不能顯示;-) – kleopatra