Программа предназначена для ввода пользователя и сохранения его в arraylist. Затем пользователь может распечатать детали на jtable. После этого он может удалить элемент из jtable, выбрав строку.Как заполнить jTable из ArrayList?
У меня есть 2 проблемы.
Первая проблема заключается в том, что я получаю ошибки при прохождении через arraylist.
Вторая проблема заключается в том, что пользователь удаляет строку, элемент удаляется из таблицы, но я также хочу удалить этот конкретный элемент из массива. Чтобы пользователь снова нажимал кнопку печати, элемент снова не отображается.
Проблема здесь, Перебор ArrayList:
model = (DefaultTableModel) table.getModel();
for (int i=0; i<lib.data.size(); i++){
book = lib.data.get(i);
}
model.addRow(book);
У меня есть 3-х классов, тестирования, библиотека и бронирование
испытаний Класс
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);
}
}
Книга Класс
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
Это то, что я добавил в мой класс библиотеки:
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();
Извините. Я отредактировал код и разместил ошибки – user2994263
Вы забыли добавить строки ошибок. – m0skit0
Вы по-прежнему не публикуете полное сообщение об ошибке. Это говорит вам больше. Обратите внимание, что метод 'addRow (...)' существует для DefaultTableModel, но не с параметром Library. Вам нужно либо использовать правильный параметр (проверить API для класса), либо создать собственный класс модели из класса AbstractTableModel, как показывает вам учебник. –