You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8下多表格列属性统一管理的优化方案问询

适配Java8的表格列统一管理方案

核心思路:用枚举封装列的所有属性

Java8的枚举支持自定义字段、构造方法和方法,刚好可以用来统一管理每列的索引、宽度、类型、名称等属性,既保留常量的便利性,又能集中管理所有列信息。

步骤1:为单个表格定义列枚举

针对每个表格,创建对应的枚举类,封装该表格所有列的属性:

import java.util.Date;

public enum TAB_EXPL {
    // 枚举实例:列名(索引, 宽度, 数据类型, 显示名称)
    ID(0, 50, Integer.class, Texts.TableColumn.ID),
    NAME(1, 200, String.class, Texts.TableColumn.NAME),
    CREATOR(2, 150, String.class, Texts.TableColumn.CREATOR),
    CREATED(3, 100, Date.class, Texts.TableColumn.CREATED);

    private final int index;
    private final int preferredWidth;
    private final Class<?> columnClass;
    private final String name;

    // 构造方法
    TAB_EXPL(int index, int preferredWidth, Class<?> columnClass, String name) {
        this.index = index;
        this.preferredWidth = preferredWidth;
        this.columnClass = columnClass;
        this.name = name;
    }

    // 提供getter方法
    public int getIndex() {
        return index;
    }

    public int getPreferredWidth() {
        return preferredWidth;
    }

    public Class<?> getColumnClass() {
        return columnClass;
    }

    public String getName() {
        return name;
    }

    // 静态方法:根据列索引获取枚举实例
    public static TAB_EXPL fromIndex(int columnIndex) {
        for (TAB_EXPL col : values()) {
            if (col.getIndex() == columnIndex) {
                return col;
            }
        }
        throw new IllegalArgumentException("Invalid column index: " + columnIndex);
    }
}

步骤2:在表格渲染中批量配置列属性

利用枚举的values()方法批量设置列宽度,无需逐个硬编码:

// 批量设置列宽度
for (TAB_EXPL col : TAB_EXPL.values()) {
    exampleTable.getColumnModel().getColumn(col.getIndex()).setPreferredWidth(col.getPreferredWidth());
}

步骤3:重构TableModel实现

借助枚举的方法,简化TableModel的核心方法实现,彻底消除硬编码:

public class ExampleTableModel extends AbstractTableModel {
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return TAB_EXPL.fromIndex(columnIndex).getColumnClass();
    }

    @Override
    public int getColumnCount() {
        return TAB_EXPL.values().length;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return TAB_EXPL.fromIndex(columnIndex).getName();
    }

    // 其他TableModel方法(如getValueAt、setValueAt等)也可通过枚举优化
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        // 示例:假设数据存在List<DataBean>中
        DataBean data = dataList.get(rowIndex);
        TAB_EXPL col = TAB_EXPL.fromIndex(columnIndex);
        switch (col) {
            case ID: return data.getId();
            case NAME: return data.getName();
            case CREATOR: return data.getCreator();
            case CREATED: return data.getCreatedDate();
            default: return null;
        }
    }
}

方案优势

  • 无硬编码:所有列属性集中在枚举中,修改时只需调整枚举实例,避免分散修改导致的错误。
  • 可读性强:通过枚举名(如TAB_EXPL.ID)直接关联列的所有属性,代码语义清晰。
  • 类型安全:枚举的类型检查避免了非法列索引或属性值的传入。
  • 适配Java8:完全基于Java8特性实现,无需依赖更高版本API。
  • 扩展性好:如需新增列属性(如对齐方式、是否可编辑),只需在枚举中添加对应字段和构造参数即可。

内容的提问来源于stack exchange,提问作者buec95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:44:59