我需要一个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来实现这一点。在尝试了这两种方法后,我意识到第二种方法给了我更大的灵活性。
答案 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
。