# JTable: Spaltenbreite automatisch setzen



## Guest (27. Okt 2004)

Ich hab mich mal dem Codebeispiel des SortedTables aus der FAQ angenommen. Erstmal muss ich meint Hut vor Benjamin Sigg ziehn. Ich hät mir das im Moment nicht zugetraut das zu realisieren. Kann auch sein das ich den Schwierigkeitsgrad zu hoch ansiedel 

Hab einige wesentliche Hauptbestandteile aus dem SortedTable übernommen. 
Nun mal zur eigentlichen Frage: 
Ich hab recht viele Columns in meinen Table. Das ganze wird selbst bei maximalen Fenstergröße nicht übersichtlicher. Das liegt zum einen daran, dass alle Columns gleich groß sind. Z.B mein Kunden-ID-Feld ist genauso breit wie mein Bemerkungs-Fled. In A kommt eine max 4-stellige Zahl rein und in B max 255 Zeichen.
Gibts es eine Methode die mir die Zellenbreite an dem größten Zelleninhalt eines Column-Datensatzes ausrichtet oder muss ich mir da selbst was ausdenken?

Zum Verständnis:

|-------Zellenbreite-------------|

KundenNR
1
2
3
3
4
5
5
6

hier hat es ja keinen Sinn eine solche Columnbreite zu wählen. In diesem Fall solle es so optimiert werden:

|----------|

KundenNR
1
2
3
3
4
5
5
6


----------



## Roar (27. Okt 2004)

du kannst die größe der Columns setzen mit:

```
TableColumnModel cm = table.getColumnModel();
		TableColumn tc = cm.getColumn(0); // 0 == index
                // wenn der idnex unbekannt ist und man nur die beschriftung weiß:
		TableColumn tc = cm.getColumn(cm.getColumnIndex("KundenNR"));
		tc.setPreferredWidth(90); // breite
```

die breite der schrift kannst du, auf schmutzige art udn weise so rausfinden: 
int width = new JLabel("Blupp").getMinimumSize().width;


----------



## Guest (27. Okt 2004)

besten Dank, hat alles geklappt. Hab das ganze mit in die SortedTable-Klasse gepackt.


```
public void optimizeColumnWidth()
	{
		TableColumnModel cm = this.getColumnModel(); 
		TableColumn tc=null;
		int columncount=cm.getColumnCount();
		
		for(int columnindex=0;columncount>0 && columnindex<columncount;columnindex++)
		{
			int rowcount=model.getRowCount();
			String maxWord=model.getColumnName(columnindex);
			
			for(int rowindex=0;rowindex<rowcount;rowindex++)
			{
				if(maxWord.length()<((String)model.getValueAt(rowindex,columnindex)).length())
				{
					maxWord=(String)model.getValueAt(rowindex,columnindex);
				}
			}
			tc = cm.getColumn(columnindex); 
			tc.setPreferredWidth(new JLabel(maxWord).getMinimumSize().width);
		}
	}
```


----------



## Sky (28. Okt 2004)

Sag mal, kann das bei grossen Tabellen mit vielen Spalten und Zeilen nicht mal zum Problem werden??? Das könnte doch ein wenig dauern, oder nicht?

Ich mache das bei meinen Tables immer so, dass ich mir überlege, wie breit die Spalte ungefähr sein muss und der Benutzer bekommt dann die Erlaubnis die Spaltenbreite zu ändern...


----------



## thE_29 (28. Okt 2004)

```
public void setBestColumnWidth()
    {
           for(int i = 0; i < m_tab.getColumnCount(); i++)
           {
               TableColumn column = m_tab.getColumn(m_tab.getColumnName(i));
               int w = getPreferredWidthForColumn(column);
               column.setMinWidth(w);
               column.setPreferredWidth(w);
           }
    }
```

Vielleicht hilft dir das ja, wobei m_tab ein JTable ist!


----------

