2009-05-08 10 views
4

entweder diese nicht existiert, oder ich denke nicht/Suche richtig, weil es spät ist ...Setzen eines Wertes Prototyp (für Auto-Breitenberechnung) einer JTable Spalte

Ich möchte ein JTable setzen Spaltenbreite in Swing basierend auf einem Prototypwert für die größte Zeichenfolge, die ich in einer bestimmten Spalte erwarten (oder wissen) kann. Ich kenne die Anzahl der Pixel nicht, da ich die Schriftart zur Kompilierzeit nicht unbedingt kenne.

Gibt es eine Möglichkeit, einen Prototyp-Wert für die Spaltenbreite zu setzen, wie es für Zeilenhöhe Zwecke gibt? Wenn das so ist, wie?

Antwort

1

Haben Sie versucht, die Schaffung einer JLabel zur Laufzeit garantieren kann und Verwenden Sie seine Größe, um die Größe Ihres Tisches zu ändern?

// create a label that will be using the run-time font 
JLabel prototypeLabel = new JLabel("Not Applicable") 

// get the labels preferred sizes 
int preferredWidth = prototypeLabel.getPreferredSize().getWidth(); 
int preferredHeight = prototypeLabel.getPreferredSize().getHeight(); 

// set the sizes of the table's row and columns 
myTable.setRowHeight(preferredHeight); 

for(TableColumn column : myTable.getColumnModel.getColumns()){ 
    column.setPreferredWidth(preferredWidth);   
} 
+0

oh, das ist schlau. Kann ich sicher sein, dass die Einträge in JLabel und in der Tabellenspalte dieselbe Schriftart verwenden? –

+0

Es hängt wahrscheinlich davon ab, welche Schriftart Ihr TableCellRenderer verwendet. Wenn Sie Zugriff auf die Renderer hatten und diese auch von JLabel stammten, könnten Sie Ihre Prototype-Beschriftung mit der gleichen Schriftart erstellen: JLabel prototypeLabel = new JLabel ("Not Applicable"); prototypeLabel.setFont (cellRenderer.getFont()) – Andrew

+1

-1 Es ist keine gute Idee, eine Arbitrary-Komponente zum Messen der Größe zu verwenden. Verwenden Sie stattdessen die Rendering-Komponente wie in der Tabelle – kleopatra

-1

Wenn Sie die Schriftart zum Zeitpunkt der Kompilierung nicht kennen, wird die Breite jeder JTable-Spalte immer unbekannt sein. Öffnen Sie als Plausibilitätsprüfung ein Textdokument und spielen Sie mit verschiedenen Schriftarten, während Sie die Punktgröße konstant halten. Die Länge dessen, was geschrieben wird, variiert von Schriftart zu Schriftart, aber die Höhe nicht. Die Höhe einer JTable-Zeile sollte für jede Schriftgröße (in Punkten) bestimmt werden können, da es sich um eine defined standard handelt. Es kann ein wenig experimentieren, wenn man bedenkt, dass JTable wahrscheinlich ein wenig Abstand zwischen den Zellen gibt.

Wenn Sie weder die Schriftgröße noch die Schrift selbst bei der Kompilierung dann bin ich daran interessiert, welche Antworten andere Menschen kommen mit :)

+0

"die Breite einer JTable-Spalte wird immer unbekannt sein." ??? Ich habe einen Beispieltext, z.B. "Nicht zutreffend", die ich als maximale Spaltenbreite verwenden möchte. Sicher zur Laufzeit, wenn die Schriftart bekannt ist, ist es möglich, die Spaltenbreite davon zu bestimmen? –

0

Statt ein Label zu erstellen, erhalten die tatsächliche Komponente aus dem Table und testen Sie die Größe auf, dass:

// create the component that will be used to render the cell 
Comp prototype = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, "Not Applicable", false, false, 0, i); 

// get the labels preferred sizes 
int preferredWidth = comp.getPreferredSize().getWidth(); 
int preferredHeight = comp.getPreferredSize().getHeight(); 

