添加新行时以编程方式(仅)对 JTable 行进行 Resort
Resort JTable Rows Programmatically(only) when new Row is Added
我有一个 JTable,我需要在自动添加新行时重新计算这些行。
但是Table不能通过点击header激活排序功能。
通常,当我第一次加载 table 时,我可以通过预先对数据列表进行排序来对行进行排序。
Comparator<Map.Entry<FieldDescriptor, Object>> c = new Comparator<Map.Entry<FieldDescriptor, Object>>() {
public int compare(Map.Entry<FieldDescriptor, Object> o1, Map.Entry<FieldDescriptor, Object> o2) {
return o1.getKey().getName().compareTo(o2.getKey().getName());
}
};
List<Map.Entry<FieldDescriptor, Object>> lSet = eSet.stream().collect(Collectors.toList());
Collections.sort(lSet, c);
这很好用,因为当我第一次将行添加到 table 时,因为列表已经排序,而且它们的顺序正确。
但是,如果在填充 table 后添加新行,我需要正确地重新排序这些行。
But the Table cannot be allowed to have the sorting functionality by clicking the header active.
为什么?这样的要求永远没有意义。为什么需要限制用户可以做什么?
在任何情况下,您仍然可以使用 DefaultRowSorter
做您想做的事。阅读 API 了解各种方法。
不需要对外部List进行排序。把所有的排序都交给分拣员。
要在创建 table 时进行初始排序,逻辑可能类似于:
table.setModel(...);
table.setAutoCreateRowSorter(true);
DefaultRowSorter sorter = (DefaultRowSorter)table.getRowSorter();
sorter.setSortsOnUpdates( true );
sorter.toggleSortOrder(2); // initially sort on this column
sorter.setSortable(0, false); // disable sorting on all columns
sorter.setSortable(1, false);
...
现在当您添加一行数据时,逻辑可能是:
sorter.setSortable(2, true);
model.addRow(...);
sorter.setSortable(2, false);
或者您可以只对除排序列之外的所有列禁用排序,这样您就不必担心上述逻辑。然后,所有用户都会在一列的 ascending/descending 之间切换排序顺序。
我不会使用 JTable 的行排序器功能,而是使用 TableModel 自动将新行放在正确的位置。
例如,如果您使用 DefaultTableModel,找到应该添加行的位置并使用 insertRow 方法:
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/table/DefaultTableModel.html#insertRow(int,java.lang.Object%5B%5D)
然后 JTable 应该会在正确位置自动更新新行。
我有一个 JTable,我需要在自动添加新行时重新计算这些行。
但是Table不能通过点击header激活排序功能。
通常,当我第一次加载 table 时,我可以通过预先对数据列表进行排序来对行进行排序。
Comparator<Map.Entry<FieldDescriptor, Object>> c = new Comparator<Map.Entry<FieldDescriptor, Object>>() {
public int compare(Map.Entry<FieldDescriptor, Object> o1, Map.Entry<FieldDescriptor, Object> o2) {
return o1.getKey().getName().compareTo(o2.getKey().getName());
}
};
List<Map.Entry<FieldDescriptor, Object>> lSet = eSet.stream().collect(Collectors.toList());
Collections.sort(lSet, c);
这很好用,因为当我第一次将行添加到 table 时,因为列表已经排序,而且它们的顺序正确。
但是,如果在填充 table 后添加新行,我需要正确地重新排序这些行。
But the Table cannot be allowed to have the sorting functionality by clicking the header active.
为什么?这样的要求永远没有意义。为什么需要限制用户可以做什么?
在任何情况下,您仍然可以使用 DefaultRowSorter
做您想做的事。阅读 API 了解各种方法。
不需要对外部List进行排序。把所有的排序都交给分拣员。
要在创建 table 时进行初始排序,逻辑可能类似于:
table.setModel(...);
table.setAutoCreateRowSorter(true);
DefaultRowSorter sorter = (DefaultRowSorter)table.getRowSorter();
sorter.setSortsOnUpdates( true );
sorter.toggleSortOrder(2); // initially sort on this column
sorter.setSortable(0, false); // disable sorting on all columns
sorter.setSortable(1, false);
...
现在当您添加一行数据时,逻辑可能是:
sorter.setSortable(2, true);
model.addRow(...);
sorter.setSortable(2, false);
或者您可以只对除排序列之外的所有列禁用排序,这样您就不必担心上述逻辑。然后,所有用户都会在一列的 ascending/descending 之间切换排序顺序。
我不会使用 JTable 的行排序器功能,而是使用 TableModel 自动将新行放在正确的位置。
例如,如果您使用 DefaultTableModel,找到应该添加行的位置并使用 insertRow 方法: https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/table/DefaultTableModel.html#insertRow(int,java.lang.Object%5B%5D)
然后 JTable 应该会在正确位置自动更新新行。