title: How to populate a jTable from an ArrayList?
body: <p>The program is meant to take the user input and store it in an arraylist. Then the user can print the details onto the jtable. After, he can remove an item from the jtable by selecting a row. </p>
  
  <p>I have 2 problems. </p>
  
  <p>First problem is that I get errors while looping through the arraylist. </p>
  
  <p>Second problem is when the user removes a row, the item is removed from the table but I also want to delete that particular item from the array too. So that if the user clicks on print button again, the item doesn't appear again.  </p>
  
  <p>Problem here, Looping through arraylist:</p>
  
  <pre><code>model = (DefaultTableModel) table.getModel();
      for (int i=0; i&lt;lib.data.size(); i++){
              book = lib.data.get(i);
  
      }
  
      model.addRow(book);
  </code></pre>
  
  <p>I have 3 classes, Test, Library, and Book</p>
  
  <p>Test Class</p>
  
  <pre><code> import javax.swing.*;
    import java.awt.*;
     import java.awt.event.*;
    import java.util.*;
     import javax.swing.table.*;
        import javax.swing.border.*;
  
     public class Test extends JFrame{
  
      static Library lib = new Library();
      static Book book = new Book();
  
      private JFrame frame = new JFrame("Book");
      private JPanel panel = new JPanel();
  
      private JLabel label2, label3;
  
      private JTextField textfield1, textfield2;
  
      private JButton button1, button2, button3;
  
      private DefaultTableModel model;
      private JTable table;
      private JScrollPane pane;
  
      void form(){
  
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
      panel.setLayout(null);
  
      model = new DefaultTableModel();
      table = new JTable(model);
      pane = new JScrollPane(table);
      model.addColumn("Title");
      model.addColumn("Author");
      pane.setBounds(11, 221, 125, 21);
      panel.add(pane);
  
      pane.setSize(200, 100);
      pane.setVisible(true);
      setVisible(false);
      setSize(60, 60);
  
      label2 = new JLabel("title:");
      label2.setBounds(9, 61, 123, 13);
      panel.add(label2);
  
      label3 = new JLabel("author:");
      label3.setBounds(9, 91, 123, 13);
      panel.add(label3);
  
  
      textfield1 = new JTextField(10);
      textfield1.setBounds(121, 63, 125, 21);
      panel.add(textfield1);
  
      textfield2 = new JTextField(10);
      textfield2.setBounds(121, 93, 125, 21);
      panel.add(textfield2);
  
      button1 = new JButton("Store");
      button1.setBounds(351, 226, 125, 21);
      panel.add(button1);
  
      button2= new JButton("View");
      button2.setBounds(351, 256, 125, 21);
      panel.add(button2);
  
      button3= new JButton("Delete");
      button3.setBounds(351, 286, 125, 21);
      panel.add(button3);
  
  
      frame.add(panel);
      frame.setSize(545,540);
      frame.setVisible(true);
  
      //Store
      button1.addActionListener(new ActionListener(){
      public  void actionPerformed(ActionEvent e){
  
      String title = textfield1.getText();
      String author = textfield2.getText();
  
      book = new Book(title, author);
      lib.addBook(book);
  
      System.out.println(book);
  
      }
      });
  
      //View
      button2.addActionListener(new ActionListener(){
      public  void actionPerformed(ActionEvent e){
  
      model = (DefaultTableModel) table.getModel();    
  
              String title = textfield1.getText();
              String author = textfield2.getText();
  
              book = new Book(title, author);
      lib.addBook(book);
  
  
      book = new Book();
      book.setTitle(title);
      book.setAuthor(author);
      lib.addBook(book);
      lib.fireTableDataChanged();
  
  
  
      }
      });
  
  
      //Delete
      button3.addActionListener(new ActionListener(){
      public  void actionPerformed(ActionEvent e){
  
      model = (DefaultTableModel) table.getModel();
  
      int numRows = table.getSelectedRows().length; 
      for(int i=0; i&lt;numRows ; i++ ) 
      model.removeRow(table.getSelectedRow());
  
      }
      });
  
  
      }
  
      public static void main(String [] args){
  
          Test a = new Test();
          a.form();
          }
  
  
      }
  </code></pre>
  
  <p>Library Class</p>
  
  <pre><code>   import java.util.*;
       import javax.swing.*;
     import javax.swing.table.AbstractTableModel;
  
     class Library extends AbstractTableModel {
  
  List&lt;Book&gt; data;
  String[] columnNames = {"Title", "Author"};
  
  public Library() {
      data = new ArrayList&lt;Book&gt;();
  
      //data.add(new Book("Java", "William"));
  
  
  
  }
  
  
  @Override
  public String getColumnName(int column) {
      return columnNames[column];
  }
  
  @Override
  public int getColumnCount() {
      return 2;
  }
  
  @Override
  public int getRowCount() {
      return data.size();
  }
  
  @Override
  public Object getValueAt(int rowIndex, int columnIndex) {
      Book book = data.get(rowIndex);
      switch (columnIndex) {
      case 0:
          return book.getTitle();
      case 1:
          return book.getAuthor();
      default:
          return null;
      }
  }
  
  public void addBook(Book book){
  
      int firstRow = data.size() - 1;
      int lastRow = firstRow;
      fireTableRowsInserted(firstRow, lastRow);
      data.add(book);
  
  }
  
  public void fireTableDataChanged() {
  
  }   
  
  public void removeBook(Book book){
          data.remove(book);
  }
     }
  </code></pre>
  
  <p>Book Class</p>
  
  <pre><code>public class Book{
  
  private String title;
  private String author;
  
  public Book(){
  
  title = "";
  author = "";
  
  }
  
  public Book(String title, String author){
  
  this.title = title;
  this.author = author;
  
  }
  
  public String getTitle(){
      return title;   
  }
  public void setTitle(String title){
      title = title;  
  }
  public String getAuthor(){
      return author;
  }
  public void setAuthor(String author){
      author = author;
  }
  
  
  
  
  public String toString(){
  
      return  "Title: " + getTitle() + "\n" + 
              "Author: " + getAuthor() + "\n";
  
    }
  
    }
  </code></pre>
  
  <p><strong>EDIT</strong></p>
  
  <p>This is what I added to my library class:</p>
  
  <pre><code>      public void addBook(Book book){
  
      int firstRow = data.size() - 1;
      int lastRow = firstRow;
      fireTableRowsInserted(firstRow, lastRow);
      data.add(book);
  
  }
  
  public void fireTableDataChanged() {
  
  }
  </code></pre>
  
  <p>This is what I added to my main class (button):</p>
  
  <pre><code>           book = new Book();
      book.setTitle(title);
      book.setAuthor(author);
      lib.addBook(book);
      lib.fireTableDataChanged();
  </code></pre>