DefaultTableModel数据从先前编辑的单元格移动

时间:2014-04-28 20:51:53

标签: java swing jtable defaulttablemodel

每次我在任何单元格中编辑数据并确认时,出于某种奇怪的原因 一旦我转到下一个,它将复制先前编辑过的单元格中的数据

任何想法?

public class CheckoutTableModel extends DefaultTableModel {

    private String[] columnNames= {"Brand","Model","Price","Quantity","Total Price"};
    private List<Integer> id;
    private List<CheckoutItem> basketItems;
    private static final long serialVersionUID = 7944308974044321712L;


    public CheckoutTableModel()
    {
        id=new ArrayList<>();
        basketItems=new ArrayList<>();
    }

    public CheckoutTableModel(List<Item>db, ArrayList<Integer>quantity)
    {
        id=new ArrayList<>();
        basketItems=new ArrayList<>();
        for (int i = 0 ; i < db.size() ; i++)
        {
            basketItems.add(new CheckoutItem(db.get(i).getBrand(), db.get(i).getModel(), db.get(i).getPrice(), quantity.get(i)));
        }
    }

    public void setValueAt(Object value, int row, int column)
    {
        switch(column)
        {
        case 1: 
            basketItems.get(row).setBrand((String)value);
        case 2:
            basketItems.get(row).setModel((String)value);
        case 3:
            basketItems.get(row).setPrice((double)value);
        case 4:
            basketItems.get(row).setQuantity(Integer.parseInt((String) value));
        case 5:
            basketItems.get(row).setTotalPrice(Double.parseDouble((String) value));
        }
    }

    public int getRowCount() {
        if(basketItems==null)
        {
            return 0;
        }
        else
        return basketItems.size();
    }

    public int getColumnCount() {
        return 5;
    }

    public String getColumnName(int column) {
        return columnNames[column];
    }

    public Object getValueAt(int row, int column) {  //set values of cells
        switch(column)
        {
        case 0: 
            return basketItems.get(row).getBrand();
        case 1:
            return basketItems.get(row).getModel();
        case 2:
            return basketItems.get(row).getPrice();
        case 3:
            return basketItems.get(row).getQuantity();
        case 4:
            return basketItems.get(row).getTotalPrice();
        }
        return null;
    }

    public void setTableModel(List<Item>db, List<Integer>quantities){
        id=new ArrayList<>();
        basketItems=new ArrayList<>();
        for (int i = 0 ; i < db.size() ; i++)
        {
            basketItems.add(new CheckoutItem(db.get(i).getBrand(), db.get(i).getModel(), db.get(i).getPrice(), quantities.get(i)));
        }
    }

    public boolean isCellEditable(int row,int column)  
        {
            switch(column){             

           case 0:  // select the cell you want make it not editable 
             return false; 
           case 1:  // select the cell you want make it not editable 
               return false;
           case 2:
               return true;
           case 3:
               return true;
           case 4:
               return false;
         default: return false;}  
     }

     @SuppressWarnings("unchecked")
     public Class getColumnClass(int column) {
            return getValueAt(0, column).getClass();
     }
}

2 个答案:

答案 0 :(得分:1)

当然,这里有一个愚蠢的错误:

public void setValueAt(Object value, int row, int column)
{
    switch(column)
    {
    case 1: 
        basketItems.get(row).setBrand((String)value);
    case 2:
        basketItems.get(row).setModel((String)value);
    case 3:
        basketItems.get(row).setPrice((double)value);
    case 4:
        basketItems.get(row).setQuantity(Integer.parseInt((String) value));
    case 5:
        basketItems.get(row).setTotalPrice(Double.parseDouble((String) value));
    }
}

当然应该是case 0case 4

即使我只是通过查看你的代码就发现了这个错误,但是忽略像这些在代码变大后很难找到的小错误并不罕见。您必须采用更有条理的方法来查找这些,使用调试器或简单地将一些输出指示调用和参数到您正在查看的函数。这样,例如,您很快就会看到编辑第二列会调用setBrand而不是setModel按预期调用,您可能会立即发现错误。

答案 1 :(得分:1)

因此,setValueAt方法至少存在两个问题...

  1. 列(和行)0已编入索引
  2. switch语句将允许执行案例以及下面的所有子案例......
  3. 所以,这意味着......

    public void setValueAt(Object value, int row, int column)
    {
        switch(column)
        {
        case 1: 
            basketItems.get(row).setBrand((String)value);
        case 2:
            basketItems.get(row).setModel((String)value);
        case 3:
            basketItems.get(row).setPrice((double)value);
        case 4:
            basketItems.get(row).setQuantity(Integer.parseInt((String) value));
        case 5:
            basketItems.get(row).setTotalPrice(Double.parseDouble((String) value));
        }
    }
    

    如果column == 1,将执行案例1,2,3,4和5。如果column == 3,则会执行案例3,4和5。

    首先,您需要修改switch,以便case匹配与getValueAt方法相同的顺序,并在每个break后添加case语句case以防止执行以下public void setValueAt(Object value, int row, int column) { switch(column) { case 0: basketItems.get(row).setBrand((String)value); break; case 1: basketItems.get(row).setModel((String)value); break; case 2: basketItems.get(row).setPrice((double)value); break; case 3: basketItems.get(row).setQuantity(Integer.parseInt((String) value)); break; case 4: basketItems.get(row).setTotalPrice(Double.parseDouble((String) value)); break; } } ,例如......

    {{1}}