2016-08-21 4 views
0

私はパネルにJTableとテーブルモデルを持っています。テーブル内のチェックボックスには、編集可能な別の行を制御する必要があり、他の行は、食品オブジェクトのデータです。しかし、私がチェックボックスをクリックすると、私はjava.lang.IndexOutOfBoundsException例外をthis.bools.set(row, (Boolean)vlaue) ;行に得る。インデックス値をJTableに設定するときにバインドされた例外がありません

なぜこのエラーが発生しますか?

import com.sun.org.apache.xpath.internal.operations.Bool; 
import Food; 
import FoodDAO; 

import javax.swing.*; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellRenderer; 
import java.awt.*; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.Vector; 

/** 
* Created by debian on 8/20/16. 
*/ 
public class FoodListPanel extends JPanel{ 
JTable jTable; 
FoodTableModel fm; 

public FoodListPanel() { 

    try { 
     fm = new FoodTableModel(FoodDAO.getAllFoodsFromDB(), new ArrayList<Boolean>(), 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, Boolean.class, Integer.class}; 
    ArrayList<Food> al; 
    ArrayList<Boolean> bools; 
    ArrayList<Integer> vals; 
    public FoodTableModel(ArrayList<Food> foods, ArrayList<Boolean> boxes,ArrayList<Integer> val) { 
     al = new ArrayList<Food>(); 
     bools = new ArrayList<>(al.size()); 
     for(Boolean b: bools){ 
      b=Boolean.FALSE; 
     } 
     vals = new ArrayList<Integer>(al.size()); 
     al.addAll(foods); 
     bools.addAll(boxes); 

    } 


    ////// 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(); 
      //// TODO: 8/20/16 CASE 4 + PICTURE 

      default: 
       return null; 
     } 
    } 


    public void setValueAt(Object vlaue, int row, int column){ 
     if(column==5){ 
      this.bools.set(row, (Boolean)vlaue) ; 
     }else if (column==6){ 
      this.vals.set(row, (Integer)vlaue); 
     } 
    } 

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

より良いヘルプをすぐに入手するには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

答えて

1

あなたbools ArrayList<Boolean>は完全に空で、上記のコードでは空が、何もすることはできません(ここで、あなたは空のArrayList以外でそれを埋めるのですか?)、あなたは経由でアクセスしようとするたびに、bools.set(row, (Boolean)vlaue)あなたはこの例外を得るつもりです。解決方法:ArrayListでsetメソッドを呼び出す前に、使用前に入力して、入力が完了したことをテストします。サイズが0の場合、または存在しない項目を設定しようとしている場合は、ArrayListのadd(...)メソッドを使用します。 bools.sizeは()

1

理由は、あなたがに値を設定しようとしているということである(それはある)0であれば

for(Boolean b: bools){ 
     b=Boolean.FALSE; 
    } 

何もしません:

あなたは、これはもちろん知っていますArrayListの位置は、リストのサイズよりも大きくなります。最初にArrayListはサイズ0で作成されます。ArrayListについてのドキュメントとチュートリアルを読んでください。

コードには他の問題もあります。ブール値に値を代入しようとすると、次のようになります。

al = new ArrayList<Food>(); 
    bools = new ArrayList<>(al.size()); 
    for(Boolean b: bools){ 
     b=Boolean.FALSE; 
    } 

これは基本的に何もしません。まず、リストは空の状態で作成されます。次に、割り当てはbに新しい値を割り当てますが、boolの要素の内容は変更されません。

関連する問題