2

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

4

2 回答 2

1

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

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

所以 - 这样的事情是我想要的:

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

看一眼DefaultTableModel代码,看起来这可能是一个相当快的方法,尽管可能没有办法绕过Vector.insertElementAt()开销......我愿意打赌它的开销完全低于使用 a RowSorter

于 2012-04-30T13:43:14.407 回答
1

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

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

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

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

于 2012-04-30T13:10:45.687 回答