2017-08-27 7 views
-1

私は複数のJSpinnerに1から10のアイテムと1つのJTableを持っています。 JSpinnerをクリックすると、値はJTableに追加されます。私はsetValueAtでそれを使用できるように行番号を取得したいです。しかし、JSpinnerが2回以上クリックされるとエラーになります。java.lang.ArrayIndexOutOfBoundsException

コード

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が表示されます。

+1

したがって、このような何かを試してみてください。あなたが3つの行を持っている場合、それらは0として索引付けされます。 1; 2.索引3はありません... –

+0

@ UsagiMiyamoto 2は列だと思いましたか? – Tony

+0

stacktraceは、 'setValueAt()'メソッドが呼び出され、 'Vector.elementAt()'を呼び出すことを示します。これは例外をスローします。カラム値が定数3の 'setValueAt()'メソッドが呼び出されました... –

答えて

1

あなたの設定が間違っていると思います。

インデックスを「推測する」量を使用します。数量が1になると、テーブルに新しい行を追加します(1でなければ、テーブルの行を変更しようとします)。

  • 複数のスピナーがある場合は、それぞれをクリックして、最後にいずれか1つをクリックして修正する必要がありますか?
  • あなたが二回スピナーをクリックし、その後、減少して-ボタンをクリックすると、新しい行が追加されるだろう、再び1になると...

があり、上記の問題に対処するためにいくつかのオプション。
最も平凡な1はDefaultTableModelに基づいていないTableModelあなた自身を実装するだろう...
別のアプローチは、検索、およびそれを見えなくするために使用されるように、既存のDefaultTableModelに列を追加することができます。この列はEG JSpinnerインスタンスです。それが最後の行のインデックスよりも大きい場合、 `JTable` /` TableModel`のように、 `getRowCounは()`行数を返し、ゼロベースのインデックスを持つ

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; 
     } 
    } 
} 
+0

何がログアウトしますか? –

+0

それは_行を表示する_ – Tony

+0

ありがとう、それは動作します! – Tony

関連する問題