2016-08-21 5 views
0

У меня есть JTable, который имеет редактируемый столб. Он должен получать значения Integer и таблицу обновлений. Но когда я редактирую ячейку и перехожу в другую ячейку, данные стираются и возвращаются к нулевому значению, но программа не бросает никаких исключений. Как я могу это исправить?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.

Вам нужно исправить getValueAt(...) метод для возврата фактических данных, а не null.

Кроме того, метод setValueAt(...) должен вызывать только метод fireTableCellUpdated(...), а не метод fireTableDataChanged (...).

+1

Один плюс, но fyi, он задает новый вопрос, не отвечая на предыдущий вопрос (http://stackoverflow.com/q/39066012/522444). Нехорошо. –

+0

@HovercraftFullOfEels, спасибо за головы. Я вижу, что OP в последний раз видели через час после того, как был отправлен ответ. Думаю, они тоже не намерены отвечать на этот вопрос. – camickr

Смежные вопросы