java.lang.ArrayIndexOutOfBoundsException:21>;=21

java.lang.ArrayIndexOutOfBoundsException:21>;=21,java,swing,jtable,defaulttablemodel,Java,Swing,Jtable,Defaulttablemodel,我收到下面的错误消息 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.ui

我收到下面的错误消息

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));
我已经在
DefaultTableModel
中添加了第21列和第22列

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];
            }

        });
Vector cols=new Vector();
向量数据=新向量();
int len=colName.length;
系统输出打印项次(“列长度”+len);
for(int i=0;i
但是我不知道,显示
ArrayIndexOutOfBounds
异常的原因是什么。

您调用了,列数组中的每一列都被重新索引。例如,当删除元素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时,索引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。

在运行该行之前,您可以打印该模型的大小吗?您正在删除每行上的列,因此我猜它们正在重新索引。
int len=colName.length;sysout(len)
output 23按相反顺序删除它们。@Tunaki那么我如何删除这4列?通过循环?在运行该行之前,您可以打印该模型的大小吗?您正在删除每行上的列,因此我猜它们正在重新编制索引。
int len=colName.length;sysout(len);
output 23以相反的顺序删除它们。@Tunaki那么我如何删除这4个列?通过循环?加上一个,但是XxxTableModel总是返回所有…,列只从JTables视图中删除,原因是(您必须注意操作)将索引从视图转换为模型:-),有两种方法行(排序、筛选)和列(列是重新排序的或仅从视图中删除)加上一,但XxxTableModel始终返回全部…,列仅从JTables视图中删除,原因(您必须注意操作)将索引从视图转换为模型:-),有两种方法行(排序、筛选)和列(列是重新排序的或仅从视图中删除)