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

JTable.getColumnModel().getColumnCount()与model.getColumnCount()差异及数据问题

问题分析与解决

一、getColumnCount返回值不同的原因

你代码的核心问题是自定义的EquipoTableModel没有和TableEquipo(继承自JTable)建立关联:

  • model.getColumnCount()返回的是你自行创建的EquipoTableModel的列数(3),但这个模型是独立对象,并未被设置为表格的数据源。
  • table.getColumnModel().getColumnCount()返回的是表格当前实际关联的模型的列数:你的TableEquipo构造函数先调用super(data, headers),这会让JTable自动创建一个DefaultTableModel作为自身数据源,但你后续没有把自定义的model绑定到表格上;再加上重写getModel()方法返回自定义模型,导致表格内部使用的模型和你对外暴露的模型不是同一个,最终出现列数不一致(甚至为0)的情况。

二、添加getModel()后无法加载数据的原因

你重写getModel()返回自定义的EquipoTableModel,但JTable本身并没有将这个模型作为自身数据源:

  • 表格初始化时依赖super(data, headers)创建的默认模型,即使你给TableRowSorter传入了自定义model,表格的数据绑定逻辑仍基于默认模型。
  • 当其他依赖getModel()的组件(比如UI渲染、数据加载逻辑)获取模型时,拿到的是未和表格绑定的EquipoTableModel,而表格实际渲染用的是默认模型,两者数据完全脱节,导致数据无法加载显示。

三、修复方案

修改构造函数,将自定义模型绑定到表格,替代默认模型:

public TableEquipo(Object[][] data, String[] headers) {
    // 取消默认模型初始化,直接用自定义模型绑定表格
    super();
    model = new EquipoTableModel(data, headers);
    setModel(model); // 关键步骤:将自定义模型设置为表格的数据源
    initTable();
}

同时调整initTable()中的列遍历逻辑,直接基于自定义模型的列数:

// 替换原有的getColumnCount(),改用model的列数遍历
IntStream.range(0, model.getColumnCount()).forEach(
    c-> getColumnModel().getColumn(c).setCellRenderer(centerRenderer));

修改后,model.getColumnCount()和table.getColumnModel().getColumnCount()的返回值会保持一致,数据也能正常加载显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:06