Wenn ich den Vector dataVector eines DefaultTableModels ersetze, ändert sich erwartungsgemäß der Inhalt, aber auch - nicht gewünscht - die von mir gesetzten Spaltenbreiten meiner JTable.
Kann man das irgendwie umgehen oder muss ich jedesmal die Spaltenbreiten neu setzen?
danke für deinen Beitrag.
Aber darum geht es nicht. Ich habe zwar in der Tat mehrere JTables, die aber in verschiedenen Tabs einer JTabbedPane liegen.
Aus einer Datei lade ich mir Daten, die in die JTable des gerade aktiven Tabs geladen werden sollen. Die Datei ändert sich laufend und ich möchte per Mausklick auf einen Button die Daten des aktuellen Stands aus der Datei laden, in ein TableModel umformen und damit die JTable auf den neusten Stand bringen. Da die Daten in einem Vector aus Vectoren liegen, ersetze ich den Original-Vector (dataVector) eines DefaultTableModels.
Und immer wenn ich das mache, ändern sich auch die Spaltenbreiten meiner JTable auf die Default-Werte…
Nur, warum? Und wie kann ich das umgehen?
Genau. Ich setze die Werte beim Instanziieren meiner JTable, in dem ich mir das TableColumnModel von der JTable geben lasse und die einzelnen Spalten manipuliere.
Sieht dann so aus:
int width = 0;
int minWidth = 0;
for (int i = 0, c = columnModel.getColumnCount(); i < c; i++) {
TableColumn column = columnModel.getColumn(i);
switch (i) {
case 0:
case 1:
width = 110;
minWidth = 80;
break;
case 2:
width = 110;
minWidth = 90;
break;
case 3:
case 4:
case 5:
case 6:
width = 60;
minWidth = 60;
break;
case 7:
width = 80;
minWidth = 80;
break;
case 8:
width = 120;
minWidth = 120;
break;
case 9:
width = 80;
minWidth = 80;
break;
case 10:
width = 400;
minWidth = 200;
break;
}
column.setPreferredWidth(width);
column.setMinWidth(minWidth);
}```
Keine Ahnung, ob man das so machen kann. Aber es funktioniert bei mir.
Nein, noch nicht. Aber das wäre mein nächster Schritt gewesen.
Nur wollte ich zuvor noch fragen, ob ich was verkehrt gemacht habe, und/oder ob sich das beschriebene Verhalten erklären und umgehen lässt.
Ja, die JTable,… die mit Abstand komplizierteste Klasse in Swing… Für sowas wäre ein KSKB immer gut. Bis dahin (nicht zuletzt wegen der Uhrzeit) nur ein kurzer Hinweis, vielleicht mal mit http://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html#setAutoCreateColumnsFromModel(boolean) rumzuspielen. Ansonsten aber noch ein Codesnippet, das ich irgendwann mal gebastelt hatte, und was manchmal ganz praktisch sein kann:
/**
* Adjust the preferred widths of the columns of the given table
* depending on the contents of the cells and headers.
*
* @param table The table to adjust
* @param maxWidth The maximum width a column may have
*/
public static void adjustColumnWidths(JTable table, int maxWidth)
{
final int safety = 20;
for (int c = 0; c < table.getColumnCount(); c++)
{
TableColumn column = table.getColumnModel().getColumn(c);
TableCellRenderer headerRenderer = column.getHeaderRenderer();
if (headerRenderer == null) {
headerRenderer = table.getTableHeader().getDefaultRenderer();
}
Component headerComponent =
headerRenderer.getTableCellRendererComponent(
table, column.getHeaderValue(), false, false, 0, 0);
int width = headerComponent.getPreferredSize().width;
for (int r = 0; r < table.getRowCount(); r++)
{
TableCellRenderer cellRenderer = table.getCellRenderer(r, c);
Component cellComponent =
cellRenderer.getTableCellRendererComponent(
table, table.getValueAt(r, c),
false, false, r, c);
Dimension d = cellComponent.getPreferredSize();
//System.out.println("Preferred is "+d.width+" for "+cellComponent);
width = Math.max(width, d.width);
}
column.setPreferredWidth(Math.min(maxWidth, width + safety));
}
}
Ja, mit einem table.setAutoCreateColumnsFromModel(false);
direkt nach dem Erstellen der JTable scheint - soweit ich das verstanden habe - das Ziel ja schon erreicht zu sein.