JFreeChart 基于TXT数据源绘制柱状图时缺失最后一行对应柱形的问题
异常根因定位
- 先排查文件读取逻辑:你写的BufferedReader逐行读文件的代码本身没有漏读最后一行的问题,18行文本都会被正常读取处理,不存在循环跳行的bug。
- 真正的问题出在数据集构建环节:你把每行的位置字符串直接作为横轴分类标签传入
dataset.addValue(),但提供的数据源里有两个不同停车场对应完全一样的位置名"Dundasvale"——分别是第3行ID为CPG21C的停车场、第18行ID为CPG01C的停车场。 DefaultCategoryDataset的运行规则是:如果传入的分类键已经存在,只会更新这个分类对应的柱形数值,不会额外新增一根同名标签的柱形。18行数据去重分类键后刚好得到17个不重复的标签,和你看到的“只渲染17根柱形”的现象完全吻合。- 你看到的“跳过最后一行”的错觉,本质是最后一行的标签已经被第三行提前占用,处理到最后一行时只是用它的占用率数值覆盖了原有Dundasvale柱形的高度,没有新增柱形,看起来就像这行被完全丢弃了。
修复方案
- 给横轴分类标签补充唯一标识,从根源避免重名合并:不要单独用location作为分类键,把停车场ID和位置拼接成带唯一标识的标签再传入数据集,比如使用
theBSTP.getId() + " - " + theBSTP.getLocation()作为分类值,保证每个停车场对应独立的柱形。 - 把当前的手动读行循环改写为JDK里标准的读行写法,减少后续维护的出错概率:
这种写法和你当前的读行逻辑功能完全一致,但去掉了重复的读行代码,避免后续修改时出现多跳一行、漏读一行的问题。// 替换原来的“先初始化line、循环内二次调用readLine”的写法 String line; while ((line = br.readLine()) != null) { // 原有行拆分、对象构建、数值添加的逻辑完全保留 } - 补充一个代码优化点:你当前用了try-with-resources语法初始化BufferedReader,代码块执行完成后会自动关闭流,不需要再手动调用
br.close(),这段重复的关闭代码可以删掉。 - 调试阶段可以加一行日志,打印每次传入数据集的分类标签和对应数值,跑一遍就能直观看到两个同名"Dundasvale"的处理过程,确认覆盖逻辑。
内容的提问来源于stack exchange,提问作者Oceanous
相关产品推荐
相关产品推荐

