java - 我如何用空行对 java JTable 进行排序并强制空行始终排在最后?

标签 java swing sorting jtable

我在表格底部使用带有空行的 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/

相关文章:

java - Android,试图为android解析json数据

java - Android 处理点击事件

java - 我如何实际使用分隔符?

快速排序算法抛出堆栈转储错误的 C++ 运行时错误

c++ - 数组中的重复元素

java - 如何知道连接到系统的输入设备有哪些

java - 如何在 ant build.xml 中设置 junit 测试?

java - 使用网格包布局设计java框架

java - 从单独的类方法运行 GUI 更新方法

c - 删除 C 中重复的整数对的有效方法