在 JTable 上显示输入

Displaying input on JTable

我想在每次按下按钮时在 JTable 上显示数据。在此之前,该按钮将创建数据并将其存储到列表中,并且应该在 table 上显示数据。但是,只有创建和数据存储在工作,数据不显示。我应该怎么做才能在 table.

上显示数据

这是我制作的抽象模型来填充我的table。

import javax.swing.JList;
import javax.swing.table.AbstractTableModel;
import com.main.Products;
import java.util.List;

public class CartTableModel extends AbstractTableModel{
    List<Products> productList;
    
    private final String[] columnNames = new String[] {
            "Product:", "ID:", "Variant:", "Size:","Unit Price:","Quantity:","Unit Total:"
    };
    private Class[] columnClass = new Class[] {
        String.class, Integer.class, String.class, String.class, Double.class, Integer.class, Double.class
    };
    
    public CartTableModel(List<ProductInfo> productList)
    {
        this.productList = productList;
    }
   public String getColumnName(int column)
    {
        return columnNames[column];
    }
 
    @Override
    public Class<?> getColumnClass(int columnIndex)
    {
        return columnClass[columnIndex];
    }
 
    @Override
    public int getColumnCount()
    {
        return columnNames.length;
    }
 
    @Override
    public int getRowCount()
    {
        return productList.size();
    }
 
    @Override
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        Products row = productList.get(rowIndex);
        if(0 == columnIndex) {
            return row.getProductName();
        }
        else if(1 == columnIndex) {
            return row.getProductID();
        }
        else if(2 == columnIndex) {
            return row.getVariant();
        }
        else if(3 == columnIndex) {
            return row.getSize();
        }
        else if(4 == columnIndex){
            return row.getUnitPrice();
        }
        else if(5 == columnIndex){
            return row.getQuantity();
        }
        else if(6 == columnIndex){
            return row.getTotal();
        }
        return null;
    }
    
     @Override
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return true;
    }
 
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex)
    {
        Products row = productList.get(rowIndex);
        if(0 == columnIndex) {
            row.setProductName((String) aValue);
        }
        else if(1 == columnIndex) {
            row.setProductID((int) aValue);
        }
        else if(2 == columnIndex) {
            row.setVariant((String) aValue);
        }
        else if(3 == columnIndex) {
            row.setSize((String) aValue);
        }
        else if(4 == columnIndex){
            row.setUnitPrice((double) aValue);
        }
        else if(5 == columnIndex){
            row.setQuantity((int) aValue);
        }
    }
    
}

JTable 是这样创建的:

CartTableModel model = new CartTableModel(productList);
JTable cartTable = new JTable(model);

此外,数据是这样创建的:

public void actionPerformed(ActionEvent e) {
        if(e.getSource() == coconutPieBtn){
            cart.addProduct(new Product("Coconut Creamy Pie", 101,"Pastry","Med",79.99));
            
        }
    }
fireTableCellUpdated(productList.size(), columnNames.length)

您指定的 row/column 值错误,原因有二:

  1. 无论更新哪个单元格,您始终使用相同的值
  2. java 索引基于 0,因此您指的是不存在的 row/column。

只需使用:

fireTableCellUpdated(rowIndex, columnIndex)

还有:

cart.addProduct(new Product("Coconut Creamy Pie", 101,"Pastry","Med",79.99));

错了。创建模型后,您需要将新产品添加到 CartTableModel,而不是列表。

因此您需要在 CartTableModel 中创建一个方法来动态添加产品。

基本代码为:

public void addProduct(Product product)
{
    insertProduct(getRowCount(), product);
}
 
public void insertProduct(int row, Product product)
{
    products.add(row, product);
    fireTableRowsInserted(row, row);
}

查看 Row Table Model 以获取使用动态更新模型的方法创建您自己的自定义 TableModel 的完整示例。