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>
}