我正在处理发票并已将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()});
谁能告诉我该怎么办?
答案 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