2016-05-27 2 views
0

2列の列が編集されたときに列データの1つを変更しようとすると、stackoverflowエラーが発生します。JTable setvalueat stackoverflow

私はitems, quantity, priceの3つの列を持っています。

商品と数量が入力されている場合に価格を計算したいと考えています。以下は私のコードです: -

itemsTable.getModel().addTableModelListener(new TableModelListener() { 
      @Override 
      public void tableChanged(TableModelEvent e) { 
       for (int i = 0; i < itemsTable.getRowCount(); i++) { 
        if (itemsTable.getValueAt(i, 0) != null) { 
         String item = itemsTable.getValueAt(i, 0).toString(); 
         double price = Double.parseDouble(selectedItem.substring(item.indexOf("RM") + 2, item.length())); //get price from the cell 
         double qty = Double.parseDouble(itemsTable.getValueAt(i, 1).toString()); //get quantity from cell 
         itemsTable.setValueAt(price * qty, i, 2); //calculate price * qty and set price 
        } 
       } 
      } 
     }); 

私は私が間違って何をやっているquantity

ためitems列とするJSpinnerにデータベースのデータをロードコンボボックスを設定しますか?私はJTableが初めてです。

EDIT enter image description here

回答:(テトスへのクレジット)も

  @Override 
      public void tableChanged(TableModelEvent e) { 
       if (e.getType() == TableModelEvent.UPDATE && e.getColumn() != 2) { 
        for (int i = 0; i < itemsTable.getRowCount(); i++) { 
         if (itemsTable.getValueAt(i, 0) != null) { 
          ... 
         } 
        } 
       } 
      } 
+2

1)あなたのメソッドは、テーブルのデータが変更されたときに呼び出されます。 2)次に、メソッド内でテーブルのデータを変更します。これは1)につながる。コールスタックにスペースがなくなるまで、メソッドは再帰的に呼び出されます。 – f1sh

+0

だから、どうすれば欲望の結果を達成できますか?どのようにしてそれを行う適切な方法は何ですか? –

+1

「価格」の値を設定することによってトリガされる変更イベントを無視するために、 'if(e.getColumn()!= 2){...} 'のようなチェックを追加できます。 "Price"カラムの値が 'if(itemsTable.getValueAt(i、0)== null)'に設定されているかどうかを確認することもできます。 – Titus

答えて

-1

は、電子スルー行e.getFirstRow()から行くにループを制限するために損はありません。 getLastRow()を呼び出して、invokeLaterプロセスの価格を更新することもできます。しかし、タイタス​​はそれに頭を打つ:変更を行うハンドラを呼び出す変更を行う変更呼び出し呼び出しハンドラの無限のカスケードを停止する必要があります...