Bil*_*bug 1 java sorting swing jtable
我正在使用JTable,在表格底部有一个空行,以便能够在表格中添加新行.
在空行中插入或写入数据后,我自动添加一个新的空行.(它假设像Microsoft视觉表一样)
我正在使用java默认行排序器,
问题是我需要空行一直是最后一行!但在对表格进行排序后,它将成为第一行.
DefaultRowSorter类的" compare(int model1,int model2) "方法获取2个行号,如果第一行的值为null,则返回-1,如果第二行的值为null,则返回1.并且通过-1进行DESCENDING以获得反转顺序.
//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;
}
Run Code Online (Sandbox Code Playgroud)
空行被排序为最小值,并且DESCENDING将是第一行(因为mult乘以-1)并且导致很多问题.
我可以覆盖它,并且在DESCENDING模式下,空行(通常是最后一行)不会多次-1,它将是任何排序后的最后一行.但问题是" compare "方法和它的调用者" Row "内部类在DefaultRowSorter中是私有的.
有没有办法避免排空空行并使其始终排在最后一行?
我试了一下,我想我找到了一个解决方案.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5065 次 |
| 最近记录: |