我需要一个与TableRowSorter/DefaultRowSorter提供的插入行为不同的JTable。
我需要一个表,这样当用户插入一行时,新插入的行应该位于光标所在的行下方,光标放在新插入的行中。让我以一个例子来说明这一点:
初始状态表有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实现了这一点.在尝试了这两种方法之后,我意识到第二种方法给了我更大的灵活性。
发布于 2012-04-30 13:10:45
获得使用JTable正确排序的RowSorter的“正确”方法是重写AbstractTableModel.getColumnClass(int)。然后可以调用DefaultRowSorter.setSortKeys()来指定排序顺序。
这些方法将允许您以任何顺序将行添加/删除到/从模型中删除,并满足它们将以“正确”排序顺序显示。
如果您需要特殊的排序,即基于对象的compareTo()方法以外的其他内容进行排序,则可以调用DefaultRowSorter.setComparator()来提供自己的比较函数来处理该列。
我不知道您所说的“游标”是什么意思,但是如果您的意思是应该选择任何新插入的行,这将通过调用JTable.setRowSelectionInterval()来实现,它接受视图索引,因此它们需要转换(例如,将您刚刚插入的模型中的最后一行转换为视图索引)。
发布于 2012-04-30 13:43:14
我不确定我是否应该修改我原来的答案,但我认为这是完全错误的。
我认为你的第一个解决方案是最好的。我不会担心在表模型中插入数据的代价很高,直到我亲眼看到它(或者如果您知道您有几十万行或其他东西)。
所以-这就是我想要的:
int modelIndex = table.convertRowIndexToModel(table.getSelectedRow());
tableModel.insertRow(modelIndex, myRowVector);浏览一下DefaultTableModel代码,看起来这可能是一个相当快的方法,尽管可能没有办法绕过Vector.insertElementAt()开销。我敢打赌,与使用RowSorter相比,它的开销更低。
https://stackoverflow.com/questions/10384066
复制相似问题