天天看點

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檔案,還需要做出相應的提示資訊)