如何从ArrayList填充jTable?

时间:2013-11-15 23:59:42

标签: java swing arraylist jtable

该程序用于获取用户输入并将其存储在arraylist中。然后用户可以将详细信息打印到jtable上。之后,他可以通过选择一行从jtable中删除一个项目。

我有两个问题。

第一个问题是我在循环播放时遇到错误。

第二个问题是当用户删除一行时,该项目将从表中删除,但我也想从数组中删除该特定项目。因此,如果用户再次单击打印按钮,则该项目不会再次出现。

问题在这里,通过arraylist循环:

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

    }

    model.addRow(book);

我有3个课程,Test,Library和Book

测试类

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


    }

图书馆类

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

书类

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

  }

  }

修改

这是我添加到我的库类中的内容:

      public void addBook(Book book){

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

}

public void fireTableDataChanged() {

}

这是我添加到主要课程(按钮)的内容:

           book = new Book();
    book.setTitle(title);
    book.setAuthor(author);
    lib.addBook(book);
    lib.fireTableDataChanged();

3 个答案:

答案 0 :(得分:3)

如果你想使用你的Library类作为TableModel的核心,你可以,但你需要:

  • 让Library类扩展AbstractTableModel
  • 图书馆需要更多方法,例如getRowCount()getColumnCount()getColumnClass(...)getValueAt(...)setValueAt(...)以及AbstractTableModel类的所有抽象方法
  • addBook(Book book)方法需要调用AbstractTableModel的fireXXX(...)方法之一来通知侦听器添加。
  • 考虑给它一个removeBook(Book book)方法,同样在删除后触发通知方法。

JTable教程可以帮助您进一步解决这个问题,本站点上发布的许多示例都可以通过一些搜索找到。


修改
关于您的最新代码,当模型的数据发生变化时,您仍然没有调用任何fireXXX方法,这表明您没有像我建议的那样研究该教程。请先这样做,因为它可以比我们更好地解释的事情。

以下是链接:Tutorial: How to use Tables
这里有一些有用的stackoverflow答案:

您可以轻松搜索StackOverflow以获取更多示例。运气。

答案 1 :(得分:1)

试试此代码

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

答案 2 :(得分:1)

要从BooksList中填充JTable,您需要使用包含列名作为参数的Object []创建DefaultTableModel,并将行数(以0开头)作为参数创建。循环遍历ArrayList,获取Title和Author字段,将它们放在Object []中,使用Object []作为参数向表模型添加行,然后使用在此方法开头创建的DefaultTableModel作为参数设置表模型。将ArrayList中的数据添加到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);
}

现在,如果要从JTable中删除选定的Book,也可以从ArrayList中删除,可以使用Iterator。实例化迭代器,使用hasNext()方法作为while循环中的条件循环它。使用迭代器next()方法实例化新的Book对象。在if语句中检查该书中的标题和作者是否与JTable中选定行的标题和作者匹配。如果你有匹配迭代器将从ArrayList循环删除该Book将因break命令而停止。然后调用我编写的第一个方法,它将显示没有你删除的那本书的ArrayList中的所有书籍。

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