Reading data from CSV file and displaying it in a JTable

10,953

(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);
Share:
10,953
Alpha
Author by

Alpha

Updated on June 23, 2022

Comments

  • Alpha
    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();
        }
    }