最近項目開發過程中使用到Jtable的相關知識,其中有一個需求就是将Jtable表格中運作出來的分析結果進行升序降序切換排序,還需要動态更改表頭的内容,運作結果如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPRNWMNpWT4N2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DN5gzNzADM5EDNxYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
按照需求點選表頭不同的列需要分别按照升序、降序對結果進行排序。從網上找了相關知識參考了一下,大概有兩種解決排序的方案。
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檔案,還需要做出相應的提示資訊)