csv JTable只显示导入数据的第一列,如何显示所有列?

9lowa7mx  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(179)

我正在构建一个包含从csv工作表导入的值的表。我有95行和26列。我想显示JTable中的所有"dataS"值,但我只得到了第一列。
我存储数据值的方式有什么问题吗?
谢谢!

import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
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 = new String[2];

        while (myReader.hasNextLine()) {
            record = myReader.nextLine().split(",");
            records.add(record);
        }

        String[] columnNames = new String[]{Arrays.toString(records.get(0))}

        Object[][] dataS = new Object[records.size()][records.get(0).length];

        for (int i = 0; i < records.size() - 1; i++) {
            for (int j = 0; j < records.get(0).length - 1; j++) {
                dataS[i][j] = records.get(i)[j];
            }
        }

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

        JTable foodMenu = new 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);
        frame.setLayout(null);
        frame.setSize(1400, 900);

        panel.setSize(700, 400);
        panel.setLocation(25, 25);
        foodMenu.setPreferredScrollableViewportSize(new Dimension(600, 400));

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

aurhwmvo1#

苏,两个核心问题。
首先...

String[] columnNames = new String[]{Arrays.toString(records.get(0))}

创建一个包含单个元素的数组,该数组是records.get(0)中所有元素的连接结果
它应该是简单的...

String[] columnNames = records.get(0);

第二...

for (int i = 0; i < records.size() - 1; i++) {
    for (int j = 0; j < records.get(0).length - 1; j++) {
        dataS[i][j] = records.get(i)[j];
    }
}

首先,您包含了结果的第一行,它实际上是头值,而在两个循环中,您排除了最后一个元素(i < records.size() - 1
应该更像是...

for (int i = 1; i < records.size(); i++) {
    for (int j = 0; j < columnNames.length; j++) {
        dataS[i][j] = records.get(i)[j];
    }
}

补充...
frame.setLayout(null);没有给您带来任何好处,事实上,它给您带来了很多伤害。
事实上,我不明白为什么要使用第二个JPanel来包含JScrollPane,整个事情可能会简化为...

EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        JFrame frame = new JFrame("Meal-Builder");

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

        frame.add(scroll);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
});

相关问题