Falsche Zeile wird in JTable gelöscht

didi577

Bekanntes Mitglied
Hi,

ich arbeite gerade an meiner ersten Methode mit Parameterübergabe. Es funktioniert soweit, jedoch wird in der Datenbankn nicht die selektierte Zeile in der GUI sondern die Zeile danach gelöscht (z.B. ich lösche Zeile 400 -> gelöscht wird aber Zeile 401)
Die Löschmethode in der Klasse MySQL:
Java:
public void loeschen(Object selected) {
        try {
            PreparedStatement pst = con.prepareStatement("DELETE FROM fragen WHERE fragen_id = ?");
               pst.setObject(1, selected);
               pst.executeUpdate();
           
        } catch (SQLException e) {
            System.out.println(e);
        }
   }
Der ActionListener in der Klasse LoeGUI:
Java:
btnLoeschen.addActionListener(new LoeschenBtnAction() {
           @Override
           public void actionPerformed(ActionEvent e) {
               
               int answer = JOptionPane.showConfirmDialog(LoeGUI.this, "Wollen Sie den Datensatz wirklich löschen?", "Bestätigen", JOptionPane.YES_NO_OPTION);
               if (answer == JOptionPane.YES_OPTION) {
               
               DefaultTableModel tblm = (DefaultTableModel)tblLoeschen.getModel();
               int row = tblLoeschen.getSelectedRow();
               Object selected = tblm.getValueAt(row, 0);
               int modelRow = tblLoeschen.convertRowIndexToModel(row);
               tblm.removeRow(modelRow);
    mysql.loeschen(tblm.getValueAt(row,0));
               lblLoeschen.setVisible(true);
               tblm = new DefaultTableModel(mysql.holeFragen(), new String [] {"fragen_id", "kurs", "ort", "dozent", "datum"});
               tblLoeschen.setRowSelectionInterval(0, 0);
es geht speziell um diesen Aufruf:
Java:
    mysql.loeschen(tblm.getValueAt(row,0));
 
Da werden vermutlich die Indizes unterschiedlich beginnen, warum ist aber nur Raterei, dazu müsste man den wesentlichen Code sehen, zB das füllen des Models.
 
das Interessante ist, dass ich vor dem Umbau die LöschMethode noch im ActionListener hatte und dort die richtige Zeile gelöscht wurde:
Java:
public void actionPerformed(ActionEvent e) {
               
               int answer = JOptionPane.showConfirmDialog(LoeGUI.this, "Wollen Sie den Datensatz wirklich löschen?", "Bestätigen", JOptionPane.YES_NO_OPTION);
               if (answer == JOptionPane.YES_OPTION) {
               
               DefaultTableModel tblm = (DefaultTableModel)tblLoeschen.getModel();
               int row = tblLoeschen.getSelectedRow();
               Object selected = tblm.getValueAt(row, 0);
               int modelRow = tblLoeschen.convertRowIndexToModel(row);
               tblm.removeRow(modelRow);
               Connection con = mysql.getCon();
                               
                   try {
                                       
                   PreparedStatement pst = con.prepareStatement("DELETE FROM fragen WHERE fragen_id = ?");
                   pst.setObject(1, selected);
                   pst.executeUpdate();
                           
                       } catch (SQLException ex) {
                       System.out.println(e);

               }
               lblLoeschen.setVisible(true);
               tblm = new DefaultTableModel(mysql.holeFragen(), new String [] {"fragen_id", "kurs", "ort", "dozent", "datum"});
               tblLoeschen.setRowSelectionInterval(0, 0); 
               }
           
           }
der Code zum Löschen ist doch identisch??!!
 
Ah, nein ist nicht der gleiche Code:

Code:
Object selected = tblm.getValueAt(row, 0); //Du fragst das ausgewählte Objekt an Position row ab
int modelRow = tblLoeschen.convertRowIndexToModel(row);
tblm.removeRow(modelRow); //Du löscht dien Zeile an Position row aus dem Model, alle dahinter rutschen einen nach vorne
mysql.loeschen(tblm.getValueAt(row,0)); //Du löscht den Wert aus der Datenbank, er jetzt im Model an Position row steht, also der, der hochgerutscht ist
 
hätte ich nicht gefunden, Danke 🙂
um es zu verstehen, ich habe es jetzt so umgebaut und es funktioniert, er löscht die markierte Zeile
Java:
public void actionPerformed(ActionEvent e) {
               
               int answer = JOptionPane.showConfirmDialog(LoeGUI.this, "Wollen Sie den Datensatz wirklich löschen?", "Bestätigen", JOptionPane.YES_NO_OPTION);
               if (answer == JOptionPane.YES_OPTION) {
               
               DefaultTableModel tblm = (DefaultTableModel)tblLoeschen.getModel();
               int row = tblLoeschen.getSelectedRow();
               Object selected = tblm.getValueAt(row, 0);
               mysql.loeschen(tblm.getValueAt(row,0));
               int modelRow = tblLoeschen.convertRowIndexToModel(row);
               tblm.removeRow(modelRow);
    lblLoeschen.setVisible(true);
               tblm = new DefaultTableModel(mysql.holeFragen(), new String [] {"fragen_id", "kurs", "ort", "dozent", "datum"});
               tblLoeschen.setRowSelectionInterval(0, 0); //markiert die erste Zeile nach dem Löschen automatisch
               }
war es der richtige Weg die LöschMethode vor "int modelRow" aufzurufen?
 

Zurück
Oben