2013-07-25 31 views
8

Ich versuche, die JTable-Spaltenbreite abhängig von den Daten im Inneren anzupassen. Mein Code:JTable-Spalte automatisch an den Inhalt anpassen

for(int column = 0; column < gui.testsuiteInfoTable.getColumnCount(); column ++){ 
     int width =0; 
    for (int row = 0; row < gui.testsuiteInfoTable.getRowCount(); row++) { 
     TableCellRenderer renderer = gui.testsuiteInfoTable.getCellRenderer(row, column); 
     Component comp = gui.testsuiteInfoTable.prepareRenderer(renderer, row, column); 
     width = Math.max (comp.getPreferredSize().width, width); 
     System.out.println(width); 
    } 
    TableColumn col = new TableColumn(); 
    col = gui.testsuiteInfoTable.getColumnModel().getColumn(column); 
    System.out.println(width); 
    col.setWidth(width); 
    gui.testsuiteInfoTable.revalidate(); 

    } 
} 

Die Größen korrekt sind, aber ich denke, die Tabellenspalten noch alle die gleiche Breite! Die Tabelle ist in einem ScrollPane in einem GridBagLayout eingebettet ist das das Problem? Danke für Anregungen.

+2

Schauen Sie sich [link] (http://tips4java.wordpress.com/2008/11/10/table-column-adjuster/) –

+0

Nicht funktioniert auch nicht. –

Antwort

9

Wenn Sie eine zusätzliche Bibliothek verwenden können, versuchen SwingX (https://java.net/projects/swingx) Dort haben Sie einen JXTable, mit einer Methode „packAll()“, das genau das tut, was Sie fordern für

5
col.setWidth(width); 

lesen JTable API und folgen Sie dem Link auf How to Use Tables. In diesem Tutorial verwenden sie die setPreferredWidth(...), um eine Breite für eine Spalte vorzuschlagen.

Sie können auch die Table Column Adjuster überprüfen, die dies für Sie tut. Diese Lösung kann auch die Breite des Spaltenkopfes berücksichtigen.

+0

Danke. Das Problem scheint zu sein, wenn Sie die JTable nicht zu einem JScrollPane hinzufügen, dann funktioniert setWidth usw. nicht. –

19

Dies alles, was Sie brauchen:

JTable table = new JTable(){ 
    @Override 
     public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
      Component component = super.prepareRenderer(renderer, row, column); 
      int rendererWidth = component.getPreferredSize().width; 
      TableColumn tableColumn = getColumnModel().getColumn(column); 
      tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth())); 
      return component; 
     } 
    }; 
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

Die Tabelle jede Spaltenbreite anpassen automatisch den Inhalt passen. Sie müssen nicht steuern, wann die Größenänderung ausgelöst werden soll.

+0

Das funktioniert, aber Sie werden eine Warnung erhalten, wenn Sie serialVersionUID nicht hinzufügen. +1. –

+0

Es sieht so aus, als wenn die Größe der Tabellenspalte auf einen größeren Wert geändert wird, sie wird nicht verkleinert, um dem aktuellen Status von Spalten zu entsprechen. – lordoku