# JTable --> Zeilen löschen --> Exception



## MariusMeier (21. Januar 2008)

Hallo zusammen

Folgendes Szenario liegt vor: Habe eine Rezeptdatenbank mit verschiedenen Einträgen. Drücke ich jetzt auf den Button "Neues Rezept" sollte in der JTable alle Zeilen bis auf eine gelöscht werden. Selektiere ich jedoch den 3. Wert in der Zeile und lasse die Selektion auf dieser Spalte und drücke dann den Knopf "Neues Rezept" spuckt mir der Eclipse Compiler eine Fehlermeldung aus:

ActionPerformed failure!
java.lang.ArrayIndexOutOfBoundsException: -1
Habe hier folgenden Java-Code:

```
public void tableChanged(TableModelEvent e) {
        String word = (String) tabelleRezept.getValueAt(tabelleRezept.getRowCount()-1,tabelleRezept.getColumnCount()-1);
         System.out.println(word);
        try {
 
            if(word.length() > 0) {
                model.addRow(new Object[] {"","",""});
            }
        }
 
        catch(Exception ex) {
            System.out.println("Method tableChanged failure!");
            System.out.println(word);
        }
    }
 
    public String TableData_to_String(JTable tb) {
        String tbData = "";
 
        //Row count
        for(int row=0;row<tb.getRowCount();row++) {
            //Column count
            for(int column=0;column<tb.getColumnCount();column++) {
                String getData = (String) tb.getValueAt(row, column);
                tbData = tbData + getData + "::";
            }
        }
        return tbData;
    }
 
class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
            try {
                if(e.getSource() == insertRezept) {
                    if(tabelleRezept.isEditing()) {
                        tabelleRezept.getCellEditor().stopCellEditing();
                    }
 
                    String tbData = TableData_to_String(tabelleRezept);
                    MySQL mysqlnow = MySQL.getInstance("jdbc:mysql://localhost/Rezepte","root","gMx@hotmAil");
                    String sql = "INSERT INTO reznicola (id,rezeptname,rezeptzutaten,rezeptanweisungen) VALUE('1','" + RezeptName.getText() + "','" + tbData + "','" + introductions.getText() + "')";
                    mysqlnow.insertData(sql);
 
                    //Update JList with new values
                    String sqlJList = "SELECT rezeptname FROM reznicola";
                    String[] ObjRList = mysqlnow.selectRezeptname(mysqlnow.doQuery(sqlJList));
                    RezeptListe.setListData(ObjRList);
                }
 
                else if(e.getSource() == newRezept) {
                    RezeptName.setText("");
                    introductions.setText("");
 
                    //If value is selected, deselect
                    if(tabelleRezept.isEditing()) {
                        tabelleRezept.clearSelection();
                    }
 
                    int NumberOfRow = tabelleRezept.getRowCount();
 
                    System.out.println(NumberOfRow);
 
                    for(int i=0;i<NumberOfRow;i++) {
                        model.removeRow(0);
                        //System.out.println(i);
                    }
 
                    model.addRow(new Object[] {"","",""});
 
                }
 
                else if(e.getSource() == deleteRezept) {
                    MySQL mysqlnow = MySQL.getInstance("jdbc:mysql://localhost/Rezepte","root","gMx@hotmAil");
                }
 
                else if(e.getSource() == updateRezept) {
                    MySQL mysqlnow = MySQL.getInstance("jdbc:mysql://localhost/test","root","gMx@hotmAil");
                    String sql = "";
                }
 
            }
 
            catch(Exception ex) {
                System.out.println("ActionPerformed failure!");
                System.out.println(ex);
            }
        }
    }
```
 
Vielleicht hat es noch etwas mit der Funktion tableChanged() zu tun. Kann es sein dass wenn die Zelle selektiert ist, diese nicht zum löschen zur Verfügung steht?

MFG Marius Meier


----------



## Matze (21. Januar 2008)

MariusMeier hat gesagt.:


> java.lang.ArrayIndexOutOfBoundsException: -1



Der warscheinlich älteste und häufigste Fehler der Java-Menschheit.

