从第一个答案的例子显示了基本的解决方案,但将无法工作开箱。无法更改最终的“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