1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| /**
* FlowLayout dont la largeur s'adapte selon la largeur du conteneur parent.
* Cela permet de ne pas afficher la scrollbar horizontal lorsqu'il est placé
* dans une JScrollPane...
*
* @author adiGuba
*/
class WrapFlowLayout extends FlowLayout {
/* serialVersionUID */
private static final long serialVersionUID = 1L;
@Override
public Dimension preferredLayoutSize(Container target) {
final Container parent = target.getParent();
if (parent != null) {
final int width = parent.getWidth();
return new Dimension(width, calculateHeight(target, width));
}
return super.preferredLayoutSize(target);
}
@Override
public Dimension minimumLayoutSize(Container target) {
final Container parent = target.getParent();
if (parent != null) {
final int width = parent.getWidth();
return new Dimension(width, calculateHeight(target, width));
}
return super.minimumLayoutSize(target);
}
/**
* Calcule la hauteur du layout avec une largeur fixe
*/
public int calculateHeight(Container target, int width) {
Insets insets = target.getInsets();
final int vgap = getVgap();
final int hgap = getHgap();
// On calcule la taille du contenu :
final int innerWidth = Math.max(0, width - (insets.left + insets.right + hgap * 2));
// On initialise la taille avec les marges
int height = insets.top + insets.bottom + vgap;
synchronized (target.getTreeLock()) {
Dimension dim = new Dimension(0, 0);
boolean firstVisibleComponent = true;
final boolean useBaseline = getAlignOnBaseline();
int maxAscent = 0;
int maxDescent = 0;
final int nmembers = target.getComponentCount();
for (int i = 0; i < nmembers; i++) {
Component m = target.getComponent(i);
if (m.isVisible()) {
Dimension d = m.getPreferredSize();
if (firstVisibleComponent) {
// Si on est sur le premier composant, on doit l'ajouter :
dim.width = d.width;
dim.height = d.height;
firstVisibleComponent = false;
} else if ((dim.width + hgap + d.width) <= innerWidth) {
// Si on peut ajouter un composant sur la ligne, on le fait
dim.width += hgap + d.width;
dim.height = Math.max(dim.height, d.height);
} else {
// On ne peut plus ajouter de composants, on fait une nouvelle ligne
if (useBaseline) {
dim.height = Math.max(maxAscent + maxDescent, dim.height);
}
height += dim.height + vgap;
// Et on "met" le composant sur la nouvelle ligne
dim.width = d.width;
dim.height = d.height;
maxAscent = 0;
maxDescent = 0;
}
if (useBaseline) {
int baseline = m.getBaseline(d.width, d.height);
if (baseline >= 0) {
maxAscent = Math.max(maxAscent, baseline);
maxDescent = Math.max(maxDescent, d.height - baseline);
}
}
}
}
if (dim.height!=0) {
if (useBaseline) {
dim.height = Math.max(maxAscent + maxDescent, dim.height);
}
height += dim.height + vgap;
}
return height;
}
}
} |
Partager