2016-08-21 24 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()あなただけあなたがgetValueAt(...)を修正する必要が列0-5のためにデータを返すと、カラム6

のためにnullを返すには、カラム6

のデータを保存するには

nullではなく実際のデータを返すメソッド。

また、setValueAt(...)メソッドはfireTableDataChanged(...)メソッドではなくfireTableCellUpdated(...)メソッドを呼び出す必要があります。

+1

彼は、最近の質問に答えることなく新しい質問をしています(http://stackoverflow.com/q/39066012/522444)。良くない。 –

+0

@HovercraftFullOfEels、ヘッドアップのおかげで。私は、回答が投稿されてから1時間後にOPが最後に見られたのを見る。私は彼らにもこの質問に答えるつもりはないと思います。 – camickr

関連する問題