2016-10-28 5 views
0

JTableのTableModelListenerを使用しています。今、jtableは値をうまく取得できます。選択された行の最後の列の値を設定することになります。それはちょうど間違っているかどうか分かりません。ネットビーンのエラーは見られないので、何を考えたらいいのか分かりません。このため、if文が値を設定するという点ではまったく機能しているかどうかはわかりません。これを行うために何か他のものを使用したり、すべきことはありますか? 更新:無限ループのようです。コードを編集してUpdateテーブルのイベントをチェックするが、同じ問題が残っているかどうかを確認する。リスナーの実行後に値を列に設定するJava Jtableエラー

public class MyListener implements TableModelListener { 

    @Override 
    public void tableChanged(TableModelEvent tme) { 

    if (tme.getType() == TableModelEvent.UPDATE) 
     { 
      int rowcount = jDetailSubmitTable.getSelectedRow(); 

      // Initial return when table is starting to be filled. 
     if(rowcount == -1) 
     { 
      return; 
     } 

     int com = tme.getColumn(); 

     // Number being Validated. 
     if(jDetailSubmitTable.getModel().getValueAt(rowcount, com).toString().trim().isEmpty()) 
     { 
      JOptionPane.showMessageDialog(null, "Invaid Number selected."); 
      jDetailSubmitTable.getModel().setValueAt("0", rowcount, com); 
      return; 
     } 
     try 
     { 
      Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, com).toString().trim()); 
     } 
     catch(NumberFormatException e) 
     { 
      JOptionPane.showMessageDialog(null, "Invaid Number selected."); 
      jDetailSubmitTable.getModel().setValueAt("0", rowcount, com); 
      return; 
     } 


     // Adjusted amount is calculated below. 

     double nur = Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, 9).toString().trim()); 
     double our = Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, 8).toString().trim()); 
     double diff = nur - our; 
     double nunits = Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, 11).toString().trim()); 
     double ans = diff * nunits; 

     jDetailSubmitTable.getModel().setValueAt(ans, rowcount, 12); 
    } 
} 

}

答えて

2

あなたはJTableインスタンスからこれを聞いているので、次の行は、そのインデックスがビューインデックスされ、選択された行のインデックスを取得します:

int rowcount = jDetailSubmitTable.getSelectedRow(); 
ここ は、以下のコードであります

このビューインデックスを使用してモデルのインデックスを作成します。

jDetailSubmitTable.getModel().getValueAt(rowcount, com) 

あなたが最初JTable.convertRowIndexToModelを使用してモデルインデックスに、このビューのインデックスを変換する必要があります。

int selrowid = jDetailSubmitTable.getSelectedRow(); 
selrowid = jDetailSubmitTable.convertRowIndexToModel(selrowid); 
[...]jDetailSubmitTable.getModel().getValueAt(selrowid, com)[...] 

私がモデルとSO上this answerにインデックスを変換する必要VSビューについての長い説明を行いました。


更新: @camickrあなたがTableModelEvent、すなわちTableModelEvent.getFirstRow()TableModelEvent.getLastRow()TableModel.getColumn()に付属しているデータを使用する必要があり、正しい観察を行いました。これらのメソッドはモデルインデックスを返します。

+1

getSelectedRow()メソッドを使用しないでください。コードはTableModelListenerで実行されています。あなたは、あなたのループ問題を解決した元の答えで示されているように、TableModelEventの値を使用する必要があります。 – camickr

+0

@camickr確かに、おっと。私はそれを見渡した... –

関連する問題