this is a follow up to a question I asked about a day ago, I have been trying to debug the code with no success, but basically the application is supposed to allow the user to select the CSV they want to import or view, after selecting the file they will only view the contents of the Csv in a JTable. currently I can view the data in the csv but it doesn't show in the Jtable as it is supposed to. here is the code for the program below, with the exception that netbeans throws at me.
public class Asist_payment_import_v1 extends JPanel implements ActionListener{
private final JTable Table;
public Asist_payment_import_v1(){
super(new BorderLayout(3,3));
this.Table = new JTable(new MiModel());
this.Table.setPreferredScrollableViewportSize(new Dimension(700,70));
this.Table.setFillsViewportHeight(true);
JPanel ButtonOpen = new JPanel(new FlowLayout(FlowLayout.CENTER));
//the below utton will be used to upload csv data to Database, the action listener should connect to the db, and pass data into the Db.
//JPanel ButtonUpload = new JPanel(new FlowLayout(FlowLayout.LEFT));
JButton open_file = new JButton("Open");
JButton save_file = new JButton("Save");
ButtonOpen.add(open_file);
add(ButtonOpen, BorderLayout.SOUTH);
open_file.addActionListener(this);
save_file.addActionListener(this);
//create scrollPane to this Panel
JScrollPane scrollpane = new JScrollPane(Table);
//add the scroll pane to this pane
add(scrollpane,BorderLayout.CENTER);
//add Border
setBorder(new EmptyBorder(5,5,5,5));
}
public void actionPerformed(ActionEvent Event)
{
JFileChooser file_chooser = new JFileChooser();
boolean pressed = true;
if(pressed)
{
int ReturnVal = file_chooser.showOpenDialog(null);
CSVFile Rd = new CSVFile();
MiModel NewModel = new MiModel();
this.Table.setModel(NewModel);// to set the Table model
File DataFile = file_chooser.getSelectedFile();
ArrayList<String[]> rs2 = Rd.ReadCSVFile(DataFile);
NewModel.AddCSVData(rs2);
System.out.println("Rows: " +NewModel.getRowCount());
System.out.println("Cols: " +NewModel.getColumnCount());
}
}
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(",");
Rs.add(OneRow);
System.out.println(Arrays.toString(OneRow));
}
}//end try
catch(Exception ex){
String errmsg = ex.getMessage();
System.out.println("File not Found: "+errmsg);
}//end exception handling
return Rs;
}//End of ArrayList_readCSVFile class
}//End of CSVFile class
private static void createAndShowGui()
{
//setup Window
JFrame frame = new JFrame("PaymentImport");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//setup the conentPane
Asist_payment_import_v1 newContentPane = new Asist_payment_import_v1();
frame.setContentPane(newContentPane);
//display the window
frame.pack();
frame.setVisible(true);
}
class MiModel extends AbstractTableModel
{
private String [] columnNames = {"Nr","LinkId","Ammount","PayDate","Month","Year","Printed","User","RefNo","ShortSwi",
"BranchNo","SyncHQ","SyncBranch","SysDateStamp","RDReason","UnderPrice","PaydMark","RecieptPrinted"};
private ArrayList<String[]>Data = new ArrayList<>();
public void AddCSVData(ArrayList<String[]> DataIn){
this.Data = DataIn;
this.fireTableDataChanged();
}
@Override
public int getColumnCount(){
return columnNames.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];
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// schedule a job for the event-despatching thread:
//creating and showing this application's GUI
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
createAndShowGui();
}
}); } }
the exception thrown:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 16
at asist_payment_import_v1.Asist_payment_import_v1$MiModel.getValueAt(Asist_payment_import_v1.java:150)
at javax.swing.JTable.getValueAt(JTable.java:2717)
at javax.swing.JTable.prepareRenderer(JTable.java:5706)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent._paintImmediately(JComponent.java:5158)
at javax.swing.JComponent.paintImmediately(JComponent.java:4969)
at javax.swing.RepaintManager$4.run(RepaintManager.java:831)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
here is part of the results which show on the netbeans output panel, instead of the JTable:
[2019017, 288633, 69.00, 20171127, 11, 2017, "False", "Annamarie", "Group
Payment (19061)", "False", "All", 0, , , "2017-11-27 09:43:13", "", 54.00,
20171127]
[2019019, 288638, 42.00, 20171127, 11, 2017, "False", "Annamarie", "Group
Payment (19061)", "False", "All", 0, , , "2017-11-27 09:43:13", "", 27.00,
20171127]
[2019021, 315068, 42.00, 20171127, 11, 2017, "False", "Annamarie", "Group
Payment (19061)", "False", "All", 0, , , "2017-11-27 09:43:14", "", 27.00,
20171127]
[2019023, 294133, 69.00, 20171127, 11, 2017, "False", "Annamarie", "Group
Payment (19061)", "False", "All", 0, , , "2017-11-27 09:43:14", "", 54.00,
20171127]
[2019025, 288623, 130.00, 20171127, 11, 2017, "False", "Annamarie", "Group
Payment (19063)", "False", "All", 0, , , "2017-11-27 09:43:30", "", 1068.80,
20171127]
[2019027, 288625, 105.00, 20171127, 11, 2017, "False", "Annamarie", "Group
Payment (19063)", "False", "All", 0, , , "2017-11-27 09:43:31", "", 855.00,
20171127]
Rows: 690551
Cols: 18
I came across a solution for this question, I made alterations to my CSV Method that reads the csv data.. here are the changes made
public class CSVFile
{
private ArrayList<String[]> arrLs = new ArrayList<>();
private Object OneRow;
public ArrayList<String[]> ReadCSVFile(File DataFile)
{
try
{
//BufferedReader to Read through CSV Contents
BufferedReader reader = new BufferedReader (new FileReader(DataFile));
String line;
// while loop to read through the data, while bufferedreader is not null-do ....
while(reader.readLine()!= null)
{
try
{
line = reader.readLine();
if(line != null)
{
String[] array = line.split(",");
for(String result:array)
{
//System.out.println(OneRow[2]+");
System.out.println(result);
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
if(reader == null)
{
reader.close();
}
}
//if statement needed in the case the
//Selected CSV has more than the required number of ColumnHeaders
//and the BufferedReader needs to skip the first Row, as this is the
//columnHeaders and they cannot be included again
String read = reader.readLine();//bufferedreader string variable
OneRow = read.split(",");
arrLs.add((String[]) OneRow);
// System.out.println(Arrays.toString(OneRow));
}//end try
catch(Exception ex)
{
String errmsg = ex.getMessage();
//System.out.println("File not Found: "+errmsg);
} // end exception handling
return (ArrayList<String[]>) arrLs;
} //End of ArrayList_readCSVFile class
} //End of CSVFile class
}
This allowed me to view the csv data in the JTable which was the main issue here