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

Java 从特定CSV文件读取数据并在JTable中显示,java,swing,csv,file-io,jtable,Java,Swing,Csv,File Io,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.*; im

关于这个问题:

我试图调整这个问题的程序,使之适合我的需要,但它正在犯错误。 我希望程序显示位于项目根目录中的文件(因此我必须编写
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<String[]> 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<String[]> Rs = new ArrayList<>();
        private String[] OneRow;

        public ArrayList<String[]> 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<String[]> Data = new ArrayList<>();

        public void AddCSVData(ArrayList<String[]> 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();
            }
        });
    }
}

您已经做了两次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<String[]> 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<String[]> Rs = new ArrayList<String[]>();
        private String[] OneRow;

        public ArrayList<String[]> 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<String[]> Data = new ArrayList<String[]>();

        public void AddCSVData(ArrayList<String[]> 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();
            }
        });
    }
}
包堆栈溢出;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.util.ArrayList;
导入java.util.array;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.border.EmptyBorder;
导入javax.swing.table.AbstractTableModel;
公共类T1Data扩展了JPanel{
专用最终JTable表;
公共数据(){
超级(新边界布局(3,3));
this.table=new JTable(new MyModel());
this.table.setPreferredScrollableViewportSize(新维度(700,70));
此.table.setFillsViewPerThight(true);
JPanel ButtonOpen=新的JPanel(新的FlowLayout(FlowLayout.CENTER));
添加(按钮打开,边界布局。南部);
//创建滚动窗格并将表添加到其中。
JScrollPane scrollPane=新的JScrollPane(表);
//将滚动窗格添加到此面板。
添加(滚动窗格,BorderLayout.CENTER);
//添加一个漂亮的边框
新订单(新的空订单(5,5,5,5));
CSVFile Rd=新的CSVFile();
MyModel NewModel=新的MyModel();
此.table.setModel(NewModel);
文件数据文件=新文件(“res.csv”);
ArrayList Rs2=Rd.ReadCSVfile(数据文件);
NewModel.AddCSVData(Rs2);
System.out.println(“行:+NewModel.getRowCount());
System.out.println(“Cols:+NewModel.getColumnCount());
}
//读取CSV文件的方法
公共类CSVFile{
私有最终ArrayList Rs=新ArrayList();
私有字符串[]OneRow;
公共ArrayList ReadCSVfile(文件数据文件){
试一试{
BufferedReader brd=新的BufferedReader(新文件读取器(数据文件));
while(brd.ready()){
字符串st=brd.readLine();
OneRow=st.split(“,|\\s |”);
Rs.add(OneRow);
System.out.println(Arrays.toString(OneRow));
}//时间结束
}//尝试结束
捕获(例外e){
字符串errmsg=e.getMessage();
System.out.println(“未找到文件:+errmsg”);
}//捕获结束
返回Rs;
}//读取文件结束方法
}//CSVFile类结束
私有静态void createAndShowGUI(){
//创建并设置窗口。
JFrame frame=新JFrame(“T1Data”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建并设置内容窗格。
T1Data newContentPane=newt1data();
frame.setContentPane(newContentPane);
//显示窗口。
frame.pack();
frame.setVisible(true);
}
类MyModel扩展了AbstractTableModel{
私有最终字符串[]columnNames={“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”};
private ArrayList Data=new ArrayList();
public void AddCSVData(ArrayList DataIn){
this.Data=DataIn;
this.fireTableDataChanged();
}
@凌驾
public int getColumnCount(){
返回columnNames.length;//长度;
}
@凌驾
public int getRowCount(){
返回Data.size();
}
@凌驾
公共字符串getColumnName(int-col){
返回列名[col];
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回数据。获取(行)[col];
}
}
公共静态void main(字符串[]args){
//为事件调度线程计划作业:
//创建并显示此应用程序的GUI。
javax.swing.SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
createAndShowGUI();
}
});
}
}
更新:

输出:

您的问题在于读取器内部的
循环。
您读取一行,测试它是否为空,因为它不是空的,您读取并处理下一行。我假设你只看到文件中的第二行和第四行,对吗?
更好的方法是:

String st = brd.readLine();
while (st != null) {
    <do something>
    st = brd.readLine();
}
String st=brd.readLine();
while(st!=null){
st=brd.readLine();
}

while((字符串st=brd.readLine())!=null){
}
(一般不鼓励使用第二种变体)


此外,上面的代码充满了弊端(不关闭资源、创建双重模型、命名约定不一致等)。我建议你找人来查看(或发帖),除非你知道这些,只是懒得做一个更好的例子。

不,我只是相对来说是新手,我认为问题的代码编辑正确。我会的。我理解你读两遍的意思,谢谢,我试图更正它,但是控制台中的显示没有问题,但它没有像预期的那样在
JPanel中显示,它正在生成错误。如果我在循环之前做了几次
brd.readLine()
,它工作正常(但只显示最后两行)
String st = brd.readLine();
while (st != null) {
    <do something>
    st = brd.readLine();
}
while ((String st = brd.readLine()) != null) {
    <do stuff>
}