# Im JTable Zeilen ein-/ausblenden



## sp_1 (10. Jan 2005)

Hallo zusammen,

hat jemand eine Idee, wie ich in einem JTable die Zeilen filtern, bzw. ausblenden oder beim zurücksetzten des Filters wieder einblenden kann? Ich wollte es mittels eines zweiten TableModels machen. Die Problematik ist, dass ich net weiss wie ich die Zeilen inizieren soll....

Hat jemand eine Idee?

Für für jede Hilfe dankbar

Gruß
sp_1


----------



## Sky (10. Jan 2005)

Spontane Idee (gibt wahrscheinlich bessere):


```
// Hier sind alle Daten drin
  Object[][] data;

  // Index fuer die Zeilen
  int[] rows;

  public void doFilter() {
    // Hier wird 'rows' befuellt.
    // Befuellung ist nur exemplarisch dargestellt!!!

    // Bsp 1: Aus 'data' werden die Zeilen 4, 8 und 11 benoetigt:
    rows = new int[3];
    rows[0] = 4;
    rows[1] = 8;
    rows[2] = 11;

    // Bsp 2: Alle Daten sollen angezeigt werden
    rows = new int[11];
    rows[0] = 0;
    // ...
    rows[10] = 10;
  }

  public int getRowCount() {
    return rows.length;
  }

  public Object getValueAt( int row, int col ) {

    // Index fuer die Daten ermitteln
    int theRow = rows[row]; // Fuer row = 0 wäre theRows = 4 
                            // => Zeile 4 aus 'data' wuerde in der ersten Tabellenzeile angezeigt.

    // Daten zurueckgeben.
    return data[theRow][col];
  }
```


----------



## sp_1 (10. Jan 2005)

Die Idee ist an sich schon ganz gut, aber das Ganze ist bei mir bisschen komplexer. Ich habe schon ein selbsdefiniertes TableModel, mit dem ich schon die Spalten ein und ausblenden kann. 

Wenn meine Vorstellung richtig ist, müsste ich noch ein zweites TableModel definieren und da die Daten manipulieren. Was ich moment nicht verstehe, wie komme ich an die Rows aus dem ersten TableModel.


----------



## Beni (10. Jan 2005)

Du setzt das erste sozusagen in das zweite hinein:


```
public class FirstTableModel implements TableModel{
  ...
}
```


```
public class SecondTableModel implements TableModel{
  private FirstTableModel model;

  public SecondTableModel( FirstTableModel model ){
    this.model = model;
  }

  public Object getValueAt( int row, int column ){
    if ....

    return model.getValueAt( row, column+5 );  // nur so als Beispiel
  }
}
```

... und übergibst das zweite dann der Tabelle

```
TableModel theModel = new SecondTableModel( new FirstTableModel( ... ));
jtable.setModel( theModel );
```


----------



## sp_1 (10. Jan 2005)

Danke! 

Eine Kleinigkeit habe ich noch, das Filtern soll ja auch zurücksetzbar sein. Kann ich dann das zweite TableModel irgendwie abmelden???


----------



## Beni (10. Jan 2005)

Ja klar: du benötigst dazu noch eine Methode "getModel" im zweiten Model, welche das erste Model zurückliefert, und kannst dann sowas machen:

```
JTable table = ...
SecondTableModel model = (SecondTableModel)table.getModel();
table.setModel( model.getModel() );
```


----------



## Snape (11. Jan 2005)

Moin,
auch hier würde ich TableRows empfehlen. Und dann in einer Methode createTableRows() ein Flag abfragen, ob die aktuelle Zeile hinzugefügt werden soll/darf.


----------

