Reading data from CSV file and displaying it in a JTable
(I've used your naming convetions, but you should read my comment above regarding the Java naming conventions for variables and classes).
You create a table pass a new MyModel
to the constructor:
JTable Table = new JTable(new MyModel());
Later you create a (separate) new MyModel
in actionPerformed()
:
MyModel NewModel = new MyModel();
File DataFile = fc.getSelectedFile();
ArrayList<String[]> Rs2 = Rd.ReadCSVfile(DataFile);
NewModel.AddCSVData(Rs2);
The problem, is that you never call table.setModel(NewModel)
.
To solve this problem, store the table variable as a field in your T1Data
class so you can refer to it later:
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);
And set the model in actionPerformed()
:
this.table.setModel(NewModel);
Alpha
Updated on June 23, 2022Comments
-
Alpha almost 2 years
I am trying to read data from a CSV file and display it on a JTable but i have a few problems. I am a noob so please bear with me. I have looked at and incorporated example code from several sources but to no avail. The table shows but it is blank. I know i am reading the data because i can print it. I suspect there is something wrong with my ModelTable setup. Any help would be greatly appreciated.
package t1data; 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 implements ActionListener { public T1Data() { super(new BorderLayout(3,3)); JTable Table = new JTable(new MyModel()); Table.setPreferredScrollableViewportSize(new Dimension(700, 70)); Table.setFillsViewportHeight(true); JPanel ButtonOpen = new JPanel( new FlowLayout(FlowLayout.CENTER) ); JButton OpenFile = new JButton("Open"); JButton SaveFile = new JButton("Save"); ButtonOpen.add(OpenFile); add(ButtonOpen, BorderLayout.SOUTH); OpenFile.addActionListener(this); SaveFile.addActionListener(this); //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)); } public void actionPerformed (ActionEvent Event) { JFileChooser fc = new JFileChooser(); boolean pressed = true; // if (Event.getSource() == OpenFile) { if (pressed) { int ReturnVal = fc.showOpenDialog(null); // if (ReturnVal == JFileChooser.APPROVE_OPTION) { CSVFile Rd = new CSVFile(); //ArrayList<String[]> Rs2 = new ArrayList<>(); MyModel NewModel = new MyModel(); File DataFile = fc.getSelectedFile(); 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"}; 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(); } }); // T1Data.createAndShowGUI(); } }