问题描述
您好,当我使用 popupMenu(右键单击按钮)通过表从数据库中删除产品时,该行仍显示在表列表中,insertProduct 方法工作正常并将行插入到表中,但 removeProduct 方法没有t work 你能告诉我我的代码哪里有问题吗?
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;
}
解决方法
恐怕这些方法没有意义:
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>
,并且假设您已经适当地覆盖了 Products equals 和 hashCode 方法,您需要在列表中找到所选项目的索引然后将其从列表中删除并通知侦听器已执行此操作。类似的东西:
public void deleteProduct(Products p) {
int row = products.indexOf(p);
products.remove(row);
fireTableRowsDeleted(row,row);
}
这仅在您为产品正确覆盖 equals 和 hashCode 时才有效。