2016-08-21 122 views
0

我有JTable有一列可編輯。它應該獲得整數值和更新表。但是當我編輯一個單元格並轉到另一個單元格時,數據將被擦除並返回到空值,但程序不會拋出任何異常。我該如何解決它?Jtable在編輯時不會保存單元格的數據

public class FoodListPanel extends JPanel{ 
JTable jTable; 
FoodTableModel fm; 

public FoodListPanel() { 

    try { 
     fm = new FoodTableModel(FoodDAO.getAllFoodsFromDB(), new ArrayList<Integer>()); 

     jTable = new JTable(fm) { 

      public boolean isCellEditable(int data, int columns) { 
       if(columns<5){ 
        return false; 
       } 
       else if(columns ==5){ 
        return true; 
       } 
       else if(columns ==6){ 

        if(getValueAt(data, 5)==Boolean.FALSE){ 
         return false; 
        } 
        else { 
         return true; 
        } 
       } 
       else{ 
        return true; 
       } 
      } 

      public Component prepareRenderer(TableCellRenderer r, int data, int columns) { 
       Component c = super.prepareRenderer(r, data, columns); 
       return c; 
      } 


     }; 


     jTable.setPreferredScrollableViewportSize(new Dimension(650, 420)); 
     jTable.setFillsViewportHeight(true); 

     JScrollPane jScrollPane = new JScrollPane(jTable); 

     add(jScrollPane); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

class FoodTableModel extends AbstractTableModel { 
    protected String[] cols = {"نام‌غذا", "دسته‌بندی", "قیمت", "توضیحات", "عکس" , "تعداد"}; 
    protected Class[] colClasses = {String.class, Integer.class, String.class, String.class, 
    JLabel.class, Integer.class}; 
    ArrayList<Food> al; 
    ArrayList<Integer> vals; 
    public FoodTableModel(ArrayList<Food> foods, ArrayList<Integer> val) { 
     al = new ArrayList<Food>(); 
     al.addAll(foods); 


     vals = new ArrayList<Integer>(al.size()); 

     vals.addAll(val); 

    } 


    ////// TODO: 8/20/16 make dynamic from DB 
    public int getColumnCount(){return cols.length;} 
    public int getRowCount(){return al.size();} 
    public String getColumnName(int col) { return cols[col]; } 
    public Class getColumnClass(int col) { return colClasses[col]; } 

    public Object getValueAt(int row, int col){ 
     switch (col) { 

      case 0: 
       return al.get(row).getName(); 
      case 1: 
       return al.get(row).getType(); 
      case 2: 
       return al.get(row).getPrice(); 
      case 3: 
       return al.get(row).getDiscreption(); 
      case 5: 
       if(vals.size()>= al.size()) return vals.get(row); 

      default: 
       return null; 
     } 
    } 

    ////https://stackoverflow.com/questions/39066012/index-out-of-bound-exception-when-setting-value-to-jtable 
    public void setValueAt(Object vlaue, int row, int column){ 
     if (column==6){ 
      this.vals.set(row, (Integer)vlaue); 
     } 
     this.fireTableCellUpdated(row, column); 
     this.fireTableDataChanged(); 

    } 

    /*public void setCols(String[] columns){ 
     cols = columns; 
    } 
    public void setClasses(Class[] classes){ 
     colClasses = classes; 
    }*/ 
} 
} 
+1

請不要在沒有回覆[上一個最近的問題](http://stackoverflow.com/q/39066012/522444)中的答案時提出新問題。不好。 –

回答

2

數據將刪除,並回到空

getValuaAt(..)setValueAt()方法是不同步的。

setValueAt()僅保存列6

數據在getValueAt()你只返回數據的0-5列和第6列

返回null你需要修復getValueAt(...)方法返回實際數據,不爲null。

此外,setValueAt(...)方法應該只調用fireTableCellUpdated(...)方法,而不是fireTableDataChanged(...)方法。

+1

One plus,但是fyi,他在不迴應[上一個最近的問題]時提出了一個新問題(http://stackoverflow.com/q/39066012/522444)。不好。 –

+0

@HovercraftFullOfEels,謝謝你的擡頭。我看到OP在發佈答案後的一個小時內最後被看到。我想他們也無意迴應這個問題。 – camickr

相關問題