Java:根据枚举中的列来命令JTable

时间:2017-11-16 09:37:12

标签: java swing enums jtable abstracttablemodel

我有一个JTable,其中有几列包含来自枚举的数字,如下所示:

public static enum IMPORT_CONF_OPERATION_RESULT {
    OK(0, "OK"),
    ERROR(1, "ERROR"),
    WAITING(2, "WAITING");
    /* ... */
}

因此,我需要覆盖通过枚举值循环的表模型的方法getValueAt(),以便解码并返回每行的对应字符串,因为在数据来自的数据库中,存储数值。 现在,如果用户单击对应的标题列,则行根据数值排序,但我想按字母顺序排序。我应该覆盖表模型的sort()方法吗?是不是通过枚举值循环这么多次才能使描述效率低下?它会减慢表格渲染速度吗?

更新

这可能是STaefi建议的解决方案,在我的扩展DefaultTableModelField内:

@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;
    }   
}

1 个答案:

答案 0 :(得分:1)

为了避免遍历每一行的枚举值,您可能需要创建一个static final HashMap<Integer,IMPORT_CONF_OPERATION_RESULT>来将值映射缓存到相应的标签,并在枚举内的静态块中初始化它。然后,您可以public static String getLabelByValue(int value)使用缓存,并避免O(n)每次查找标签。

为了控制排序顺序和排序操作,您可能希望在TableRowSorter之后执行,但是当您覆盖模型的getValueAt时,默认排序应该足够了。另一种方法是在表模型中使用自定义Comparator来管理排序逻辑。