2017-03-31 56 views
0

我从用户输入创建一个JTable。在GUI中有一组单选按钮,当选择一个时,它需要更新表格中列的所有值。ArrayIndexOutOfBounds当在JTable中设置单元格的值时

我得到一个arrayIndexOutofBounds错误与此。不完全确定我做错了什么。任何输入将不胜感激,因为这是我第一次使用jtable,它比我想象的要难。

代码在那里我得到一个错误:

class RadioListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    {         
     if(oneRadio.isSelected()) 
     { 
      payAMT = payAMT * .01; 
      for(int i = 1; i < outputTable.getRowCount(); i++) 
      { 
       outputTable.setValueAt(payAMT,i,4); 
      } 

     } 

代码:

//JTableCreation 

model = new DefaultTableModel(new String[] {"Emp Num", "Base Pay", "Hours Worked", "Pay Amt"}, 0); 
    outputTable = new JTable(); 
    outputTable.setModel(model); 
    JScrollPane scroll = new JScrollPane(outputTable); 

更多的代码 //将项添加到JTable中

class clickListener implements ActionListener 
{ 
    @SuppressWarnings("unchecked") 
    public void actionPerformed(ActionEvent e) 
    { 
     int empNum = 0; 
     double hourlyRate = 0; 
     double hoursWorked = 0; 

     try 
     { 
      empNum = Integer.parseInt(empNumField.getText()); 
     } 
     catch(NumberFormatException event) 
     { 
      JOptionPane.showMessageDialog(null, "Invalid entry.\n\nPlease enter a number for the Employee ID.", "Error", JOptionPane.WARNING_MESSAGE); 
      return; 
     } 
     try 
     { 
      hourlyRate = Double.parseDouble(basePayField.getText()); 
     } 
     catch(NumberFormatException event) 
     { 
      JOptionPane.showMessageDialog(null, "Invalid entry.\n\nPlease enter a number for the Hourly Pay Rate.", "Error", JOptionPane.WARNING_MESSAGE); 
      return; 
     } 
     try 
     { 
      hoursWorked = Double.parseDouble(hrsField.getText()); 
     } 
     catch(NumberFormatException event) 
     { 
      JOptionPane.showMessageDialog(null, "Invalid entry.\n\nPlease enter a number for the Hours Worked.", "Error", JOptionPane.WARNING_MESSAGE); 
      return; 
     } 

     payAMT = calculatePay(hourlyRate, hoursWorked); 

     Object[] newRecord = {empNum,hourlyRate,hoursWorked,payAMT}; 
     model.addRow(newRecord); 

     totalPayAMT += payAMT; 
     totalPayLabel.setText("Total Employee Pay: "+totalPayAMT); 
    } 
} 
+0

也许您想开始循环在索引0而不是1? – csmckelvey

+0

我在发帖之前试过两种方法。同样的错误。 – Justiciar

+0

所以,当这段代码产生这个错误时,给我们一个特定的场景。列表为空时会发生吗?当它有一个元素时会发生吗?有很多元素时会发生吗?当您在调试器中浏览代码时,您发现了哪些相关信息?既然你不显示堆栈跟踪,你怎么确定你指出的代码行是问题? – csmckelvey

回答

1

您需要启动迭代JTable为0. JTable的列是基于0的。当你开始你的循环为1时,你并不是真的从第一排开始,就像你想的那样,你实际上是从第2行开始。在那里你也陷入困境的是JTable.getRowCount( )方法。此方法将返回当前包含在您的JTable中的实际行数,因此您需要调整其值(减1)以便用于迭代,例如:

int cnt = outputTable.getRowCount(); 
if(oneRadio.isSelected() && cnt > 0) { 
    payAMT = payAMT * .01; 
    for(int i = 0; i < cnt - 1; i++) { 
     outputTable.setValueAt(payAMT, i, 4); 
    } 
} 
相关问题