如何用空行对java JTable进行排序并强制空行总是最后?

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中是私有的.

有没有办法避免排空空行并使其始终排在最后一行?

Pet*_*ang 5

我试了一下,我想我找到了一个解决方案.

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)