1

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.

I have 2 problems.

First problem is that I get errors while looping through the arraylist.

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.

Problem here, Looping through arraylist:

model = (DefaultTableModel) table.getModel();
    for (int i=0; i<lib.data.size(); i++){
            book = lib.data.get(i);

    }

    model.addRow(book);

I have 3 classes, Test, Library, and Book

Test Class

 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<numRows ; i++ ) 
    model.removeRow(table.getSelectedRow());

    }
    });


    }

    public static void main(String [] args){

        Test a = new Test();
        a.form();
        }


    }

Library Class

   import java.util.*;
     import javax.swing.*;
   import javax.swing.table.AbstractTableModel;

   class Library extends AbstractTableModel {

List<Book> data;
String[] columnNames = {"Title", "Author"};

public Library() {
    data = new ArrayList<Book>();

    //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);
}
   }

Book Class

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";

  }

  }

EDIT

This is what I added to my library class:

      public void addBook(Book book){

    int firstRow = data.size() - 1;
    int lastRow = firstRow;
    fireTableRowsInserted(firstRow, lastRow);
    data.add(book);

}

public void fireTableDataChanged() {

}

This is what I added to my main class (button):

           book = new Book();
    book.setTitle(title);
    book.setAuthor(author);
    lib.addBook(book);
    lib.fireTableDataChanged();
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
user2994263
  • 161
  • 1
  • 6
  • 14
  • Sorry. I edited the code and posted the errors – user2994263 Nov 16 '13 at 00:05
  • You forgot to add the lines of the errors. – m0skit0 Nov 16 '13 at 00:07
  • You're still not posting the complete error message. It's telling you more. Note that the `addRow(...)` method exists for DefaultTableModel, but not with a Library parameter. You need to either use a proper parameter (check out the API for the class) or create your own model class from the AbstractTableModel class as the tutorial shows you. – Hovercraft Full Of Eels Nov 16 '13 at 00:09
  • @user2994263 YOu dont have methods defined like `size()` and `get()` in `Library` class. As they are not available, so you can not compile your program. Refer to answer by `@ Hovercraft Full Of Eels` – Smit Nov 16 '13 at 00:27
  • I did that. I have edited my code. Could you please tell what I need to add in my main class in order to add the values of the textfields into my jtable. – user2994263 Nov 17 '13 at 00:18

3 Answers3

3

If you want to use your Library class as the nucleus of a TableModel, you can, but you'll need to:

  • have the Library class extend AbstractTableModel
  • Library will need more methods such as getRowCount(), getColumnCount(), getColumnClass(...), getValueAt(...), setValueAt(...) and in fact all the abstract methods of the AbstractTableModel class.
  • The addBook(Book book) method would need to call one of the fireXXX(...) methods of AbstractTableModel to notify listeners of the addition.
  • Consider giving it a removeBook(Book book) method that likewise fires a notification method after removal.

The JTable tutorial can help you further with this as can the many examples posted on this site which can be found with a little searching.


Edit
Regarding your latest code, you're still not calling any fireXXX methods when the model's data changes, which suggests that you haven't studied the tutorial as I've suggested. Please do this first as it can explain things far better than we can.

Here is the link: Tutorial: How to use Tables
And here are some useful stackoverflow answers:

You can easily search StackOverflow for more examples. Luck.

Community
  • 1
  • 1
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • I did that. I have edited my code. Could you please tell what I need to add in my main class in order to add the values of the textfields into my jtable. – user2994263 Nov 17 '13 at 00:19
  • See my edit please. Also, do I have to add this code to my getvalueat method? fireTableDataChanged(rowIndex, columnIndex); – user2994263 Nov 17 '13 at 15:21
1

Try this code

  JTable  booktable = new JTable();


            String[] colName = { "Call No", "Name", "Category", "Author ",
                    "Publisher", "From", "Price", "Remarks" ,"Edit/Delete"};
            booktable.getTableHeader().setBackground(Color.WHITE);
            booktable.getTableHeader().setForeground(Color.BLUE);
            Font Tablefont = new Font("Book Details", Font.BOLD, 12);
            booktable.getTableHeader().setFont(Tablefont);

            List<Book> books = new ArrayList<Book>();
            books = ServiceFactory.getBookService().findAllBook();

            Object[][] object = new Object[100][100];
            int i = 0;
            if (books.size() != 0) {
                for (Book book : books) {
                    object[i][0] = book.getCallNo();
                    object[i][1] = book.getName();
                    object[i][2] = book.getCategory_id().getName();
                    object[i][3] = book.getAuthor();
                    object[i][4] = book.getPublisher();
                    object[i][5] = book.getFrom();
                    object[i][6] = book.getPrice();
                    object[i][7] = book.getRemark();
                    object[i][8] = getEditDeleteButton();
                    i++;
                    booktable = new JTable(object, colName);
                }
            }
boycod3
  • 5,033
  • 11
  • 58
  • 87
1

To populate JTable from your ArrayList of Books, you need to create DefaultTableModel with Object[] that contains column names as a parameter, and also number of rows (start with 0) as a parameter. Loop through your ArrayList, get Title and Author fields, place them in Object[], add row to table model using that Object[] as a parameter and then set table model using DefaultTableModel that you created at the beginning of this method as parameter. Method for adding data from ArrayList to JTable:

public void showDataInTable(ArrayList<Book> listOfBooks, JTable table){
     DefaultTableModel model = new DefaultTableModel(new Object[]{"Title", "Author"}, 0);
     for(Book book:listOfBooks){
          model.addRow(new Object[]{book.getTitle(), book.getAuthor()});
     }
     table.setModel(model);
}

Now if you want to delete a selected Book from JTable and also from ArrayList you could use Iterator. Instantiate iterator, loop through it using hasNext() method as condition in while loop. Instantiate new Book object using iterators next() method. In if statement check if title and author from that Book matches with Title and Author from selected row in your JTable. If you have a match iterator will remove that Book from ArrayList loop will stop because of break command. Then call first method I wrote and it will show all Books from ArrayList without that book that you deleted.

    public void deleteRecord(JTable table, ArrayList<Book> listOfBooks){
         Iterator<Book> it = listOfBooks.iterator();
         while(it.hasNext()){
              Book book = it.next();
              if(book.getTitle.equals(String.valueOf(table.getValueAt(table.getSelectedRow(), 0))) && book.getAuthor.equals(String.valueOf(table.getValueAt(table.getSelectedRow(), 1)))){
              it.remove();
              break;
              }
         }
         showDataInTable(listOfBooks, table);
    }
Zoka
  • 393
  • 3
  • 14