Ganz einfach. Du gehst üder die Array-Grenze. Lass dir mal mit 
	
	
	



```
System.out.println()
```
 mal die Zahle/Variable ausgeben, die du als Index benutzt um auf dass Array zuzugreifen, dann siest du dass die Zahl/Variable zu groß oder zu klein ist.


----------



## MariusMeier (21. Januar 2008)

Folgendes System.out habe ich:


1 --> NumberOfRow
ActionPerformed failure!
java.lang.ArrayIndexOutOfBoundsException: -1

Meiner Meinung nach greife ich da richtig auf das JTable Default Model zu. Die Nummerierung beginnt bei Null und geht dann aufwärts. Bei obigem Fehler habe ich die 3. Spalte meiner JTable selektiert gelassen und dann den Button "Neues Rezept" gedrückt. NumberOfRow ergibt natürlich 1 was auch stimmt, denn es ist nur eine Zeile momentan vorhanden. Jedoch gibt es trotzdem eine Fehlermeldung (Siehe oben).


```
for(int i=0;i<NumberOfRow;i++) {
						model.removeRow(0);
						//System.out.println(i);
					}
```

Setzt man in die Schlaufe die Zahl 1 ein so wird diese Schlaufe genau einmal ausgeführt. model.removeRow(0) löscht dabei die erste Zeile. 
Weitere Ideen?

MFG Marius


----------



## Matze (21. Januar 2008)

MariusMeier hat gesagt.:


> Meiner Meinung nach greife ich da richtig auf das JTable Default Model zu



Und wieso kommt dann ne Fehlermeldung? Kommt die ArayIndexOut...Exception auch wircklich vom Default Model? Wenn ja, dann greifst du garantiert nicht richtig darauf zu!


----------



## MariusMeier (21. Januar 2008)

Ja du hast schon recht, es liegt an diesem removeRow(); Jedoch wieso funktioniert es nicht richtig. Mit der Zahl 1 für NumberOfRow sollte nie unter 0 gegangen werden. Auch mit dem Debugger kann ich mir dass nicht erklären. Den dort zeigt er mir für die Variable das genau gleiche an.
Die Methode model.getRowCount(); könnte noch ein Problem sein...... ich hab mal folgendes probiert:
int NumberOfRow = model.getRowCount()-1;

Wenn ich jetzt den Button betätige spuckt er mir keine Fehlermeldung mer aus. Jedoch habe ich zwei Zeilen in der JTable anstatt nur eine.....  wie bekommt man hin dass ich nur noch eine zeile habe ohne diesen Fehler

MFG Marius


----------



## TSchulz (31. Oktober 2008)

Hallo Marius,

sehe ich das richtig? Du löscht aus dem DefaultTableModel mit


> for(int i=0;i<NumberOfRow;i++) {
> model.removeRow(0);
> //System.out.println(i);
> }


wobei NumberOfRow aus 


> int NumberOfRow = tabelleRezept.getRowCount();


geholt wird.

NumberOfRow hält dir die Anzahl der in der JTable sichtbaren Zeilen. Das kann von der Anzahl der Zeilen im TableModel abweichen.
Stimmen die Anzahl der Zeilen von TableModel und JTable überein?

Grüße

Thomas


----------



## mehirc (1. November 2008)

Hi,

das ist ein Problem das gerne mal vorkommt, ich falle auch noch manchmal darauf rein. 


```
for(int i=0;i<NumberOfRow;i++) {
                        model.removeRow(0);
                        //System.out.println(i);
                    }
```

Das Problem ist, mit jedem Löschen einer Zeile ändert sich auch die maximale Anzahl der Zeilen deiner Tabelle, d.h. dein anfänglich benutzes NumberOfRow ist schon nach dem ersten Schleifendurchlauf nicht mehr aktuell. Du kannst dir das so vorstellen, dass alle Zeilen die nach der gelöschten Zeile kommen einfach nachrutschen.

Ich löse das mit einem einfachen Trick und lösche die Einträge von unten.


```
for(int i=NumberOfRow-1;i>=0;i--) {
                        model.removeRow(0);
                        //System.out.println(i);
                    }
```

Gruß,

Michael


----------

