# Spalte in JTable aus- und wieder einblenden



## Jan (9. Dez 2004)

Hallo zusammen,

ich möchte in einer JTable einige Tabellenspalten mittels CheckBox in der GUI aus- und einblendbar machen. Das Ausblenden habe ich wie folgt realisiert: 

table.removeColumn(column);
table.setAutoCreateColumnsFromModel(false);

Das klappt auch problemlos. Beim Wiedereinblenden habe ich allerdings das Problem, dass ich die Spalte nur hinten anfügen kann. Wie bekomme ich die Spalte aber wieder an die Position, in der sie auch vor dem Ausblenden war? Oder gibt es allgemein einen besseren Weg zur Lösung meines Problems?

Vielen Dank schon im Voraus.

Gruß,
Jan


----------



## foobar (9. Dez 2004)

Alternativ könntest du die Breite der Spalte auf 0 setzen:

```
myTable.getColumn("col1").setPreferredWidth(0);
```


----------



## Beni (9. Dez 2004)

Du koenntest ein eigenes TableModel implementieren. Dieses TableModel kann dann eine Spalte ausblenden, einfach indem es der Tabelle entsprechende Werte uebergibt.

Guck mal in der FAQ nach, da hat es auch noch was zu dem Thema.


----------



## Jan (10. Dez 2004)

Erstmal vielen Dank für die Hilfe.

@Foobar
Offensichtlich interessiert sich meine Tabelle nicht für die neu gesetzte Größe. Zumindest ändert sich nix. Ich schicke nach der Größenänderung 

tableModel.fireTableStructureChanged();

Ist das ok? Ich habe Deine Variante versucht mit dem Spaltennamen. das ist allerdings schwierig wegen gleicher Spaltennamen. Daher habe ich folgendes versucht.

myTable.getColumn(myTable.getColumnModel().getColumn(2).getIdentifier()).setPreferredWidth(0);

Das sollte doch funktionieren, oder?

@Beni
Was für Werte meinst du? Ich habe ein eigenes TableModel, aber was soll das Modell der Tabelle setzen?


----------



## Beni (10. Dez 2004)

Das Model gibt ja Werte zurück wie "getColumnCount" und so. Und anstelle von "x" gibst du nun "x-1" zurück, wenn eine Column ausgeblendert werden soll. (Entsprechend musst du nur daran denken, dass bei "getValueAt", etc... der Index der Column um 1 verschoben sein kann). Dann macht das Umschalten Column ein/aus  praktisch keine Arbeit mehr (du musst nicht irgendwo wild Daten herumkopieren...)


----------



## Jan (10. Dez 2004)

@Beni
Da werde ich mal drüber nachdenken. Da ich aber von insgesamt 11 Spalten 4 ein/ausblendbar machen will und wenn möglich auch noch jede von den 4 einzeln, scheint das recht aufwendig zu sein. Vielleicht denke ich aber zu kompliziert und es vereinfacht sich beim weiteren Nachdenken.   

@foobar
Diese Zeile aus meinem obigen Posting

myTable.getColumn(myTable.getColumnModel().getColumn(2).getIdentifier()).setPreferredWidth(0); 

ist natürlich völliger Schwachsinn. Aber auch wenn ich, wie eigentlich gewollt, setPreferredWidth direkt an der entsprechenden Spalte aufrufe ändert sich an der Tabelle nichts.


----------



## Guest (10. Dez 2004)

Der Grund, warum ich keine Größenänderung nach dem Setzen der neuen Spaltenbreite gesehen habe, war, dass ich das falsche Änderungsevent gesendet habe. Wenn ich statt  
	
	
	
	





```
tableModel.fireTableStructureChanged();
```
 dieses 
	
	
	
	





```
tableModel.fireTableChanged(new TableModelEvent(tableModel));
```
 verwende, ist eine Größenänderung sichtbar. 

ABER:

Die Spaltenbreite ist nicht 0 wie gesetzt, sondern die Spalte ist noch immer sichtbar und zwar so breit, dass noch drei Punkte in jede Zelle passen. Das ist doch sicher irgendeine der vielen Einstellungen der Tabelle, oder? Weiß jemand Rat?


----------



## Jan (10. Dez 2004)

Der Gast war ich. 
Das Forum hat mich bisher so sehr überzeugt, dass ich mich gleich angemeldet habe.  :wink:


----------



## foobar (10. Dez 2004)

Wenn du das ganze vernünftig lösen willst, mußt du dir einen Decorator schreiben der die sichtbaren Spalten in die realen Spalten konvertiert und umgekehrt. Falls es sich immer nur um eine Spalte handelt, die unsichtbar sein soll, kannst du das so lösen wie Beni es beschrieben hat. Also falls die Spalte unsichtbar ist müssen die folgenden Spaltenindice um eins erhöht werden.


----------



## Jan (13. Dez 2004)

foobar hat gesagt.:
			
		

> Wenn du das ganze vernünftig lösen willst, mußt du dir einen Decorator schreiben der die sichtbaren Spalten in die realen Spalten konvertiert und umgekehrt.



Ich erzeuge also jedesmal eine neue Tabelle mit der entsprechenden Anzahl von Spalten und fülle sie dann mit den entsprechenden Werten? Der Decorator würde dabei die Werte den Spalten zuordnen, richtig? Ein "Verstecken" ist also nicht auf vernünftige Weise möglich? 

Gibt es da vielleicht Beispiele für eine solche Anwendung? Das Problem bzw. der Wunsch so etwas zu realisieren tritt doch bestimmt häufiger auf, oder?  

Wieso kann man die Spaltenbreite nicht wirklich auf 0 setzen?


----------



## foobar (13. Dez 2004)

> Ich erzeuge also jedesmal eine neue Tabelle mit der entsprechenden Anzahl von Spalten und fülle sie dann mit den entsprechenden Werten?


Du erzeugst einen JTable mit 2 Models, wobei das eine Model die Anfragen für das andere Model übersetzt. Guck dir mal den SortDecorator an, dann wirst du sehen was ich meine.


----------

