Question

private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f };

setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

for (int i = 0; i < cwidth.length; i++) {
            getColumnModel().getColumn(i).setPreferredWidth((int) (getPreferredScrollableViewportSize().width * cwidth[i]));
        }

J'ai le problème suivant:

J'ai une JTABLE avec 5 colonnes.Le premier est un numéro à 3 chiffres, la seconde une chaîne, puis une barre JProgress, une autre chaîne et un bouton.

Maintenant, je veux qu'ils aient une largeur en fonction de la taille de la table.Au-dessus, vous pouvez voir ma tentative réelle, mais cela ne fonctionne pas.

J'ai déjà fouillé sur le Web, mais tout ce que j'ai trouvé n'a pas aidé, car il était toujours de régler la taille à une taille non dynamique.

J'espère que vous pourrez m'aider.

Merci pour l'aide.J'aime ce côté !!

Ici ma solution:

for (int i = 0; i < cwidth.length; i++) {
            getColumnModel().getColumn(i).setPreferredWidth((int) (600 * cwidth[i]));
            getColumnModel().getColumn(i).setMinWidth((int) (100 * cwidth[i]));
            getColumnModel().getColumn(i).setMaxWidth((int) (1000 * cwidth[i]));
        }

Était-ce utile?

La solution

Ce n'est pas trivial d'interférer avec une disposition de colonne interne d'une table (fondamentalement, il s'agit de son propre licageManager avec les colonnes comme "enfants"). Du côté lumineux: le comportement par défaut n'est pas si mal, il a déjà un mode de redimensionnement raisonnable. Le resizeall par défaut fait probablement ce que vous voulez avec juste une petite configuration nécessaire - ce qui n'est pas trop intuitif: -)

Pour commencer, lisez l'API DOC de JTable.Dolayout () - Il décrit le comportement exact. Le point le plus important est de comprendre comment la largeur excessive est distribuée sur des colonnes:

deltaI = (excess) * ((maxI - prefI) / (maxAll - prefAll)) 

(avec postfix, je désigne la colonne individuelle et toute la somme des valeurs individuelles, respectivement), qui correspond à la différence individuelle de max / préf à la somme de Max / Pref. On dirait une décision raisonnable, juste ... avec défaut Max étant entier.max, ce facteur est à peu près la même chose pour toutes les colonnes, quelle que soit leur préfwidht. C'est fondamentalement, pourquoi le redimensionnement semble tellement intuitif et pourquoi vous devez ajuster le maxsize (comme @Lajos ARPAD a déjà signalé :-) Pour obtenir un comportement raisonnable de redimensionnement par défaut.

Donc au lieu d'essayer de faire-vous-vous-même (ce qui n'est pas une bonne idée, comme toujours avec layoutManagers), configurez les propriétés de la colonne au besoin:

// start out with a reasonable pref size, f.i. from a prototype or 
// measuring the actual cell content (both supported by JXTable)
forEachColumn
    column.setPreferredWidth(....);

// then configure the maxWidth proportionally 
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f };
forEachColumn
    int max = ((int) (1000f * cwidth[columnExt.getModelIndex()]));
    columnExt.setMaxWidth(max);

Notez que le 1000 est un numéro magique arbitraire, vous voulez probablement jouer un peu avec celui-ci, cela dépend de la résolution d'écran et de l'attente de l'utilisateur

Autres conseils

Si la largeur préférée est inférieure à la largeur minimale ou plus grande que la largeur maximale, votre colonne ne sera pas redimensionnée par la largeur préférée.Vous devez également contrôler la largeur minimale et la largeur maximale pour garantir que votre largeur préférée est entre elles.

De plus, par défaut, les colonnes sont automatiquement redimensionnées par la variation de la taille de la table, vous devez également vérifier le mode de redimensionnement automatique.

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