2016-10-28 5 views
0

Ich arbeite an dem TableModelListener für eine JTable. Jetzt kann die JTable den Wert gut erhalten. aber wenn es darum geht, den Wert der letzten Spalte der ausgewählten Zeile festzulegen. Es wird wackelig, nicht sicher, was der Fehler ist, es hängt nur auf. Keine Fehler auf Netbeans zu sehen, also nicht sicher, was ich denken soll. Aus diesem Grund bin ich mir nicht einmal sicher, ob die if-Anweisungen in Bezug auf die Einstellwerte überhaupt funktionieren. Sollte ich etwas anderes tun oder tun, damit dies geschieht? Update: Es scheint eine Endlosschleife zu sein. den Code zu einem Vorschlag bearbeitet, um nach Update-Tabellenereignissen zu suchen, aber immer noch das gleiche Problem zu haben. Hier ist der Code unter:Java Jtable-Fehler beim Festlegen eines Werts für eine Spalte, nachdem der Listener ausgeführt wurde

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); 
    } 
} 

}

Antwort

2

Die folgende Zeile wird den ausgewählten Zeilenindex erhält, dass Index einen Ansicht Index ist, da Sie diese fragen aus dem JTable Beispiel:

int rowcount = jDetailSubmitTable.getSelectedRow(); 

Später verwenden Sie diesen Ansichtsindex, um das Modell zu indizieren:

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

Sie sollten zuerst diese Ansicht Index auf einen Modellindex konvertieren JTable.convertRowIndexToModel mit:

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

ich eine längere Erklärung über Ansicht vs Modell gab und die Notwendigkeit, Indizes in this answer auf SO zu konvertieren.


Update: @camickr die richtige Beobachtung gemacht, dass Sie sollten die Daten verwenden, die mit dem TableModelEvent kommt, das heißt TableModelEvent.getFirstRow(), TableModelEvent.getLastRow() und TableModel.getColumn(). Diese Methoden geben Modellindizes zurück.

+1

Sie sollten die Methode getSelectedRow() nicht verwenden. Der Code wird in einem TableModelListener ausgeführt. Sie sollten die Werte aus dem TableModelEvent verwenden, wie in Ihrer ursprünglichen Antwort gezeigt wurde, die Ihr Looping-Problem gelöst hat. – camickr

+0

@camickr Autsch, in der Tat. Ich warf einen Blick darauf ... –

Verwandte Themen