【问题标题】:How to remove row from table after deleting the the product?删除产品后如何从表中删除行?
【发布时间】:2021-01-26 00:59:17
【问题描述】:

您好,当我使用 popupMenu(右键单击按钮)通过表从数据库中删除产品时,该行仍然显示在表列表中,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);
    }
}

JFrame:

    public void popupTable() {
    JPopupMenu popupMenu = new JPopupMenu();
    JMenuItem menuItem1 = new JMenuItem("Delete", new ImageIcon(getClass().getResource("")));
    menuItem1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
 
                int row = jTable1.getSelectedRow();
                String cell = jTable1.getModel().getValueAt(row, 0).toString();
                Products p = new Products();
                p.setId(cell);
                try {
                    int count = ProductsDao.getInstance().delete(p);
                    if (count == 1) {
                        removeRowFromTable(p);
                        JOptionPane.showMessageDialog(null, "Deleted");

                    } else {
                        JOptionPane.showMessageDialog(null, "Faild");
                    }
                } catch (Exception ex) {
                    Logger.getLogger(AddNewPatient.class.getName()).log(Level.SEVERE, null, ex);
                }
    });

    popupMenu.add(menuItem1);
    jTable1.setComponentPopupMenu(popupMenu);
}

public static void removeRowFromTable(Products data) {
    ProductTable t = (ProductTable) jTable1.getModel();
    t.deleteProduct(data);
}

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;
    }

【问题讨论】:

  • (1-) 从下面的答案:... Products 对象(应该重命名为 Product -- 单数) - 你是鉴于您在上一个问题中的建议:stackoverflow.com/a/65765970/131872。我们不应该花时间重复建议。
  • 你好 camickr 我已经把它改成了单数 谢谢你上次的帮助

标签: java swing jtable


【解决方案1】:

恐怕这些方法没有意义:

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

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

因为您从未真正使用 Products 参数 p 以任何有用的方式来识别它在表模型中的位置。另外,我不确定您为什么有两种方法,以及它们各自应该代表什么。

相反,假设您的 TableModel 中的 productsArrayList&lt;Products&gt;,并假设您已适当地覆盖 Products equals 和 hashCode 方法,您需要在列表中找到所选项目的索引,然后将其删除从列表中并通知听众这已经执行。比如:

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

这只有在您为 Products 正确覆盖 equals 和 hashCode 时才有效。

【讨论】:

  • 您好,我已经更新了 ProductTable.java,您可以看看吗
  • @Meriam:我的建议没有改变。您还没有解释我提到的这两种方法,为什么要按照您的方式编写它们,为什么忽略 Products 参数。
  • 我虽然这样可以解决这个问题我是java编程的初学者哈哈我已经将方法更改为 public void deleteProduct(Products p) { int row = products.indexOf(p);products .删除(行); ireTableRowsDeleted(行,行); } 它也不好用
  • 含义当您检查 ArrayList 中的 Products 对象(应重命名为 Product -- 单数)时,列表在其中找不到项目,这表明您没有正确覆盖 equals 和 hashCode班上。你从来没有向我们展示过这个,所以只能猜测。但这是我在回答中提到过两次但您从未提及您的问题或 cmets 的内容。
  • @Meriam:您在同一主题上提出了许多问题,其中许多是关于基本 Java 概念的。在尝试使用更高级的 Java 领域(例如 GUI 编程)之前,您可能最好先学习这些基本概念。这可以为您(和我们)节省很多挫折和浪费的时间
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 2019-10-23
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
相关资源
最近更新 更多