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;
}
}
});
}
如下是运行结果展示:
每次单击表头标题之后便会进行升序降序的切换,四个列都可以进行相应的切换,并且可以动态更改表头的内容进行提示。
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文件,还需要做出相应的提示信息)