JTable仅显示导入CSV数据的第一列,如何显示全部列?
问题解决:JTable仅显示第一列的修复方案
错误原因分析
列名定义错误
你通过String[] columnNames = new String[]{Arrays.toString(records.get(0))};把CSV第一行的所有列名拼接成了单个字符串,最终列名数组只有1个元素,JTable自然只会渲染1列。正确的列名数组应该直接使用CSV第一行拆分后的字符串数组。数据填充循环边界错误
循环中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
相关产品推荐
相关产品推荐

