JTable (Header) optimale Spaltenbreite ermitteln

Hallo,

gibt es eine elegante Möglichkeit die optimale Spaltenbreite für eine
Tabelle zu ermitteln.

Bisher mache ich das folgendermaßen:
In einer Schleife laufe ich über alle Spalten und innerhalb einer Spalte über alle Zeilen. Aus den Zeilenobjekten ermittle ich die
jeweilige Breite und merke mir immer die Breite des größten Objekts.
Anschließend setze ich die ermittelte Breite für die Spalte.

Problem ist, dass das GUI manchmal an dieser Stelle hängen bleibt ???
und die Sache natürlich nicht gerade performant ist.

Habt Ihr eine bessere Idee ??

Danke
Albert

Hallo von der SAP Baustelle.

gibt es eine elegante Möglichkeit die optimale Spaltenbreite
für eine
Tabelle zu ermitteln ?.

Vermutlich.

Bisher mache ich das folgendermaßen:
In einer Schleife laufe ich über alle Spalten und innerhalb
einer Spalte über alle Zeilen. Aus den Zeilenobjekten ermittle
ich die
jeweilige Breite und merke mir immer die Breite des größten
Objekts.
Anschließend setze ich die ermittelte Breite für die Spalte.

Zu deutsch: das Design der Tabelle ist uneinheitlich.
Ich würde nur die maximale Breite und Höhe eines Objekts der Tabelle nehmen.

Problem ist, dass das GUI manchmal an dieser Stelle hängen
bleibt ???

Algorithmus performant programmiert (*)? Welcher GUI Stil (Swing, AWT) ?
(*)damit ist gemeint, dass die verschachtelten Schleifen mit dynamischen Werten mehr CPU-Zeit und Speicher verbrauchen als eigentlich nötig.

und die Sache natürlich nicht gerade performant ist.

Habt Ihr eine bessere Idee ??

s.o.
…und irgendwann mal den Code posten :wink:

HTH
mfg M.L.

Hallo,
hier ist nun der Code:

private void fitColumnToContent(int colIndex) {
TableColumn column = this.getColumnModel().getColumn(colIndex);
if (column == null)
return;

int modelIndex = column.getModelIndex();
TableCellRenderer renderer, headerRenderer;
Component component;
int colContentWidth = 0;
int headerWidth = 0;
int rows = this.getRowCount();

// Get width of column header
headerRenderer = column.getHeaderRenderer();
if (headerRenderer == null)
headerRenderer = getTableHeader().getDefaultRenderer();

Component comp = headerRenderer.getTableCellRendererComponent(
this, column.getHeaderValue(), false, false, 0, 0);
headerWidth = comp.getPreferredSize().width + getIntercellSpacing().width;

// Get max width of column content
for (int i = 0; i [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

viel anders gehts eigentlich nicht. Die Daten werden in einem Vektor gespeichert. Der Zugriff erfolgt über Zeile/Spalte. Die Daten werden also sonst an keiner Stelle gelesen und der Zugriff ist unperformant.

Etwas schneller sollte es gehen, wenn Du direkt den Datenvektor ZEILENWEISE ausliest. Dann musst Du an jedes Zeilenobjekt nur einmal ran.

Die beste Stelle, um die Zeilenbreite zu bestimmen, ist natürlich dort, wo die Daten eingelesen werden, also an der Quelle. Wenn man die Daten aus der Datenbank holt, kann man ja gleich die Länge auslesen.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Hatte das gleiche problem. Habe dann das TableModel selbst aufgebaut
und dabei ein eigenes String[] - Array als grundlage genommen. Dann
erfolg der Zugriff innerhalb des Array direkt ohne den umweg über die
model- und vector - api im DefaultTableModel

gruß

peter