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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
package layout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
class WrapFlowLayout extends FlowLayout {
/* serialVersionUID */
/* 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);*/
return new Dimension(0,0);
}
/**
* 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;
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
JPanel p = new JPanel();
p.setLayout(new WrapFlowLayout());
for (int i = 0; i<25;i++) {
p.add(new JButton("a"));
}
JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
JSplitPane sp3 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
sp3.setRightComponent(new JPanel());
sp3.setLeftComponent(new JScrollPane(p));
sp2.setRightComponent(sp3);
sp2.setLeftComponent(new JPanel());
sp1.setTopComponent(sp2);
sp1.setBottomComponent(new JPanel());
f.add(sp1);
f.setSize(1024,768);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);
}
} |
Partager