簡體   English   中英

Java:根據枚舉中的列排序JTable

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM