天天看点

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文件,还需要做出相应的提示信息)