从特定CSV文件读取数据并将其显示在JTable中

关于此问题: 从CSV文件中读取数据并将其显示在JTable中

我试图调整这个问题的程序,以使其符合我的需要,但它犯了错误。 我希望程序显示位于项目根目录中的文件(因此我必须编写File DataFile = new File("res.csv"); )这就是全部。 问题是它只显示2行,当应该显示4行时。

这是代码:

 import java.util.*; import java.awt.event.*; import javax.swing.*; import java.awt.BorderLayout; import java.awt.*; import javax.swing.border.EmptyBorder; import java.io.*; import javax.swing.table.*; public class T1Data extends JPanel { private final JTable table; public T1Data() { super(new BorderLayout(3, 3)); this.table = new JTable(new MyModel()); this.table.setPreferredScrollableViewportSize(new Dimension(700, 70)); this.table.setFillsViewportHeight(true); JPanel ButtonOpen = new JPanel(new FlowLayout(FlowLayout.CENTER)); add(ButtonOpen, BorderLayout.SOUTH); // Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); // Add the scroll pane to this panel. add(scrollPane, BorderLayout.CENTER); // add a nice border setBorder(new EmptyBorder(5, 5, 5, 5)); CSVFile Rd = new CSVFile(); MyModel NewModel = new MyModel(); this.table.setModel(NewModel); File DataFile = new File("res.csv"); ArrayList Rs2 = Rd.ReadCSVfile(DataFile); NewModel.AddCSVData(Rs2); System.out.println("Rows: " + NewModel.getRowCount()); System.out.println("Cols: " + NewModel.getColumnCount()); } // Method for reading CSV file public class CSVFile { private ArrayList Rs = new ArrayList(); private String[] OneRow; public ArrayList ReadCSVfile(File DataFile) { try { BufferedReader brd = new BufferedReader( new FileReader(DataFile)); while (brd.readLine() != null) { String st = brd.readLine(); OneRow = st.split(",|\\s|;"); Rs.add(OneRow); System.out.println(Arrays.toString(OneRow)); } // end of while } // end of try catch (Exception e) { String errmsg = e.getMessage(); System.out.println("File not found:" + errmsg); } // end of Catch return Rs; }// end of ReadFile method }// end of CSVFile class private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("T1Data"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the content pane. T1Data newContentPane = new T1Data(); frame.setContentPane(newContentPane); // Display the window. frame.pack(); frame.setVisible(true); } class MyModel extends AbstractTableModel { private String[] columnNames = { "1", "2", "3", "4", "5", "6", "7", "8" }; private ArrayList Data = new ArrayList(); public void AddCSVData(ArrayList DataIn) { this.Data = DataIn; this.fireTableDataChanged(); } @Override public int getColumnCount() { return columnNames.length;// length; } @Override public int getRowCount() { return Data.size(); } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public Object getValueAt(int row, int col) { return Data.get(row)[col]; } } public static void main(String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } 

CSV文件的内容:带“​​。” 这似乎很麻烦:

 Valeur par défaut,07/04/2014,0.5,1,0,0,0 Valeur par défaut,07/04/2014,0.5,1,0,0,0 Valeur par défaut,07/04/2014,0.5,1,0,0,0 Valeur par défaut,07/04/2014,0.5,1,0,0,0 Valeur par défaut,07/04/2014,0.5,1,0,0,0 

你已经完成了readLine两次。 一旦处于while状态,然后进入其中。 您正在丢失在while条件下读取的行。

更新:将代码更改为以下内容,它提供了预期的输出:

 package stackoverflow; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.EmptyBorder; import javax.swing.table.AbstractTableModel; public class T1Data extends JPanel { private final JTable table; public T1Data() { super(new BorderLayout(3, 3)); this.table = new JTable(new MyModel()); this.table.setPreferredScrollableViewportSize(new Dimension(700, 70)); this.table.setFillsViewportHeight(true); JPanel ButtonOpen = new JPanel(new FlowLayout(FlowLayout.CENTER)); add(ButtonOpen, BorderLayout.SOUTH); // Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); // Add the scroll pane to this panel. add(scrollPane, BorderLayout.CENTER); // add a nice border setBorder(new EmptyBorder(5, 5, 5, 5)); CSVFile Rd = new CSVFile(); MyModel NewModel = new MyModel(); this.table.setModel(NewModel); File DataFile = new File("res.csv"); ArrayList Rs2 = Rd.ReadCSVfile(DataFile); NewModel.AddCSVData(Rs2); System.out.println("Rows: " + NewModel.getRowCount()); System.out.println("Cols: " + NewModel.getColumnCount()); } // Method for reading CSV file public class CSVFile { private final ArrayList Rs = new ArrayList(); private String[] OneRow; public ArrayList ReadCSVfile(File DataFile) { try { BufferedReader brd = new BufferedReader(new FileReader(DataFile)); while (brd.ready()) { String st = brd.readLine(); OneRow = st.split(",|\\s|;"); Rs.add(OneRow); System.out.println(Arrays.toString(OneRow)); } // end of while } // end of try catch (Exception e) { String errmsg = e.getMessage(); System.out.println("File not found:" + errmsg); } // end of Catch return Rs; }// end of ReadFile method }// end of CSVFile class private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("T1Data"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the content pane. T1Data newContentPane = new T1Data(); frame.setContentPane(newContentPane); // Display the window. frame.pack(); frame.setVisible(true); } class MyModel extends AbstractTableModel { private final String[] columnNames = { "1", "2", "3", "4", "5", "6", "7", "8" }; private ArrayList Data = new ArrayList(); public void AddCSVData(ArrayList DataIn) { this.Data = DataIn; this.fireTableDataChanged(); } @Override public int getColumnCount() { return columnNames.length;// length; } @Override public int getRowCount() { return Data.size(); } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public Object getValueAt(int row, int col) { return Data.get(row)[col]; } } public static void main(String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } } 

更新:

输出: 在此处输入图像描述

您的问题出while读者内部的while循环中。 您读取一行,测试它是否为空,并且由于它不是, 您将读取并处理下一行 。 假设您只看到文件中的第二行和第四行,我是否正确? 更好的方法是:

 String st = brd.readLine(); while (st != null) {  st = brd.readLine(); } 

要么

 while ((String st = brd.readLine()) != null) {  } 

(通常不鼓励使用第二种变体)

此外,上面的代码充满了不法行为(不是关闭资源,双模型创建,不一致的命名约定等)。 我建议你让某人查看它(或发布到https://codereview.stackexchange.com/ ),除非你知道这些并且只是懒得做出更好的例子。