Java 删除产品后如何从表中删除行?

Java 删除产品后如何从表中删除行?,java,jtable,Java,Jtable,您好,当我使用弹出菜单右键单击按钮通过表从数据库中删除产品时,行仍然显示在表列表中,insertProduct方法工作正常,并将行插入表中,但removeProduct方法不工作。您能告诉我代码中的问题出在哪里吗 ProductTable.java: public class ProductTable extends AbstractTableModel { ProductsDao pd = new ProductsDao(); private final List<Products&g

您好,当我使用弹出菜单右键单击按钮通过表从数据库中删除产品时,行仍然显示在表列表中,insertProduct方法工作正常,并将行插入表中,但removeProduct方法不工作。您能告诉我代码中的问题出在哪里吗

ProductTable.java:

public class ProductTable extends AbstractTableModel {

ProductsDao pd = new ProductsDao();
private final List<Products> products;

public ProductTable() throws Exception {
    this.patients = (ArrayList<Products>) pd.getProductsList();

}

private String[] columnNames = {"PRODUCT NAME", "PRODUCT CATEGORY", "PRODUCT PRICE"};

@Override
public int getColumnCount() {
    return columnNames.length;
}

@Override
public String getColumnName(int column) {
    return columnNames[column];
}

@Override
public int getRowCount() {
    return products.size();
}
    @Override
    public Object getValueAt(int row, int column) {
        Products p = products.get(row);
        switch (column)
        {
            case 0: return p.getProductName();
            case 1: return p.getProductCategory();
            case 2: return p.getProductPrice();
       
        }
    }

    @Override
    public void setValueAt(Object value, int row, int column) {
        Products p = products.get(row);

        switch (column) {

        case 0: p.setProductName((String)value); break;
        case 1: p.setProductCategory((Date)value); break;
        case 2: p.setProductPrice((int)value); break;

        }

        fireTableCellUpdated(row, column);
    }
    
    public Products getProduct(int row) {
        return products.get(row);
    }

    public void addProduct(Products p) {
        insertProduct(getRowCount(), p);
    }

    public void insertProduct(int row, Products p) {
        products.add(row, p);
        fireTableRowsInserted(row, row);
    }

    public void deleteProduct(Products p) {
        removeProduct(getRowCount(), p);
    }
    
    public void removeProduct(int row, Products p) {
        products.remove(row);
        fireTableRowsDeleted(row, row);
    }
}
ProductsDao.java:

@Override
    public List<Products> getProductsList() throws Exception {

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ArrayList<Products> products = new ArrayList<Products>();
        try {
            con = getConnection();
            String sql = "SELECT * FROM products ORDER BY PRODUCT_ID DESC";
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                Products product = new Products();
                product.setProductName(rs.getString("PRODUCT_NAME"));
                product.setProductCategory(rs.getString("PRODUCT_CATEGORY"));
                product.setProductPrice(rs.getInt("PRODUCT_PRICE"));
                products.add(product);
            }

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        } finally {
            rs.close();
            ps.close();
            closeConnection(con);
        }
        return products;
    }

恐怕这些方法毫无意义:

public void deleteProduct(Products p) {
    removeProduct(getRowCount(), p);
}

public void removeProduct(int row, Products p) {
    products.remove(row);
    fireTableRowsDeleted(row, row);
}
因为您从未真正以任何有用的方式使用Products参数p来标识它在表模型中的位置。另外,我也不太清楚为什么有两种方法,以及它们各自应该代表什么

相反,假设TableModel中的products是ArrayList,并且假设您已经适当地重写了products equals和hashCode方法,则需要在列表中找到所选项的索引,然后将其从列表中删除,并通知侦听器已执行此操作。比如:

public void deleteProduct(Products p) {
    int row = products.indexOf(p);
    products.remove(row);
    fireTableRowsDeleted(row, row);
}

这只有在正确覆盖产品的equals和hashCode时才有效。

您好,我已经更新了ProductTable.java。您能看一下吗please@Meriam:我的建议没有改变。你还没有解释我提到的那两个方法,为什么你用你现在的方式编写它们,为什么你忽略了Products参数。我认为这样可以解决这个问题,我是java编程的初学者lol,我已经将这个方法改为public void deleteProducts p{int row=products.indexOfp;products.removeow;ireTableRowsDeletedrow,row;}它也不起作用我得到了这个错误java.lang.ArrayIndexOutOfBoundsException:-1在java.util.ArrayList.elementDataArrayList.java:424在java.util.ArrayList.removeArrayList.java:501……。这意味着当您检查ArrayList中的Products对象时,该对象应该重命名为Product-singular,该列表在其中找不到该项您没有在类中正确重写equals和hashCode。您从未向我们展示过这一点,因此只能猜测。但这是我在回答中提到过两次的东西,但您从未涉及到您的问题或评论。1-从下面的回答中:…应该重命名为Product的Products对象-singular-您在y中得到了建议我们的最后一个问题:。我们不必花时间重复建议。你好,camickr,我已将其改为单数谢谢你上次的帮助
public void deleteProduct(Products p) {
    int row = products.indexOf(p);
    products.remove(row);
    fireTableRowsDeleted(row, row);
}