swing如何使用空行对java JTable进行排序,并强制空行始终位于最后?
我使用JTable,在表的底部有一个空行,以便能够向表中添加新行
在空行中插入或写入数据后,我将自动在其下方添加一个新的空行。(假设它的行为类似于Microsoft visual tables)
我使用的是java默认行分类器
问题是我需要一直把空行作为最后一行!但在对表格进行排序后,它将成为第一行
DefaultRowSorter类的“compare(int model1,int model2)”方法得到2个行号,如果第一行的值为null,则返回-1;如果第二行的值为null,则返回1。以防以-1的倍数降序得到相反的顺序
//Treat nulls as < then non-null
if (v1 == null) {
if (v2 == null) {
result = 0;
} else {
result = -1;
}
} else if (v2 == null) {
result = 1;
} else {
result = sortComparators[counter].compare(v1, v2);
}
if (sortOrder == SortOrder.DESCENDING) {
result *= -1;
}
空行被排序为最小值,如果降序,它将是第一行(因为mult by-1),并且会导致很多问题
我可以跳过它,如果是空行(通常是最后一行),在降序模式下不乘以-1,它将是任何排序后的最后一行。 但问题是“比较”方法及其调用方“行”内部类在默认行排序器中是私有的
有没有办法避免将空行排序并使其始终位于最后一行
# 1 楼答案
我知道这是一条旧线,但我被困在这里想办法。请让我知道,如果有一个新的方式之前没有提到。实际上这是我第一篇关于SO的帖子,但因为我花了很多时间寻找解决方案,所以我决定与大家分享
我解决了排序问题,我没有使用“null”作为“新条目”,而是创建了一个特定的对象(在我的例子中,是从对象类本身创建的,但它可能是更具意义的东西,比如“newentrydonotcomparewithepleaseletmebelastenrybeghoudonotsortme”空类)
比较时,我首先检查要比较的“对象”是否是对象。当然不是“instanceof”,而是(obj.getClass()==Object)。班级)如果是这种情况,请检查排序顺序并返回1或-1
如果您发现任何问题,请随时发表评论。如果有人需要代码,我可以尝试创建一个小的工作版本
干杯, 丹尼尔
# 2 楼答案
我尝试了一下,我想我找到了解决办法
我没有在
TableModel
中创建空行,而是在JTable
中伪造它,并且只在用户实际输入一些数据时创建它RowSorter
只对TableModel
中的行进行排序,因此我们的行不受影响,并保持为最后一行# 3 楼答案
我找到了另一个解决方案,只对子类化了TableRowSorter
从DefaultRowSorter文档中我们知道:
子类化DefaultRowSorter时。ModelWrapper,我们可以返回一个特殊的空对象,并创建一个处理该值的自定义比较器
下面是我的代码。可能它没有自定义行排序器实现那么高效,而且可能仍然包含一些bug,我没有测试所有东西,但根据我的需求,它可以工作
现在可以在表中启用排序
# 4 楼答案
DefaultRowSorter肯定有缺陷
唯一的选择是基于DefaultRowsorter创建自己的RowSorter并纠正问题
# 5 楼答案
使用DefaultRowSorter的setComparator方法设置不同的比较器