Also arbeite ich mit einer JTable
, die an ein eigenes Datenmodell gebunden ist. So viel ist alles funktional, aber das Problem, das ich habe, ist, dass jedes Mal, wenn ich eine Änderung an der Tabelle vornimmt (fire tableDataChanged, tableStructureChanged usw.), alle Spaltenbreiten auf die Standardwerte zurückgesetzt werden. Ich verstehe aus der Forschung, dass dies mit der standardmäßig zugewiesenen TableColumnModel
zu tun hat. Außerhalb dieses Zurücksetzens bin ich mit der Funktionalität der DefaultTableColumnModel
zufrieden, aber ich möchte nur die Breite der Spalten behalten, wenn ein Benutzer ihre Größe ändern sollte (durch Ziehen der Kante der Spaltenüberschrift).Wie kann ich benutzerdefinierte Spaltenbreiten in einer JTable verwalten?
Ich kenne setPreferredWidth()
für die TableColumns, und ich konnte das erfolgreich tun; Ich nehme an, meine Frage ist, auf welches Ereignis ich achten sollte, um diese bevorzugte Breite zu speichern und einzustellen. Ich habe versucht, eine PropertyChangeListener
zum Tabellenheader hinzuzufügen, aber ich würde einen StackOverflow jedes Mal bekommen, wenn ich versuchte, die Größe zu ändern (ich nehme an, dass es rekursiv lief). Ich bin völlig in Ordnung mit dem Hinzufügen eines zusätzlichen Datenelements im Datenmodell für die Spaltenbreiten, und speichern Sie es dort, aber ich weiß nur nicht, wann/wie diese Breiten eingestellt werden, so dass sie nicht von der fireTableStructureChanged()
überschrieben werden, usw. Ereignisse. Gedanken?
Bevor Sie Ihren Prozess schließen, lesen Sie die Spaltenbreiten und speichern Sie sie in einer Eigenschaftendatei. Wenn Sie Ihren Prozess öffnen, lesen Sie die Eigenschaftendatei und legen Sie die Spaltenbreiten fest, falls vorhanden. Möglicherweise müssen Sie das DefaultTableColumnModel erweitern, damit Sie die Spaltenbreiten steuern können. –
Es tut dies tatsächlich bei jedem Aufruf von fireTableStructureChanged(), nicht nur am Anfang des Programms, also wenn ich Spalten im Datenmodell hinzufüge oder entferne (wo es Spalten neu generieren muss), tut es dies. Ich habe versucht, 'FireTableStructureChanged()' zu überschreiben, um die Spaltenbreiten manuell zu setzen, aber es hat scheinbar keinen Effekt. Ich denke, ich bin mir nicht sicher, wo genau diese Kolumnengeneration stattfindet und wo man sie überschreiben kann. – kcoppock
Ich habe immer datengesteuerte Spaltenbreiten gemacht. Wenn ich etwas finde, werde ich eine Antwort geben. –