# Probleme mit JTable: Spaltenbreite ändert sich einfach wieder!



## Lautsprecher (18. Oktober 2005)

Hallo,
im initialize meiner Anwendung baue ich ein JTable mit JScrollPane auf. Hierbei lese ich gleich zum ersten Mal Daten in die Tabelle:


```
defaultTableModel = new DefaultTableModel(1,7);
defaultTableModel.setColumnIdentifiers(Spaltenbezeichnung);
JTable table = new JTable(defaultTableModel);
initDatabaseStuff();
Vector results = datenbankauslesen();
defaultTableModel.setDataVector(results,Spaltenbezeichnung);
defaultTableModel.fireTableDataChanged();
table.setEnabled(false);
DefaultTableCellRenderer ren = new DefaultTableCellRenderer();
ren.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT);
table.setShowGrid(true);
table.setColumnSelectionAllowed(true);
table.setFocusable(false);
table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
table.sizeColumnsToFit(true);
table.setBounds(new java.awt.Rectangle(0, 0, 0, 0));
table.getColumnModel().getColumn(0).setPreferredWidth(150); 
table.getColumnModel().getColumn(1).setPreferredWidth(370); 
table.getColumnModel().getColumn(2).setPreferredWidth(120); 
table.getColumnModel().getColumn(3).setPreferredWidth(120); 
table.getColumnModel().getColumn(4).setPreferredWidth(120); 
table.getColumnModel().getColumn(5).setPreferredWidth(120); 
table.getColumnModel().getColumn(6).setPreferredWidth(30); 
table.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);
/*table.getColumnModel().getColumn(0).setHeaderRenderer(renderer);
table.getColumnModel().getColumn(1).setHeaderRenderer(renderer);*/
table.getColumnModel().getColumn(2).setCellRenderer(ren);
table.getColumnModel().getColumn(3).setCellRenderer(ren);
table.getColumnModel().getColumn(4).setCellRenderer(ren);
table.getColumnModel().getColumn(5).setCellRenderer(ren);
table.getColumnModel().getColumn(6).setCellRenderer(ren);
jScrollPane = new JScrollPane(table);
jScrollPane.setBounds(new java.awt.Rectangle(29, 168, 618, 481));
jScrollPane.setViewportView(table);
}
return jScrollPane;
```

Soweit klappt hier alles noch ganz gut. Der Benutzer kann von selbst nicht die Spaltenbreite änderen. Und die Spalten werden auch in der gewünschten Größe  angezeigt.

In meiner Anwendung wird per Button-Druck ein neuer Datensatz in die Datenbank geschrieben und gleichzeitig wird dieser dann in der JTable ausgegeben und da krachts.
Die Daten werden zwar angezeigt, jedoch werden die Spaltenbreiten nicht übernommen! Alle Spalten sind wieder gleich groß!


```
initDatabaseStuff();  //Datenbank verbinden
datenbankUpdate(); //Datensatz update und schließen

initDatabaseStuff(); //Datenbank wieder öffnen
Vector results = datenbankauslesen(); //Datensätze auslesen und schließen
defaultTableModel.setDataVector(results,Spaltenbezeichnung);  
defaultTableModel.fireTableDataChanged();
```

Hat vielleicht jemand eine Idee an was das liegen kann, bzw. was ich evtl. in der Buttonmethode nicht berücksichtigt habe?

Grüße


----------



## flashray (19. Oktober 2005)

Hallo Silber,


versuchs mal mit:

JTable mytable = new JTable();
mytable.setAutoResizeMode(AUTO_RESIZE_OFF);

VG Erdal


----------



## Lautsprecher (20. Oktober 2005)

Hi Erdal,
ich wollte deine Syntax gerade einbauen aber ich kann AUTO_RESIZE_OFF nicht in Klammer setzen. Der Compiler bringt die Meldung, dass AUTO_RESIZE_OFF nicht "resolved" werden kann.


----------



## ellion (20. Oktober 2005)

JTable mytable = new JTable();
mytable.setAutoResizeMode(mytable.AUTO_RESIZE_OFF);

sollte gehen, anonsten JTable.AUTO_RESIZE_OFF


----------



## Lautsprecher (21. Oktober 2005)

Griaß Di,
das mit AUTO_RESIZE_OFF hat jetzt geklappt. Er macht mir aber wieder alle Spalten gleich groß nach dem ich den INSERT in die Datenbank geschrieben habe?
Ich versteh das nicht?!!


----------



## flashray (21. Oktober 2005)

Eine letzte Idee hätte ich noch.

Du hast wie ich jetzt bemerkt habe nur setpreferredsize gesetzt. Weise mit setminimumsize und setmaximumsize für jede spalte den gleichen wert zu wie bei preferredsize.
Das mit Autoresizeoff würde ich auch noch beibehalten.

VG Erdal


----------



## Lautsprecher (21. Oktober 2005)

```
table.getColumnModel().getColumn(0).setMaxWidth(150); 
table.getColumnModel().getColumn(1).setMaxWidth(370); 
table.getColumnModel().getColumn(2).setMaxWidth(120); 
table.getColumnModel().getColumn(3).setMaxWidth(120); 
table.getColumnModel().getColumn(4).setMaxWidth(120); 
table.getColumnModel().getColumn(5).setMaxWidth(120); 
table.getColumnModel().getColumn(6).setMaxWidth(30); 
table.getColumnModel().getColumn(0).setMinWidth(150); 
table.getColumnModel().getColumn(1).setMinWidth(370); 
table.getColumnModel().getColumn(2).setMinWidth(120); 
table.getColumnModel().getColumn(3).setMinWidth(120); 
table.getColumnModel().getColumn(4).setMinWidth(120); 
table.getColumnModel().getColumn(5).setMinWidth(120); 
table.getColumnModel().getColumn(6).setMinWidth(30); 
table.setAutoResizeMode(table.AUTO_RESIZE_OFF);
```

Hi danke Dir nochmal,
aber wenn ich max und min setze, zieht nur der Min-Befehl und ich bekomme eine horizontalen Rollbalken, da die Spalten dann nicht mehr in das Pane passen.
Wenn ich nur MAX mache ist das Pane größer, die Spalten sind alle eng bei einander


----------



## Snape (21. Oktober 2005)

Moin,
Du musst die Spaltenbreiten schon selbst berechnen und ggf. minimum/maximum/preferredSize setzen. Damit bist Du auf Nummer sicher unterwegs.


----------



## Lautsprecher (21. Oktober 2005)

Und wie funktioniert sowas?


----------



## Snape (21. Oktober 2005)

Mit Hilfe der Suchfunktion. 
Das hier sollte Dich schon weiter bringen: http://www.tutorials.de/tutorials199631.html


----------

