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

JTable仅显示导入CSV数据的第一列,如何显示全部列?

问题解决:JTable仅显示第一列的修复方案

错误原因分析

  1. 列名定义错误
    你通过String[] columnNames = new String[]{Arrays.toString(records.get(0))};把CSV第一行的所有列名拼接成了单个字符串,最终列名数组只有1个元素,JTable自然只会渲染1列。正确的列名数组应该直接使用CSV第一行拆分后的字符串数组。

  2. 数据填充循环边界错误
    循环中i < records.size() - 1和j < records.get(0).length - 1的限制,会导致最后一行数据和最后一列数据被遗漏,同时也会让表格的行列数不完整。

修改后的完整代码

import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;

public class mealBuilder {

    public static void main(String[] args) throws FileNotFoundException {

        File myObj = new File("NutrData.csv");
        Scanner myReader = new Scanner(myObj);
        ArrayList<String[]> records = new ArrayList<String[]>();
        String[] record;

        while (myReader.hasNextLine()) {
            record = myReader.nextLine().split(",");
            records.add(record);
        }
        myReader.close(); // 关闭文件资源,避免泄漏

        // 直接用CSV第一行作为列名数组
        String[] columnNames = records.get(0);

        // 数据行从第二行开始,所以数组长度是records.size()-1
        Object[][] dataS = new Object[records.size() - 1][columnNames.length];
        for (int i = 1; i < records.size(); i++) {
            for (int j = 0; j < columnNames.length; j++) {
                dataS[i - 1][j] = records.get(i)[j];
            }
        }

        JFrame frame = new JFrame("Meal-Builder");
        JPanel panel = new JPanel(new BorderLayout());

        JTable foodMenu = new JTable(dataS, columnNames);
        JScrollPane scroll = new JScrollPane(foodMenu, 
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        // 替换null布局为标准布局管理器,避免组件自适应问题
        frame.setLayout(new FlowLayout());
        frame.setSize(1400, 900);

        panel.setPreferredSize(new Dimension(700, 400));
        foodMenu.setPreferredScrollableViewportSize(new Dimension(600, 400));

        frame.add(panel);
        panel.add(scroll, BorderLayout.CENTER);
        frame.setVisible(true);
    }
}

额外优化说明

  • 新增myReader.close()关闭文件扫描器,避免资源泄漏。
  • 数据填充从第二行开始,避免把列名行当成数据行。
  • 替换frame.setLayout(null)为FlowLayout,null布局会导致窗口缩放、组件自适应等问题,推荐使用标准布局管理器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:27:31