définir une valeur prototype (pour le calcul de largeur automatique) d'une colonne JTable

StackOverflow https://stackoverflow.com/questions/838095

Question

soit cela n'existe pas, soit je ne pense pas / je ne cherche pas correctement parce qu'il est tard ...

Je souhaite définir une largeur de colonne JTable dans Swing en fonction d'une valeur prototype pour la plus grande chaîne que j'espère (ou que je connais) existerait 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 prototype pour la largeur de colonne, comme pour la hauteur de ligne? Si oui, comment?

Était-ce utile?

La solution

Avez-vous essayé de créer un JLabel au moment de l'exécution et d'utiliser sa taille pour redimensionner votre tableau?

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

Autres conseils

Vous pouvez essayer 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);
    }
}
}

SwingX étendu des prototypes de paramètres de prise en charge JXTable / Column pour la taille initiale de la largeur de colonne, vous pouvez le faire après les colonnes ont été créés

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

ou en implémentant une ColumnFactory personnalisée qui configure les colonnes à 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);

Au lieu de créer une étiquette, récupérez le composant réel à partir de TableCellRenderer et testez sa taille:

// 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 unique, vous devrez répéter cette opération pour obtenir la taille de chaque colonne (et la définir également). Voir http://www.exampledepot.com/egs/javax.swing .table / PackCol.html pour un exemple.

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

La hauteur d'une ligne JTable devrait pouvoir être déterminée pour n'importe quelle taille de police (en points) car il s'agit d'un norme définie . Cela peut prendre un peu d’expérience, cependant, étant donné que JTable donne probablement un peu d’espacement entre les cellules.

Si vous ne pouvez garantir ni la taille de la police ni la police elle-même au moment de la compilation, les réponses fournies par d'autres personnes m'intéressent alors:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top