该程序用于获取用户输入并将其存储在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();
答案 0 :(得分:3)
如果你想使用你的Library类作为TableModel的核心,你可以,但你需要:
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);
}