我在表格底部使用带有空行的 JTable,以便能够向表格中添加新行。
在空行中插入或写入数据后,我会自动在其下方添加一个新的空行。 (它应该像 Microsoft 可视表一样工作)
我正在使用 java 默认行排序器,
问题是我需要一直将空行作为最后一行!但在对表格进行排序后,它成为第一行。
DefaultRowSorter 类的“compare(int model1, int model2)”方法获取 2 个行号,如果第一行的值为如果第二行的值为 null,则为 null 和 1。并在 DESCENDING 的情况下乘以 -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;
}
空行被排序为最小值,在降序的情况下它将成为第一行(因为乘以 -1)并导致很多问题。
我可以覆盖它,如果空行(通常是最后一行)在降序模式下不乘以 -1,它将是任何排序后的最后一行。 但问题是“compare”方法及其调用者“Row”内部类在 DefaultRowSorter 中是私有(private)的。
有没有办法避免对空行进行排序并使其始终排在最后一行?
最佳答案
我试了一下,我想我找到了解决方案。
我没有在 TableModel
中创建那个空行,而是在 JTable
中伪造它,并且仅在用户实际输入一些数据时才创建它。
RowSorter
仅对 TableModel
的行进行排序,因此我们的行不受影响并保持为最后一行。
public class NewLineTable extends JTable {
@Override
public int getRowCount() {
// fake an additional row
return super.getRowCount() + 1;
}
@Override
public Object getValueAt(int row, int column) {
if(row < super.getRowCount()) {
return super.getValueAt(row, column);
}
return ""; // value to display in new line
}
@Override
public int convertRowIndexToModel(int viewRowIndex) {
if(viewRowIndex < super.getRowCount()) {
return super.convertRowIndexToModel(viewRowIndex);
}
return super.getRowCount(); // can't convert our faked row
}
@Override
public void setValueAt(Object aValue, int row, int column) {
if(row < super.getRowCount()) {
super.setValueAt(aValue, row, column);
}
else {
Object[] rowData = new Object[getColumnCount()];
Arrays.fill(rowData, "");
rowData[convertColumnIndexToModel(column)] = aValue;
// That's where we insert the new row.
// Change this to work with your model.
((DefaultTableModel)getModel()).addRow(rowData);
}
}
}
关于java - 我如何用空行对 java JTable 进行排序并强制空行始终排在最后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2316563/