Java 如何从 ArrayList 填充 jTable?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20012772/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to populate a jTable from an ArrayList?
提问by user2994263
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.
该程序旨在接受用户输入并将其存储在一个数组列表中。然后用户可以将详细信息打印到 jtable 上。之后,他可以通过选择一行从 jtable 中删除一个项目。
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
我有 3 个课程,测试、图书馆和书籍
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();
回答by Hovercraft Full Of Eels
If you want to use your Library class as the nucleus of a TableModel, you can, but you'll need to:
如果你想使用你的 Library 类作为 TableModel 的核心,你可以,但你需要:
- 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 thefireXXX(...)
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.
- 让 Library 类扩展 AbstractTableModel
- 库将需要更多的方法,例如
getRowCount()
、getColumnCount()
、getColumnClass(...)
、getValueAt(...)
,setValueAt(...)
实际上是 AbstractTableModel 类的所有抽象方法。 - 该
addBook(Book book)
方法需要调用fireXXX(...)
AbstractTableModel的方法之一来通知侦听器添加。 - 考虑给它一个
removeBook(Book book)
方法,在删除后同样触发通知方法。
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.
JTable 教程可以帮助您进一步解决这个问题,本网站上发布的许多示例也可以通过一些搜索找到。
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 farbetter than we can.
编辑
关于您的最新代码,当模型的数据更改时,您仍然没有调用任何 fireXXX 方法,这表明您没有按照我的建议学习教程。请首先做到这一点,因为它可以解释的事情远远比我们能做到。
Here is the link: Tutorial: How to use Tables
And here are some useful stackoverflow answers:
这是链接:教程:如何使用表格
这里有一些有用的 stackoverflow 答案:
- dont updating jtable
- Check Boxes not able to be Selected — They are Editable! Java Swing(MadProgrammer has some excellent code you would do well to study here).
- 不更新 jtable
- 无法选择复选框 - 它们是可编辑的!Java Swing(MadProgrammer 有一些优秀的代码,您可以在这里学习)。
You can easily search StackOverflow for more examples. Luck.
您可以轻松搜索 StackOverflow 以获取更多示例。运气。
回答by boycod3
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);
}
}
回答by Zoka
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:
要从书籍的 ArrayList 填充 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);
}
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.
现在,如果您想从 JTable 和 ArrayList 中删除选定的 Book,您可以使用 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);
}