JTable: Spaltenbreite automatisch setzen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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
 
du kannst die größe der Columns setzen mit:
Code:
		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;
 
besten Dank, hat alles geklappt. Hab das ganze mit in die SortedTable-Klasse gepackt.

Code:
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);
		}
	}
 
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...
 
Code:
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!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben