2016-08-21 7 views
0

열을 편집 할 수있는 JTable이 있습니다. 정수 값과 업데이트 테이블을 가져와야합니다. 그러나 셀을 편집하고 다른 셀로 이동하면 데이터가 지워지고 null로 돌아가지만 예외가 발생하지는 않습니다. 어떻게 해결할 수 있습니까?편집 할 때 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() 방법은 동기화되지 null로 돌아갑니다 것입니다. 에서

setValueAt() 당신은 단지 getValueAt() 만 열 0-5에 대한 데이터를 반환하고 당신은 getValueAt(...)을 수정해야 열 6.

에 null을 반환에서 열 6

에 대한 데이터를 저장 null이 아닌 실제 데이터를 리턴하는 메소드.

또한 setValueAt(...) 메서드는 fireTableDataChanged (...) 메서드가 아닌 fireTableCellUpdated(...) 메서드 만 호출해야합니다.

+1

한 가지 더하기,하지만 fyi, 그는 [이전의 최근 질문] (http://stackoverflow.com/q/39066012/522444)에 응답하지 않고 새로운 질문을하고 있습니다. 안좋다. –

+0

@HovercraftFullOfEels, 머리를 가져 주셔서 감사합니다. 답변은 게시 된 후 1 시간 후 OP가 마지막으로 본 것으로 나타났습니다. 나는 그들도이 질문에 응답 할 의도가 없다고 생각한다. – camickr