当需要自定义插入行为时,是否必须自定义RowSorter实现?

时间:2012-04-30 12:54:18

标签: java swing tablerowsorter

我需要一个JTable,其插入行为与TableRowSorter / DefaultRowSorter提供的不同。

我需要一个表,当用户插入一行时,新插入的行应该低于光标所在的行,并将光标放在新插入的行上。 让我举一个例子说明:

初始状态 - 表有4行:

0. Row 1
1. Row 2 <-- cursor here
2. Row 3
3. Row 4

用户的光标位于第二行,用户触发插入。新插入的行显示在下方,光标也移动到那里:

0. Row 1
1. Row 2 
2. New row <-- cursor here
3. Row 3
4. Row 4

我很清楚我有两种方法可以解决这个问题。

第一种方法是更改​​我的模型,因此插入在模型中的正确位置完成。我不喜欢这个解决方案,因为它意味着模型索引会在插入的下面的所有行中发生变化。这是完成我需要的最简单的方法,但是,正如我所说的那样,代价是由模型索引引起的潜在巨大开销变化......

第二种方法是实现一个RowSorter,它将维护自己的videToModel []和modelToView []数组,并在插入行时保持正确的顺序。当然,我从扩展TableRowSorter开始,但问题是modelToView和viewToModel是私有数组,我无法访问它们所以当过滤行时我遇到问题...

我正在努力避免编写自己的RowSorter实现,因为它需要时间才能正确执行...

更新2013-10-07: 我通过实现自己的RowSorter来实现这一点。在尝试了这两种方法后,我意识到第二种方法给了我更大的灵活性。

2 个答案:

答案 0 :(得分:1)

获取使用RowSorter正确排序的JTable的“正确”方法是覆盖AbstractTableModel.getColumnClass(int)。然后,您可以调用DefaultRowSorter.setSortKeys()来指定排序顺序。

这些方法允许您以任何顺序在模型中添加/删除行,并且满足它们将以“正确”的排序顺序显示。

如果您需要特殊排序,即基于对象'compareTo()方法以外的其他方式进行排序,您可以调用DefaultRowSorter.setComparator()来提供自己的比较函数来处理该列。

我不确定“cursor”是什么意思,但是如果你的意思是应该选择任何新插入的行,那么可以通过调用JTable.setRowSelectionInterval()来完成,这需要查看索引< / em>,所以需要转换它们(例如将模型索引(可能是刚刚插入的模型中的最后一行)转换为视图索引。

答案 1 :(得分:1)

不确定我是否应该刚刚编辑了我原来的答案,但我认为现在完全错了。

我认为你的第一个解决方案是最好的。我不担心在表模型中插入数据是非常昂贵的,直到我亲眼看到它(或者如果你知道你有数十万行或其他东西)。

所以 - 像这样的东西就是我想要的:

int modelIndex = table.convertRowIndexToModel(table.getSelectedRow());
tableModel.insertRow(modelIndex, myRowVector);

看了DefaultTableModel代码,看起来这可能是一个相当快的方法,虽然可能无法解决Vector.insertElementAt()开销......我愿意打赌这是一个较低的开销完全不是使用RowSorter