2009-05-08 6 views
4

soit cela n'existe pas, ou je ne pense pas/recherche correctement parce qu'il est tard ...réglage d'une valeur de prototype (pour le calcul automatique de la largeur) d'une colonne JTable

Je veux mettre un JTable largeur de colonne dans Swing en fonction d'une valeur de prototype pour la plus grande chaîne que j'attends (ou que je sais) exister dans une colonne particulière. Je ne connais pas le nombre de pixels car je ne connais pas nécessairement la police au moment de la compilation.

Existe-t-il un moyen de définir une valeur de prototype à des fins de largeur de colonne, comme cela est le cas pour la hauteur de ligne? Si c'est le cas, comment?

Répondre

1

Avez-vous essayé de créer un JLabel au moment de l'exécution et en utilisant sa taille pour redimensionner votre table?

// 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, c'est intelligent. Est-ce que je peux être sûr que les entrées de la colonne JLabel et de la table utilisent la même police? –

+0

Cela dépend probablement de la police utilisée par TableCellRenderer. Si vous aviez accès aux moteurs de rendu, et qu'ils étaient également des JLabel, vous pouvez créer votre prototype d'étiquette en utilisant la même police avec: JLabel prototypeLabel = new JLabel ("Not Applicable"); prototypeLabel.setFont (cellRenderer.getFont()) – Andrew

+1

-1 n'est pas une bonne idée d'utiliser un composant arbitraire pour mesurer la taille. Au lieu de cela, utilisez le composant de rendu tel que fourni par la table – kleopatra

-1

Si vous ne connaissez pas la police à la compilation, la largeur de toute colonne JTable sera toujours inconnue. Pour vérifier la cohérence, ouvrez un document texte et jouez avec différentes polices tout en gardant la taille du point constante. La longueur de ce qui est écrit varie d'une police à l'autre, mais pas la hauteur.

La hauteur d'une ligne JTable doit pouvoir être déterminée pour toute taille de police (en points) car il s'agit d'un defined standard. Cela peut cependant prendre un peu d'expérimentation, étant donné que JTable donne probablement un peu d'espace entre les cellules.

Si vous ne pouvez pas garantir ni la taille de la police, ni la police elle-même au moment de la compilation alors je suis intéressé par les réponses que d'autres personnes viennent avec :)

+0

"la largeur de toute colonne JTable sera toujours inconnue." ??? J'ai un exemple de texte, par ex. "Non applicable" que je souhaite utiliser comme largeur de colonne maximale. Sûrement à l'exécution, quand la police est connue, il est possible de déterminer la largeur de la colonne de cela? –

0

Au lieu de créer une étiquette, obtenir la composante réelle de la TableCellRenderer et tester la taille sur ce point:

// 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(); 

Ceci est un exemple de colonne, vous devrez répéter pour obtenir la taille de chaque colonne (et aussi le définir). Voir http://www.exampledepot.com/egs/javax.swing.table/PackCol.html pour un exemple de ceci.

+0

??? Et comment cela reflète la largeur/hauteur d'une chaîne de longueur maximale particulière? Je veux ma colonne qui peut contenir "222 $.22" d'être une plus petite largeur que celle qui peut contenir des « achats d'épicerie divers ». –

+0

Ceci est un exemple de colonne, vous devrez répéter pour obtenir la taille de chaque colonne (et définir également). Voir http :. //www.exampledepot.com/egs/javax.swing.table/PackCol.html pour un exemple la réponse JLabel aura le même problème parce que vous définissez chaque colonne à la même largeur préférée – tukushan

3

Vous pouvez le code suivant:

/** 
* 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

à l'utiliser. , il suffit d'appeler setWidthFromPrototype (myTable, new Object [] { « Sans objet »}); –

+0

upvoted pour mesurer la composante fournie par le moteur de rendu - tout simplement obtenir le moteur de rendu est mauvais: vous devez demander la table pour elle (table.getRenderer (ligne, colonne)), sinon, vous risquez de manquer équarrisseurs par colonne - s'il vous plaît modifier la perfection :-) – kleopatra

+0

Merci pour les suggestions @kleopatra, mais je ne vois pas la 'JTable.getRenderer (int, int)' méthode Dans tous les cas, je pense que 'getDefaultRenderer' est plus sûr t renvoie le moteur de rendu associé à un type, ce qui peut être utile si vous ne voulez pas créer une instance complète de l'objet, et par exemple simplement passer sa représentation sous forme de chaîne. –

1

SwingX prise en charge étendue JXTable/colonne réglage des prototypes pour le dimensionnement de la largeur initiale de la colonne, vous pouvez le faire soit après les colonnes ont été créées

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

ou en implémentant une ColumnFactory personnalisée qui configure les colonnes lors de la création

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