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
相关产品推荐
相关产品推荐

