[英]Java: order a JTable according to columns from enum
我有一個JTable,其中幾列包含來自枚舉的數字,如下所示:
public static enum IMPORT_CONF_OPERATION_RESULT {
OK(0, "OK"),
ERROR(1, "ERROR"),
WAITING(2, "WAITING");
/* ... */
}
因此,我需要重寫遍歷枚舉值的表模型的getValueAt()
方法,以便解碼並返回每一行的對應String,因為在存儲數據的數據庫中,這些數值是存儲的。 現在,如果用戶單擊相應的標題列,則會根據數字對行進行排序,但是我想按字母順序對其進行排序。 我應該重寫表模型的sort()
方法嗎? 是不是在枚舉值中循環了這么多次以致於描述效率低下? 它會減慢表格渲染速度嗎?
UPDATE
在我擴展的DefaultTableModelField
內部,這可能是遵循STaefi建議的解決方案:
@Override
public void sort(int col, boolean ascendest) {
ColumnProperties columnProperties = this.mapColumn.get(col);
if (COLUMN_NAME_ENTITY.equals(columnProperties.getInfo()) ||
COLUMN_OPERATION_TYPE.equals(columnProperties.getInfo()) ||
COLUMN_OPERATION_RESULT.equals(columnProperties.getInfo()) ||
COLUMN_ELABORATION_TYPE.equals(columnProperties.getInfo()) ||
COLUMN_EVENT_STATE.equals(columnProperties.getInfo())) {
Collections.sort((List<TableImportConfEvent>)this.value, new EnumColumnSorter(ascendest, columnProperties.getInfo()));
this.fireTableDataChanged();
}
else {
super.sort(col, ascendest);
}
}
private class EnumColumnSorter implements Comparator<TableImportConfEvent> {
private int ascending;
private String columnName;
public EnumColumnSorter(boolean ascendest, String columnName) {
this.ascending = ascendest ? 1 : -1;
this.columnName = columnName;
}
@Override
public int compare(TableImportConfEvent o1, TableImportConfEvent o2) {
String decodedString1 = "";
String decodedString2 = "";
if (COLUMN_NAME_ENTITY.equals(this.columnName)) {
decodedString1 = getEntityName(o1.getEntityType());
decodedString2 = getEntityName(o2.getEntityType());
}
else if (COLUMN_OPERATION_TYPE.equals(this.columnName)) {
decodedString1 = getOperationName(o1.getOperationType());
decodedString2 = getOperationName(o2.getOperationType());
}
else if (COLUMN_OPERATION_RESULT.equals(this.columnName)) {
decodedString1 = getResultName(o1.getOperationResult());
decodedString2 = getResultName(o2.getOperationResult());
}
else if (COLUMN_ELABORATION_TYPE.equals(this.columnName)) {
decodedString1 = getResultName(o1.getOperationResult());
decodedString2 = getResultName(o2.getOperationResult());
}
else if (COLUMN_EVENT_STATE.equals(this.columnName)) {
decodedString1 = getStateName(o1.getEventState());
decodedString2 = getStateName(o2.getEventState());
}
return (decodedString1.compareTo(decodedString2)) * this.ascending;
}
}
為避免循環遍歷每一行的枚舉值,您可能需要創建一個static final HashMap<Integer,IMPORT_CONF_OPERATION_RESULT>
將值映射映射到相應的標簽,並將其初始化為枚舉內部的靜態塊。 然后,您可以有一個public static String getLabelByValue(int value)
以使用緩存,並避免每次使用O(n)
查找標簽。
為了控制排序順序和排序動作,您可能需要在TableRowSorter
之后執行,但是當您為模型覆蓋getValueAt
,默認排序應已足夠。 另一種方法是在表模型中使用自定義Comparator
來管理排序邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.