Dies ist eine einzelne Spalte Beispiel, werden Sie diese brauchen zu wiederholen zu bekommen die Größe für jede Spalte (und auch einstellen). Ein Beispiel hierfür finden Sie unter http://www.exampledepot.com/egs/javax.swing.table/PackCol.html.

+0

bereitgestellt ??? Und wie spiegelt sich die Breite/Höhe einer bestimmten Maximallänge? Ich möchte meine Spalte, die $ 222 enthalten kann.22 "als eine kleinere Breite als die, die" Verschiedene Lebensmitteleinkäufe "enthalten kann. –

+0

Dies ist eine einzelne Spalte Beispiel, müssen Sie dies wiederholen, um die Größe für jede Spalte zu erhalten (und auch einstellen). Siehe http Ein Beispiel hierfür ist: //www.exampledepot.com/egs/javax.swing.table/PackCol.html Die JLabel-Antwort wird das gleiche Problem haben, weil Sie jede Spalte auf die gleiche bevorzugte Breite setzen, – tukushan

3

können Sie versuchen, den folgenden Code:

/** 
* Sets the preferred width of the columns of a table from prototypes 
* @param table the target table 
* @param prototypes an array of prototypes, {@code null} values will be ignored 
* @param setMaxWidth {@code true} if the maximum column width should also be set 
*/ 
public static void setWidthFromPrototype(JTable table, Object[] prototypes, boolean setMaxWidth) { 
if (prototypes.length != table.getColumnCount()) 
    throw new IllegalArgumentException("The prototypes array should contain exactly one element per table column"); 
for (int i = 0; i < prototypes.length; i++) { 
    if (prototypes[i] != null) { 
     Component proto = table.getCellRenderer(0,i) 
       .getTableCellRendererComponent(table, prototypes[i], false, false, 0, i); 
     int prefWidth = (int) proto.getPreferredSize().getWidth() + 1; 
     table.getColumnModel().getColumn(i).setPreferredWidth(prefWidth); 
     if (setMaxWidth) 
      table.getColumnModel().getColumn(i).setMaxWidth(prefWidth); 
    } 
} 
} 
+0

, um sie zu verwenden Rufen Sie einfach setWidthFromPrototype (myTable, neues Objekt [] {"Not Applicable"}) auf; –

+0

upvoted für die Messung der vom Renderer bereitgestellten Komponente - nur der Renderer ist falsch: Sie müssen die Tabelle danach fragen (table.getRenderer (Zeile, Spalte)), sonst werden Sie per-Spalte-Renderer verpassen - bitte bearbeiten für die Perfektion :-) – kleopatra

+0

danke für die Vorschläge @kleopatra, aber ich sehe nicht die 'JTable.getRenderer (int, int)' Methode In allen Fällen ist 'getDefaultRenderer' sicherer als ich t gibt den Renderer zurück, der einem Typ zugeordnet ist. Dies kann nützlich sein, wenn Sie keine vollständige Instanz des Objekts erstellen und beispielsweise nur die Zeichenfolgendarstellung übergeben möchten. –

1

SwingX JXTable/Spalte Unterstützung erweitert Prototypen für die anfängliche Spaltenbreite Dimensionierung eingestellt haben, können Sie dies tun, entweder nachdem die Spalten erstellt wurden

for(int col = 0; ....) { 
    table.getColumnExt(col).setPrototypeValue(myPrototype[col] 
} 

oder indem Sie eine benutzerdefinierte ColumnFactory implementieren, die die Spalten bei der Erstellung konfiguriert

ColumnFactory factory = new ColumnFactory() { 
    @Override 
    protected void configureTableColumn(TableModel model, TableColumnExt columnExt) { 
     super(...); 
     columnExt.setPrototypeValue(myPrototype[columnExt.getModelIndex()]; 
    } 
} 
table.setColumnFactory(factory); 
table.setModel(myModel); 
Verwandte Themen