2013-07-13 12 views
18

Ich brauche meine JTable, um die Spaltenbreite automatisch an den Inhalt anzupassen. Ich fand die TableColumnAdjuster Klasse sehr nützlich. Aber da ist ein kleines Problem. Angenommen, ich habe 5 Spalten und ihr Inhalt ist sehr kurz. Wenn ich in diesem Fall die automatische Anpassung verwende, werden die ersten vier Spaltenbreiten entsprechend ihrem Inhalt eingestellt und der gesamte Rest der Spalte wird der letzten Spalte zugewiesen. Bitte beachten Sie das Beispiel.Automatische Größenanpassung der JTable-Spaltenbreiten

enter image description here

Hier der letzten Spalte wird Balance alle überschüssigen Raum gegeben. Was aber, wenn ich einer der mittleren Spalten diesen Platz geben muss? Im obigen Fall muss ich diesen Platz der dritten Spalte name zuweisen. Ich habe versucht, die TableColumnAdjuster Klasse adjustColumns() Methode zu ändern. Aber ich konnte es nicht funktionieren.

Ich habe sowohl column.setPreferredWidth() als auch column.setWidth() versucht, um die Spaltengröße zu ändern. Aber es scheint nichts zu ändern. Wie kann ich die Spaltengröße eines JTable effektiv ändern? Wenn es eine andere Alternative oder eine direkte Antwort auf mein Hauptproblem gibt, ist das besser. Vielen Dank!

Antwort

43

Sie können versuchen, die nächste:

public void resizeColumnWidth(JTable table) { 
    final TableColumnModel columnModel = table.getColumnModel(); 
    for (int column = 0; column < table.getColumnCount(); column++) { 
     int width = 15; // Min width 
     for (int row = 0; row < table.getRowCount(); row++) { 
      TableCellRenderer renderer = table.getCellRenderer(row, column); 
      Component comp = table.prepareRenderer(renderer, row, column); 
      width = Math.max(comp.getPreferredSize().width +1 , width); 
     } 
     if(width > 300) 
      width=300; 
     columnModel.getColumn(column).setPreferredWidth(width); 
    } 
} 

JTable

Dies vor dem Resize-Methode ausgeführt werden muss.
Wenn Sie:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

JTable

+0

Das ist fantastisch, endete damit. Ich habe vor dem setPreferredColumnModel-Aufruf eine Überprüfung hinzugefügt, die folgendermaßen aussieht: "if (width> 300) width = 300;" Das behebt einige Fälle, in denen ich wirklich lange Datenfelder anzeige. Ich würde vorschlagen, das zur Antwort hinzuzufügen - und Sie könnten auch min/max Breite extrahieren (Würde fantastische optionale Parameter machen - in der Tat werde ich das jetzt in meiner Codebasis tun.) (Ich wünschte ich wüsste es wenn es cool war, so etwas in jemandes Antwort zu bearbeiten ...Da es nicht CW ist, hasse ich den Inhalt ohne Erlaubnis zu ändern.) –

+0

Hallo, @BillK Fühlen Sie sich frei, den Code zu bearbeiten/hinzufügen ... und wenn Sie einen Screenshot haben. ;) –

+0

kann ich auch irgendwie den Header auswerten, damit sein Text nicht abgeschnitten wird? – Xerus

5

Es gibt keine Option ist automatisch eine Spalte größer als der andere zu ändern.

Vielleicht können Sie so etwas wie:

tca = new TableColumnAdjuster(table, 0); 
tca.adjustColumns(); 
TableColumnModel tcm = table.getColumnModel(); 
TableColumn tc = tcm.getColumn(1); 
tc.setWidth(tc.getWidth() + 25); 

Dies würde ermöglichen es Ihnen besonders viel Platz auf Spalte 1. Dieser zusätzliche Platz nur das erste Mal hinzugefügt werden würde hinzufügen die Tabelle angezeigt wird.

Eine weitere Option ist die Verwendung:

table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

Dies würde mehr Platz zuweisen proportional zu jeder Spalte.

0

Sie können dies tun:

JPanel jp = new JPanel(); 
jp.add(table); 

jp.setLayout(new GridLayout(1,1)); /* little trick ;) and believe me that this step is important to the automatic all columns resize! A import is also needed for using GridLayout*/ 
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // this is obvius part 
+0

funktioniert nicht ...... – Augusto

1

setAutoResizeMode() Ihre Tabelle sagen, wie Sie es, um die Größe sollte einen Versuch geben werden alle verschiedene Optionen zur Verfügung, die Unterschiede zu sehen, die ich in meinem Fall wollte Ändern Sie die Größe von zwei Spalten und lassen Sie sie entscheiden, wie Sie alle anderen anpassen möchten.

jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); 
TableColumnModel colModel=jTable1.getColumnModel(); 
colModel.getColumn(1).setPreferredWidth(25);  
colModel.getColumn(2).setPreferredWidth(400);