2015-09-29 5 views
0

Я получил следующее сообщение об ошибке.java.lang.ArrayIndexOutOfBoundsException: 21> = 21

java.lang.ArrayIndexOutOfBoundsException: 21 >= 21 
     at java.util.Vector.elementAt(Vector.java:427) 
     at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277) 
     at com.vanuston.medeil.uitables.PurchaseTable.createTable(PurchaseTable.java:182) 
     at com.vanuston.medeil.ui.Purchase.applyDefaults$(Purchase.fx:130) 

на третьей строке нижеследующего кода.

jTable.removeColumn(jTable.getColumnModel().getColumn(19)); 
jTable.removeColumn(jTable.getColumnModel().getColumn(20)); 
jTable.removeColumn(jTable.getColumnModel().getColumn(21)); 
jTable.removeColumn(jTable.getColumnModel().getColumn(22)); 

Я уже добавил 21-е и 22-й столбец в DefaultTableModel.

Vector cols = new Vector(); 
    Vector data = new Vector(); 
    int len = colName.length; 
    System.out.println("col length " + len); 
    for (int i = 0; i < initRow; i++) { 
     Vector c = new Vector(); 
     for (int j = 0; j < len; j++) { 
      if (j == 19 && j == 20) { 
       c.addElement(Boolean.FALSE); 
      } else { 
       c.addElement(null); 
      } 
     } 
     data.addElement(c); 
    } 
    for (int n = 0; n < len; n++) { 
     cols.addElement(colName[n]); 
     System.out.println(colName[n]); 
    } 
    try { 
     jTable.setModel(new javax.swing.table.DefaultTableModel(data, cols) { 

      Class[] type = types; 
      boolean[] canEditCol = canEditCols; 

      @Override 
      public Class getColumnClass(int columnIndex) { 
       return type[columnIndex]; 
      } 

      @Override 
      public boolean isCellEditable(int rowIndex, int columnIndex) { 
       return canEditCol[columnIndex]; 
      } 

     }); 

Но я не знаю, в чем причина для показа ArrayIndexOutOfBounds исключения.

+0

вы можете распечатать т он размер этой модели перед запуском этой линии? – Stultuske

+2

Вы удаляете столбец на каждой строке, поэтому я предполагаю, что они переиндексируются. – Tunaki

+0

'int len ​​= colName.length; sysout (len);' output 23 –

ответ

5

Ну, вы вызываете JTable.removeColumn, каждый столбец из массива столбцов получает переиндексацию. Например, когда элемент 0 удаляется элемент, который был с индексом 1 теперь переиндексирован с индексом 0.

Вы должны удалить эти столбцы в обратном порядке, так что это переиндексации не бывает:

jTable.removeColumn(jTable.getColumnModel().getColumn(22)); 
jTable.removeColumn(jTable.getColumnModel().getColumn(21)); 
jTable.removeColumn(jTable.getColumnModel().getColumn(20)); 
jTable.removeColumn(jTable.getColumnModel().getColumn(19)); 

вы также можете позвонить в 4 раза следующую строку:

jTable.removeColumn(jTable.getColumnModel().getColumn(19)); 

поскольку при каждом вызове i, колонка 19 + i будет колонка 19.

+0

плюс один, но XxxTableModel возвращает всегда все ..., столбец удаляется только из представления JTables, причина (вы должны заметить OP) конвертировать индекс из представления в модель :-), есть два метода row (сортировка, фильтрация) и столбца (столбцы переупорядочиваются или удаляются из вида) – mKorbel