微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JTable在对ASC或DESC进行排序时始终保持行组

如何解决JTable在对ASC或DESC进行排序时始终保持行组

我有一个 JTable 用来显示一些数据,数据基本上由 (Key,Value) 对组成。

我启用了按键列对表格进行排序。

但是无论是升序还是降序,我都需要一组键始终位于顶部。

示例:

未排序

价值
键 A 值 A
C 键 价值 C
键 B 价值 B
键 1 值 1
关键 3 值 3
键 2 值 2
关键 4 值 4

已排序的 ASC

价值
键 A 值 A
键 B 价值 B
C 键 价值 C
键 1 值 1
键 2 值 2
关键 3 值 3
关键 4 值 4

已排序的 DESC

价值
C 键 价值 C
键 B 价值 B
键 A 值 A
关键 4 值 4
关键 3 值 3
键 2 值 2
键 1 值 1

我创建了一个带有比较器的行排序器,并且能够获得 Sorted ASC,

final tablerowsorter<CTableModel> sorter = new tablerowsorter<CTableModel>((CTableModel) this.getModel());
sorter.setComparator(0,new CJTableComparator());
sorter.setSortable(1,false);

但 defaultrowsorter 通过将行号乘以 -1 来对 desc 进行排序。

private int compare(int model1,int model2) {
...    
    if (sortOrder == SortOrder.DESCENDING) {
        result *= -1;
    }

看到方法是私有的,我无法覆盖它。

有人对我如何处理这个问题有任何想法吗?

class CJTableComparator implements Comparator {

    @Override
    public int compare(Object o1,Object o2) {

        CTableModel model = ((CTableModel)CJTable.this.getModel());

        String so1 = o1.toString();
        String so2 = o2.toString();

        boolean isHeader1 = model.isHeader(so1);
        boolean isHeader2 = model.isHeader(so2);


        if(isHeader1 == isHeader2){

        }else if(isHeader1){
            so1 = "0"+so1;
            so2 = "9"+so2;
        }else if(isHeader2){
            so1 = "9"+so1;
            so2 = "0"+so2;
        }

        return so1.toString().comparetoIgnoreCase(so2.toString());
    }
}

表格模型

public class CTableModel extends DefaultTableModel {

    private final HashMap<String,CTableModelRow> rowsbyId = new HashMap<String,CTableModelRow>();

    private final HashMap<String,CTableModelRow> rowsHeaders = new HashMap<String,CTableModelRow>();

    static Object[][] empty = {{}};

    private static final String[] DEFALT_COLUMNS = {"TAG","VALUE","PREV"};

    public CTableModel (){
        super(empty,DEFALT_COLUMNS);
        this.setRowCount(0);
    }

    public CTableModelRow getRowByNumber(int number){
        return rowsbyNumber.get(number);
    }

    public boolean isHeader(String key){
        return rowsHeaders.containsKey(key);
    }
}

结束。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?