# JTable und ArrayList - selected rows löschen



## nadal15 (21. Jul 2008)

hi!!

hab ein problem das ich nicht selber schaffe 

ich hab eine jtable und eine arraylist mit einen eigenen TableModel. bis jetzt schaffe ich es nur eine ausgewählte zeile zu löschen, doch wenn mehrere ausgewählt werden, dann komm ich nicht mehr weiter.
es liegt daran, dass wenn ich ein Element aus der ArrayList entferne, in dieser auch gleich die Indices aktualisiert werden.

als Beispiel:

in der JTable sind die Elemente 0, 1, 2 ausgewählt. wenn ich jetzt in der arrayliste das 0. element entferne (das auch funktioniert) wird sofort der index vom nächsten element auf 0 aktualisiert. also siehts dann so aus:

0 --> wurde erfolgreich entfernt
1 --> index wurde auf 0 geändert
2 --> index wurde auf 1 geändert

hat jemand eine idee wie ich das machen könnte oder anders vorgehen könnte?


mfg


----------



## Tobias (21. Jul 2008)

Mh, dann musst du deine Indizes eben auch aktualisieren:

Die Indizes, die gelöscht werden sollen der Größe nach sortieren.
Ersten Index löschen, alle nachfolgenden Indizes um eins verringern.
Weiter mit Schritt 2 bis alle Indizes gelöscht sind.

mpG
Tobias


----------



## Michael... (21. Jul 2008)

in umgekehrter Reihefolge löschen.


----------



## L-ectron-X (21. Jul 2008)

Ich habe mal einen FileRenamer geschrieben, dem man per Mausklicks die umzubenennenden Dateien hinzufügen oder entfernen kann. In meinem dazu gehörenden TableModel (extends AbstractTableModel) sind auch Methoden zum Löschen von Dateien aus dem Model implementiert.

Auszug:

```
/** 
   * Entfernt mehrere Zeilen aus dem Model.
   * @param rows ein Array, welches die Indexpositionen der zu löschenden Zeilen enthält
   */
   public void removeRow(int[] rows) {
      int[] indices = rows;
      Arrays.sort(indices);
      for(int i = indices.length; i > 0; i--) {
         removeRow(indices[i-1]);
      }
   }
   
   /**
   * Entfernt eine Zeile aus dem Model.
   * @param row die Zeile, repräsentiert durch einen Index, welche gelöscht werden soll.
   */
   public void removeRow(int row) {
      dataVector.remove(row);
      fireTableRowsDeleted(row, row);
   }
   
   /**
   * Entfernt alle Zeilen aus dem Model.
   */
   public void removeAll() {
      dataVector.clear();
      fireTableRowsDeleted(0, 0);
   }
```


----------



## Tobias (21. Jul 2008)

Ach, kommt schon, in umgekehrter Reihenfolge löschen ist nun wirklich viel zu einfach!


----------



## André Uhres (21. Jul 2008)

Hier ein Beispiel, das auch mit dem DefaultTableModel funktioniert (es hat keine Methode mit Array removeRow(int[] rows)):

```
int[] selrows = table.getSelectedRows();
for (int i = selrows.length - 1; i > -1; i--) {
    int rowInModel = table.convertRowIndexToModel(selrows[i]);
    model.removeRow(rowInModel);
}
```
Man beachte bitte, daß das Array "table.getSelectedRows()" die Zeilen in der Reihenfolge der View enthält.
Daher wird vor dem Aufruf von "model.removeRow" zuerst der Zeilenindex konvertiert: convertRowIndexToModel.
Das ist wichtig, wenn die JTable sortierbar ist.
Beim Aufruf einer Methode mit Array muss in dem Fall darauf geachtet werden,
das Array "table.getSelectedRows()" vor dem Aufruf zu konvertieren,
damit man ein Array übergibt, das die Zeilen in der Reihenfolge des Models enthält.


----------



## nadal15 (22. Jul 2008)

danke, habs jetzt geschafft, aktualisiere einfach immer die indizes


----------

