如何在jTable的顶部显示最后添加的行

问题描述

您好,我有一个问题,我想知道是否有办法在运行时在 jTable 顶部显示最后添加的行 我更新了填充我的表的选择语句“SELECT * FROM table ORDER BY ID DESC”,但是最近添加的行显示在表格底部,直到我关闭程序并再次打开它然后它显示在顶部

TableItemsModel:

public class TableItemsModel extends AbstractTableModel{
    
    ItemsDao itemDao = new ItemsDao();
    private List<Items> items;

    public TableItemsModel() throws Exception {
        this.items = (ArrayList<Items>)itemDao.getItemsList();
    }   
    
    private DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
    
    @Override
    public int getRowCount() {
        return items.size();
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public Object getValueAt(int rowIndex,int columnIndex) {
        Items item = items.get(rowIndex);
        switch(columnIndex){

            case 0: return p.getProductName();
            case 1: return p.getProductCategory();
            case 2: return p.getProductPrice();
            default: return "";
                
        }
    }
    
    public String getColumnName(int column){
        switch(column){

            case 0: return "PRODUCT NAME";
            case 1: return "PRODUCT CATEGORY";
            case 2: return "PRICE";
            default: return "";
        }
    }
    
    public void addRow(Items item){
        items.add(item);
        fireTableRowsInserted(items.size()-1,items.size()-1);
    }
    
    public void deleteRow(Items item){
        items.remove(item);
        fireTableRowsInserted(items.size()-1,items.size()-1);
    }  
}

jFrame:

private final TableItemsModel model;

    public Products() throws Exception {

        this.model = new TableItemsModel();

 private void btnAddItemActionPerformed(java.awt.event.ActionEvent evt) {
    
        String productName = txtProductName.getText();
        String productCategory = txtProductCategory.getText();
        int productPrice = Integer.valueOf(txtPrice.getText());
        
        try {
            int count = ItemsDao.getInstance().insert(itemDao);
            if (count == 1) {
                model.addRow(Items);
    
                JOptionPane.showMessageDialog(null,"item successfully added");
            } else {
                JOptionPane.showMessageDialog(null,"Cannot Add Item");
            }
        } catch (Exception ex) {
            Logger.getLogger(AddNewPatient.class.getName()).log(Level.SEVERE,null,ex);
        }
   } 
}

解决方法

首先,为什么要调用自定义对象 Items。那是复数。对象应该被赋予名称的单数形式。因此,更好的名称应该是 Item 甚至 Product,因为您在所有方法名称中都使用了“product”。保持一致。

你能告诉我如何在我的代码中包含方法 insertRow

您正在使用 List 来保存数据。阅读 List API,您会看到有两个 add(...) 方法。一种方法在 List 的末尾添加元素,另一种方法在 List 的指定索引处插入元素。

因此要在 List 的开头添加一个 Item,您需要指定 0 作为索引。

为此,您复制 addRow(...) 方法的逻辑,但需要两个参数:

public void insertRow(int index,Item item)

然后你把方法中的逻辑改成:

  1. 在列表的指定索引处插入项目。
  2. 在指定的索引处调用 fireTableRowsInserted(..) 方法。

通过传入索引,您可以使该方法非常灵活。您可以在开头或中间插入一个 Item(如果需要)。