# Column Breite in JTable automatisch an Inhalt anpassen



## zd (5. Apr 2006)

Hi,
ich habe folgendes Problem:
Ich habe einen JTable der mit Inhalten einer Datenbank gefüllt wird.
Die Breite der Column soll automatisch an die Breite der breitesten Zelle aus einer Column angepasst werden (zumindest bis zu einer vordefinierten maximalen Breite).

Also nochmal ein Beispiel zur verdeutlichung:
MaxBreite = 200. 
In Column A ist die breiteste Zelle 60 breit. Breite wird auf 60 gesetzt.
In Column B ist die breiteste Zelle 220 breit. Breite wird auf 200 gesetzt.

Soweit ist das nicht so schwierig, ich mach das in meinem CellRenderer:

```
class TableRenderer extends JLabel implements TableCellRenderer {
	private static final int maxWidth = 200;
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		if (value != null) {
			setText(value.toString());
			int width = getPreferredSize().width; // breite des labels der aktueller zelle
			if (width > maxWidth) width = maxWidth; // falls größer als maxwidth auf maxwidth setzen
			if (table.getColumnModel().getColumn(column).getPreferredWidth() < width) { // falls spalte bis jetzt schmaler ist breiter machen
				table.getColumnModel().getColumn(column).setPreferredWidth(width);
			}
		} 
		// ...	
		return this;
   }
}
```
Funktioniert bis jetzt einwandfrei.
Jetzt soll der Benutzer aber natürlich die Möglichkeit haben, eine Spalte schmaler zu machen. D.h. die oben angegebenen Sachen sollen nur einmal nach dem Initialisieren des JTables ausgeführt werden, danach nicht mehr.
Momentan kann ich eine Spalte zwar schmaler ziehen, sie "hüpft" dann aber zurück auf ihre Ausgangsbreite.
Ich hoffe ich habe mich einigermassen verständlich ausgedrückt, bei Unklarheiten bitte einfach nachfragen.
Hat jemand eine Idee wie ich das umsetzen könnte (Table-experte Beni? )
Danke


----------



## Sky (5. Apr 2006)

Event (Spaltenbreite wurde geändert) fangen und Spalte merken. Für diese Spalte gilt o. g. Behandlung von Spaltenbreitenvergrößerungen nicht angewendet.


----------



## zd (5. Apr 2006)

Danke für die Antwort, ich probiere grad damit rum.
Hast du dabei ein spezielles Event im Kopf?
Was ich dazu gefunden habe ist das folgende:

```
sqlTable.getColumnModel().addColumnModelListener(	new TableColumnModelListener() {
	public void columnMarginChanged(ChangeEvent e) {
		 // column resize detected
	}
});
```
Das hilft mir aber leider auch nicht, weil dabei kein unterschied gemacht wird, ob der Resize von nem User oder vom Programm selber ausgeführt wurde.
Irgendne Idee?
Danke


----------



## zd (5. Apr 2006)

Ok, ich habs hingekriegt. Zwar etwas häßlicher workaround, aber immerhin funktionierts.
boolean resize, der am Anfang true ist, die Größe wird nur geändert wenn der gesetzt ist.


```
if (resize) {
	if (width > maxWidth) width = maxWidth;
	if (table.getColumnModel().getColumn(column).getPreferredWidth() < width) {
		table.getColumnModel().getColumn(column).setPreferredWidth(width);
	}
}
```
resize wird auf false gesetzt sobald ein mouseDragged auf dem TableHeader festgestellt wird:

```
sqlTable.getTableHeader().addMouseMotionListener(new MouseMotionAdapter() {
	public void mouseDragged(MouseEvent e) {
		resize = false;
	}
});
```


----------

