gpt4 book ai didi

Java:根据枚举中的列对 JTable 进行排序

转载 作者:行者123 更新时间:2023-12-02 12:00:09 27 4
gpt4 key购买 nike

我有一个 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;
}
}

最佳答案

为了避免循环遍历每行的枚举值,您可能需要创建 static final HashMap<Integer,IMPORT_CONF_OPERATION_RESULT>将值的映射缓存到相应的标签,并在枚举内部的静态 block 中对其进行初始化。那么你就可以拥有public static String getLabelByValue(int value)使用缓存并避免 O(n)用于每次查找标签。

为了控制排序顺序和排序操作,您可能需要执行 TableRowSorter但是当您覆盖 getValueAt 时对于您的模型,默认排序应该足够了。其他方法是使用自定义 Comparator在表模型中管理排序逻辑。

关于Java:根据枚举中的列对 JTable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47326118/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com