gpt4 book ai didi

java - 如何从 ArrayList 填充 jTable?

转载 作者:行者123 更新时间:2023-11-29 07:52:37 24 4
gpt4 key购买 nike

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

我有两个问题。

第一个问题是我在遍历数组列表时遇到错误。

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

问题在这里,遍历数组列表:

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

}

model.addRow(book);

我有 3 个类(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();
}


}

图书馆类

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

最佳答案

如果你想使用你的库类作为 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 上搜索更多示例。运气。

关于java - 如何从 ArrayList 填充 jTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20012772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com