如果记录已存在,则更新jTable行

时间:2016-02-04 19:05:53

标签: java swing jtable

我正在处理发票并已将jTable添加到我的框架中以获取多个项目,例如我有4个字段用于用户“项目,数量,费率,价格”并且用户填写所有内容并单击添加按钮然后添加这些字段带有项目ID的jTable。

现在当用户输入相同的项目时我面临的问题,而该项目已经添加到列表中并且它复制了jTable中的行。

如果项目相同,我想更新该行,通过添加新的数量值和价格值来更新其数量字段。

即。

 id  |Item  |qty|   rate|   Price|
 --------------------------------------
 12  |saee  |3  |    300|    900 |

现在,如果用户输入5个数量的相同项目,则应该使用加号和价格更新相同的项目或行。

--------------------------------------
id  |Item   |qty|   rate|   Price|
--------------------------------------
12  |saee   |8  |    300|   24000|

但不是这样,它在jTable中添加了第二行。

这是我的代码,用于将项目添加到jTable

 DefaultTableModel model = (DefaultTableModel) tbl_sale.getModel();
 model.addRow(new Object[]{lbl_id.getText(), txt_item.getText(), txt_qty.getText(), txt_rate.getText(), txt_rs.getText()});

谁能告诉我该怎么办?

1 个答案:

答案 0 :(得分:2)

有时我认为我们忘记了我们在OO环境中运行以及类似的能力带来的力量

我的意思是,您可以轻松地将数据封装到对象中,例如......

public class Order {

    private int id;
    private String item;
    private int quanity;
    private double unitPrice;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public int getQuanity() {
        return quanity;
    }

    public void setQuanity(int quanity) {
        this.quanity = quanity;
    }

    public double getUnitPrice() {
        return unitPrice;
    }

    public void setUnitPrice(double unitPrice) {
        this.unitPrice = unitPrice;
    }

    public double getTotalPrice() {
        return getUnitPrice() * getQuanity();
    }
}

这也有能力动态计算总价格,而不是需要我们这样做。

DefaultTableModel适用于表示脱节的信息,但不是很好地表示每行的对象,为此,我使用AbstractTableModel并根据对象的需要对其进行自定义,类似......

public class OrderTabelModel extends AbstractTableModel {

    protected static final String COLUMN_NAMES[] = {"ID", "Item", "Qty", "Rate", "Price"};
    protected static final Class COLUMN_TYPES[] = {int.class, String.class, int.class, double.class, double.class};

    private List<Order> orders;

    public OrderTabelModel() {
        orders = new ArrayList<>(25);
    }

    public void add(Order order) {
        orders.add(order);
        fireTableRowsInserted(orders.size() - 1, orders.size() - 1);
    }

    public void remove(Order order) {
        int row = orders.indexOf(order);
        if (row >= 0) {
            orders.remove(order);
            fireTableRowsDeleted(row, row);
        }
    }

    public void update(Order order) {
        int row = orders.indexOf(order);
        if (row >= 0) {
            fireTableRowsUpdated(row, row);
        }
    }

    public Order getOrderAt(int row) {
        return orders.get(row);
    }

    @Override
    public int getRowCount() {
        return orders.size();
    }

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

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return COLUMN_TYPES[columnIndex];
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Object value = null;
        Order order = getOrderAt(rowIndex);
        switch (columnIndex) {
            case 0:
                value = order.getId();
                break;
            case 1:
                value = order.getItem();
                break;
            case 2:
                value = order.getQuanity();
                break;
            case 3:
                value = order.getUnitPrice();
                break;
            case 4:
                value = order.getTotalPrice();
                break;
        }
        return value;
    }

}

现在,当您想要添加/删除/更新给定对象时,您只需调用add的{​​{1}} / remove / update方法。

当然,当您想要更新OrderTabelModel时,您需要与模型中的某个实例进行互动,否则事情不会像您期望的那样进行......

Order