且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何填充从一个ArrayList一个JTable?

更新时间:2022-10-17 18:38:30

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


  • 有图书馆类扩展AbstractTableModel上

  • 图书馆将需要更多的方法,如 getRowCount() getColumnCount()的getColumnClass(...) getValueAt(...) setValueAt(...)而事实上AbstractTableModel的类的所有抽象方法。

  • addBook(书书)方法需要调用的 fireXXX(...)方法之一AbstractTableModel上的通知另外的听众。

  • 考虑给它切除后也触发一个通知方法 removeBook(书书)方法。

JTable的教程可以使用此进一步帮助你的许多例子都可以在网站上公布,可以用一些搜索找到。


修改结果
关于你的最新的code,你仍然不能调用任何fireXXX方法时,模型的数据发生变化,这表明你没有学教程,因为我已经建议。请为此,首先,因为它可以解释的事情比就可以了。

下面是链接:教程:如何使用表结果
这里是一些有用的计算器答案:

您可以轻松地搜索计算器更多的例子。运气。

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

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 *** answers:

You can easily search *** for more examples. Luck.