Jtable中表头排序事件以及动态更改表头内容

最近项目开发过程中使用到Jtable的相关知识,其中有一个需求就是将Jtable表格中运行出来的分析结果进行升序降序切换排序,还需要动态更改表头的内容,运行结果如下图:

Jtable中表头排序事件以及动态更改表头内容

按照需求点击表头不同的列需要分别按照升序、降序对结果进行排序。从网上找了相关知识参考了一下,大概有两种解决排序的方案。

1.在表头处添加监听事件,代码如下:

// 给表格添加单击事件
final JTableHeader header = table.getTableHeader();  
        //表头增加监听  
        header.addMouseListener (new MouseAdapter() {  
            public void mouseReleased (MouseEvent e) { 
            // 只截取单击事件
            if (e.getClickCount() == 1) {
            //获取点击的列索引  
            int pick = header.columnAtPoint(e.getPoint()); 
            if (pick == 5) {

            if (liftState == 0) {

            //此处需要有不同的状态值(静态变量)来切换鼠标单击事件

                                        liftValueDataViewDown();

            liftState++;
            } else {
            liftValueDataViewUp();
            liftState--;
            }
            }
            }
           
              }  

           });

public void liftValueDataViewDown() {
GuiUtil.clearTableData(table);
DefaultTableModel model = (DefaultTableModel) table.getModel();
// 此方法可以动态设置表头的内容,给排序结果有一个小提示
model.setColumnIdentifiers(new String[] { beforeTitle, afterTitle, "同现频次", "置信度", "支持度", "提升度↓" });
Collections.sort(viewData, new Comparator<SupportAndConfidence>() {  
// 排序方法通过传入自定义的比较器进行升序降序排列  
@Override
public int compare(SupportAndConfidence o1, SupportAndConfidence o2) {
double i = Double.doubleToLongBits(o2.getLift()) - Double.doubleToLongBits(o1.getLift());
if (i > 0) {
return 1;
} else if (i < 0) {
return -1;
} else {
return 0;
}
}  

        });

}

如下是运行结果展示:

Jtable中表头排序事件以及动态更改表头内容

Jtable中表头排序事件以及动态更改表头内容

每次单击表头标题之后便会进行升序降序的切换,四个列都可以进行相应的切换,并且可以动态更改表头的内容进行提示。

2.另一种排序功能是查阅资料之后知道Jtable表格本身有排序的功能:

public JTable getTable(String beforeTitle, String afterTitle,List<SupportAndConfidence> viewData){
    JTable table = new JTable();
        CantEditableDefaultTableModel model = new CantEditableDefaultTableModel(
                new String[] { beforeTitle, afterTitle, "同现频次", "置信度", "支持度", "提升度" }, viewData.size());
        table = new JTable(model);
        
   RowSorter<CantEditableDefaultTableModel> sorter = new TableRowSorter<CantEditableDefaultTableModel>(model);
table.setRowSorter(sorter);             
return table;

}

添加单数第三行代码既可以使表格实现单击进行升序降序的功能。如果只是实现排序功能的话,推荐使用这种方式,但是如果还需要对数据做其他操作(该需求中需要输出排序之后对应的excel文件,还需要做出相应的提示信息)