【问题标题】:java.lang.ArrayIndexOutOfBoundsExceptionjava.lang.ArrayIndexOutOfBoundsException
【发布时间】:2017-08-27 15:31:04
【问题描述】:

我有多个 JSpinner,其中包含项目 1-10 和一个 JTable。单击JSpinner 时,该值将添加到JTable。我想获取行号,以便可以在setValueAt 使用它。但是当JSpinner 多次点击时,我得到了错误。

代码

public void stateChanged(ChangeEvent e) {  // when JSpinner clicked
        int quantity = (int) ((JSpinner) e.getSource()).getValue();
        int rows = table.getRowCount();

        for (int i = 0; i < ELEMENTS; i++) {
            if (numspinner[i] == e.getSource()) {
                if (quantity == 1) {
                    System.out.println("Row"+rows);
                    dtm.addRow(new Object[] { foodLabel[i].getText(), quantity, price[i] * quantity });
                } else {
                    System.out.println("Row"+rows);
                    dtm.setValueAt(quantity, rows, 3); 
                }
            }
        }
    }

我不止一次点击了同一个 JSpinner 并得到了这个输出

Row1
Row2

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
        at java.util.Vector.elementAt(Unknown Source)
        at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source)
        at gui.FoodOrdering.stateChanged(FoodOrdering.java:250)
        at javax.swing.JSpinner.fireStateChanged(Unknown Source)
        at javax.swing.JSpinner$ModelListener.stateChanged(Unknown Source)
        at javax.swing.AbstractSpinnerModel.fireStateChanged(Unknown Source)
        at javax.swing.SpinnerNumberModel.setValue(Unknown Source)
        at javax.swing.JSpinner.setValue(Unknown Source)
        at javax.swing.plaf.basic.BasicSpinnerUI$ArrowButtonHandler.actionPerformed(Unknown Source)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

任何帮助将不胜感激。

我已经移动了一些代码,这里是最新的

  public void stateChanged(ChangeEvent e) {
            int quantity = (int) ((JSpinner) e.getSource()).getValue();
            int rows = 0;

            for (int i = 0; i < ELEMENTS; i++) {
                if (numspinner[i] == e.getSource()) {
                    if (quantity == 1) {
                        System.out.println("Row"+rows);
                        rows = table.getRowCount();
                        dtm.addRow(new Object[] { foodLabel[i].getText(), quantity, price[i] * quantity });
                    } else {
                        System.out.println(" The Row"+rows);
                        dtm.setValueAt(quantity, rows, 1); // obj,column,row
                    }
                }
            }   
    }

如果数量为 1,则按预期添加行。再次点击同一个JSpinner,总是显示0!!!

【问题讨论】:

  • 对于从零开始的索引,如JTable/TableModelgetRowCoun() 返回的行数大于最后一行的索引。 EG 如果你有 3 行,它们的索引为 0; 1个; 2.没有索引3...
  • @UsagiMiyamoto 我以为 2 是列?
  • stacktrace 显示,setValueAt() 方法被调用,它正在调用Vector.elementAt(),这会引发异常。 setValueAt() 方法被调用,列值为常量 3...
  • @UsagiMiyamoto 我该如何解决?我点击了同一个 JSpinner 两次,我退出第 1 行、第 2 行,然后崩溃了
  • 似乎在您第一次点击时,它会添加新行,但在您第二次点击时,它会尝试修改行索引 2 处的单元格..

标签: java arrays jtable setvalue


【解决方案1】:

我认为你的设置不正确。

您使用数量来“猜测”索引。如果数量变为1,则向表中添加新行,如果不是1,则尝试修改表中的行。这有几个缺点:

  • 如果有多个微调器,单击每个,最后再次单击其中任何一个,应该修改哪一行?
  • 如果你点击一个微调器两次,然后点击它的-按钮减小,它再次变为1,就会添加一个新行...

要解决上述问题,有几种选择。
最简单的方法是实现自己的TableModel,而不是基于DefaultTableModel...
另一种方法是在您现有的DefaultTableModel 中添加一列以用于搜索,并使其不可见。此列可以是 EG JSpinner 实例。

所以试试这样的:

public void stateChanged(ChangeEvent e) {
   final int quantity = (int) ((JSpinner) e.getSource()).getValue();
   final int rows = table.getRowCount();
   for (int row = 0; row < rows; ++row) {
      // look for the row that has the JSpinner in its last column
      if (dtm.getValueAt(row, 3) == e.getSource()) {
         // log out something
         System.out.println("Modifying row " + row);
         // modifying the value in the model
         dtm.setValueAt(quantity, row, 1); // obj, row, column
         return;
      }
   }
   // there was no row with this JSpinner, so we have to add it
   for (int i = 0; i < ELEMENTS; i++) {
      // looking for the "clicked" JSpinner
      if (numspinner[i] == e.getSource()) {
         // log out something
         System.out.println("Adding row " + rows);
         // adding a new row to the model
         dtm.addRow(new Object[] { foodLabel[i].getText(), quantity, price[i] * quantity, numspinner[i] });
         return;
      }
   }   
}

【讨论】:

  • 显示添加行
猜你喜欢
  • 2023-04-03
  • 2014-01-30
  • 2016-04-11
  • 2014-06-20
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多