title: Writing text file from JTable, and Reading from text file to JTable
body: <p>I feel like I am close but still running into errors I do not understand. I am attempting to write data from my JTable to a text file using the save button.  I also need to load from the file back into the JTable.  Any suggestions why this isn't working correctly.</p>
  
  <pre><code>import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.io.BufferedReader;
  import java.io.BufferedWriter;
  import java.io.FileWriter;
  import java.io.FileReader;
  import javax.swing.JButton;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JOptionPane;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTable;
  import javax.swing.JTextField;
  import javax.swing.table.DefaultTableModel;
  
  
  /*PayrollProgram.java
   * Created by: Steve Totten
   * Created on: 10-13-2013
   * This program allows the user to enter the contact's
   * name, Email address, age, and phone number.  Then the program
   * adds the information to a table for easy viewing
   * The program has a save button to save to a data file
   * it also has a load button that will read from a file to the table
   */
  
      public class ContactInfo {
  
      // Set up the size of the GUI window
      private static final int FRAME_WIDTH = 900;
      private static final int FRAME_HEIGHT = 400;
      static JTable tblContacts;
      static int ID = 0;
  
      public static void main(String[] args) {
  
          // Set up the user interface
          final JFrame frame = new JFrame();
          final JPanel buttonPanel = new JPanel();
          frame.add(buttonPanel);
          // I need this to be able to put the buttons where I want
          buttonPanel.setLayout(null);
  
          // Set up Add button and its location
          final JButton buttonAdd = new JButton(" Add ");
          buttonAdd.setBounds(50, 325, 100, 20);
          buttonPanel.add(buttonAdd);
  
  
          // Set up Exit button and its location
          final JButton buttonExit = new JButton("Exit");
          buttonExit.setBounds(200, 325, 100, 20);
          buttonPanel.add(buttonExit);
  
          // Method for exit button
          buttonExit.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
  
                  System.exit(0);
              }
          });
  
          // Set up Save button and its location
          final JButton buttonSave = new JButton("Save");
          buttonSave.setBounds(350, 325, 100, 20);
          buttonPanel.add(buttonSave);
  
          // Set up Save button method
          buttonSave.addActionListener(new ActionListener(){
              @Override
              public void actionPerformed(ActionEvent e) {
                  try{
  
                      BufferedWriter bfw = new BufferedWriter(new FileWriter("C:\\Users\\Steve\\Workspace\\ContactInfo\\ContactInfo.txt"));
  
                        for (int i = 0 ; i &lt; tblContacts.getRowCount(); i++)
                        {
  
                          for(int j = 0 ; j &lt; tblContacts.getColumnCount();j++)
                          {
                              bfw.newLine();
                              bfw.write((String)(tblContacts.getValueAt(i,j)));
                              bfw.write("\t");;
                          }
                        }
                        bfw.close();
              }catch(Exception ex) {
  
                  ex.printStackTrace();
              }
              }
          });
          // Set up Load button and its location
          final JButton buttonLoad =  new JButton("Load");
          buttonLoad.setBounds(500, 325, 100, 20);
          buttonPanel.add(buttonLoad);
  
          // Method for load button
          buttonLoad.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                  String line;
                  BufferedReader reader;
                      try{       
                          reader = new BufferedReader(new FileReader("C:\\Users\\Steve\\Workspace\\ContactInfo\\ContactInfo.txt"));
                          while((line = reader.readLine()) != null) 
                          {
                             tblContacts.add(null, line.split(", ")); 
                          }
                          reader.close();
                       }
                      catch(Exception ex){
  
                  ex.printStackTrace();
  
                      }
  
              }
          });
          // Set up Labels for name, hours, and pay rate
          final JLabel lblFirst = new JLabel("Enter First Name: ");
          lblFirst.setBounds(20, 5, 150, 100);
          buttonPanel.add(lblFirst);
  
          final JLabel lblLast = new JLabel("Enter Last Name: ");
          lblLast.setBounds(20, 60, 150, 100);
          buttonPanel.add(lblLast);
  
          final JLabel lblAddress = new JLabel("Enter their Age: ");
          lblAddress.setBounds(20, 115, 150, 100);
          buttonPanel.add(lblAddress);
  
          final JLabel lblAge = new JLabel("Enter Email Address:");
          lblAge.setBounds(20, 170, 150, 100);
          buttonPanel.add(lblAge);
  
          final JLabel lblPhone = new JLabel("Enter phone number:");
          lblPhone.setBounds(20, 225, 150, 100);
          buttonPanel.add(lblPhone);
  
  
          // Set up textboxes for all expected inputs
          final JTextField txtFirst = new JTextField();
          txtFirst.setBounds(180, 40, 100, 25);
          buttonPanel.add(txtFirst);
  
          final JTextField txtLast = new JTextField();
          txtLast.setBounds(180, 95, 100, 25);
          buttonPanel.add(txtLast);
  
          final JTextField txtAge = new JTextField();
          txtAge.setBounds(180, 150, 100, 25);
          buttonPanel.add(txtAge);
  
          final JTextField txtPhone = new JTextField();
          txtPhone.setBounds(180, 260, 100, 25);
          buttonPanel.add(txtPhone);
  
          final JTextField txtEmail = new JTextField();
          txtEmail.setBounds(180, 210, 100, 25);
          buttonPanel.add(txtEmail);
  
          // Set up of columns in the table
          String[] columns = { "ID", "Last Name", "First Name", "Age", "Email Address",
                  "Phone Number" };
          // Set up of the table with the appropriate column headers
          final DefaultTableModel model = new DefaultTableModel(null, columns);
          final JTable tblContacts = new JTable();
          tblContacts.setModel(model);
          JScrollPane scrollPane = new JScrollPane(tblContacts);
          scrollPane.setBounds(300, 20, 550, 300);
          buttonPanel.add(scrollPane);
  
  
          // Save button methods, including validation checking
          buttonAdd.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                  if (txtFirst.getText().length() == 0) {
                      JOptionPane.showMessageDialog(null, "Error: no first name");
                      return;
                  }
  
                  if (txtLast.getText().length() == 0) {
                      JOptionPane.showMessageDialog(null, "Error: no last name");
                      return;
                  }
  
                  int age = 0;
                  try {
                      age = Integer.parseInt(txtAge.getText());
                  } catch (Exception ex) {
                      JOptionPane.showMessageDialog(null,
                              "Error: invalid age value");
                      return;
                  }
  
                  if (age &lt; 0 || age &gt; 120) {
                      JOptionPane.showMessageDialog(null,
                              "Error: invalid age range (0 - 120 allowed)");
                      return;
                  }
  
                  if (txtPhone.getText().length()==0){
                      JOptionPane.showMessageDialog(null, "Error: no phone number ");
                      return;
                  }
  
  
                  // Add an ID number to each entry and add the entry to the table
                  ID++;
                  model.addRow(new Object[] { String.valueOf(ID),
                          txtLast.getText(), txtFirst.getText(),
                          txtAge.getText(), txtEmail.getText(), txtPhone.getText() });
  
  
                  // Once entry is added to the table, the text fields are cleared for the next entry
                  txtLast.setText("");
                  txtFirst.setText("");
                  txtAge.setText("");
                  txtPhone.setText("");
                  txtEmail.setText("");
  
  
  
              }
          });     
          /*
           * This sets the size of the window along with the title and it sets up
           * the exit on close X button to close the window when the X is clicked.
           */
  
          frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
          frame.setTitle("Contact Information");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setVisible(true);
      }
  
  }
  </code></pre>