将单元格值添加到JTable时的ArrayIndexOutOfBoundException

时间:2015-07-26 13:13:51

标签: java swing jtable indexoutofboundsexception

enter image description here

如上图所示;

当用户选择项目和项目名称并单击添加按钮时,会出现以下情况:

  1. 从MySQL数据库中检索所选项目,项目名称和成本。
  2. 显示输入对话框以从用户处获取数量。
  3. 单击确定以输入数字输入对话框后,显示输入对话框以获得折扣。
  4. 单击“确定”以折扣“输入对话框”后,将计算总计并显示在总列中。
  5. 但随后将ArrayIndexOutOfBound错误显示为:

    java.lang.ArrayIndexOutOfBoundException: 1>=1
    

    然后选择另一个项目和项目名称并执行上述过程显示相同的错误:

    java.lang.ArrayIndexOutOfBoundException: 2>=2 
    

    同时将Qty,Discount,Total列重置为最后一行的值。

    添加按钮操作执行方法;

    private void add_btnActionPerformed(java.awt.event.ActionEvent evt) {                                        
            int i=0;
            int j=0;
            String temp = (String) IDcombo.getSelectedItem();
            String temp2 = (String) Namecombo.getSelectedItem();
    
            String sql = "select ItemID,ItemName,CostPrice from druginfo where ItemID=?";
        try {   
            pst=conn.prepareStatement(sql);
            pst.setString(1, temp);
    
            rs=pst.executeQuery();
    
            addDataToTable(tableSale,DbUtils.resultSetToTableModel(rs));//this method for adding multiple lines in the table
    
    
            IDcombo.setSelectedItem(null);
            Namecombo.setSelectedItem(null);
            exptxt.setText(null);
            instock.setText(null);
    
          //getting user input for selling qty 
            String Qty=JOptionPane.showInputDialog("Insert Selling Quantity :");
            double sellingqty=Double.parseDouble(Qty);
    
          //getting user input for specific item discount
            String discount = JOptionPane.showInputDialog("Insert Item Discount");
            double idiscount=Double.parseDouble(discount);
    
           for(j=0;j<100;j++){
               double icost =(double) tableSale.getModel().getValueAt(j,2); 
            System.out.println(icost);
    
          //calculating Gross Total  
            double grosstotal = (sellingqty*icost)-idiscount;
    
            System.out.println(grosstotal);
    
            for(i=0;i<100;i++){
             //setting qty input value to table sale  
            tableSale.getModel().setValueAt(sellingqty,i, 3);
            //setting input value to table sale  
            tableSale.getModel().setValueAt(idiscount,i, 4); 
            //setting grosstotal value to table sale
            tableSale.getModel().setValueAt(grosstotal,i, 5); 
            }
    
           }
    
    
        } catch (Exception ex) {
           JOptionPane.showMessageDialog(null, "error "+ex);
            ex.printStackTrace();
        }
    }  
    

    这是堆栈跟踪;

    java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
    at java.util.Vector.elementAt(Vector.java:474)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664)
    at com.bit.project.Newsale.add_btnActionPerformed(Newsale.java:720)
    
    java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
    at java.util.Vector.elementAt(Vector.java:474)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664)
    at com.bit.project.Newsale.add_btnActionPerformed(Newsale.java:720)
    

1 个答案:

答案 0 :(得分:3)

删除for循环并使用此代码

int i = jTable1.getRowCount()-1;
double icost = (double) tableSale.getModel().getValueAt(i, 2);
System.out.println(icost);

//calculating Gross Total  
double grosstotal = (sellingqty * icost) - idiscount;

System.out.println(grosstotal);

//setting qty input value to table sale  
tableSale.getModel().setValueAt(sellingqty, i, 3);
//setting input value to table sale  
tableSale.getModel().setValueAt(idiscount, i, 4);
//setting grosstotal value to table sale
tableSale.getModel().setValueAt(grosstotal, i, 5);

java.lang.ArrayIndexOutOfBoundsException: 1 >= 1表示只有一行,但是您正在访问第一行的第一行。但是没有第二行。您添加的新行是真的,但是当您调用getValueAt()时细胞应该存在

在我的代码中

int i = jTable1.getRowCount()-1; 

int我将得到最后一行索引,例如,如果只有1行,那么我是0。所以从当前行获取值使用getValueAt(i, 2); .same到setValueAt();