Le gestionnaire de placement SpringLayout s'appuie sur les bords des composants graphiques afin de les placer au sein d'un panneau de contenu. Il définit des relations entre les bords des composants.

SpringLayout ressort = new SpringLayout();

La classe SpringLayout.Constraints permet de spécifier les contraintes à appliquer à l'objet SpringLayout pour placer des composants graphiques. Cette classe permet de fixer ou de récupérer la valeur de quatre propriétés, les coordonnées (x et y) et la taille (height et width) à appliquer à un composant.

JtextField texte = new JTextField();
SpringLayout.Constraints contraintes = 
                         new SpringLayout.Constraints(texte);
//ou
SpringLayout.Constraints contraintes = 
                         SpringLayout.Constraints getConstraints(texte);

Les méthodes de la classe SpringLayout.Constraints utilise exclusivement des objets Spring pour spécifier ou obttenir les valeurs de contraintes précitées. Cette objet contient trois propriétés qui caractérise son comportement, les valeurs minimum, maximum et préférée. Chacune de ces propriétés peut être impliqué dans la définition de sa quetrième valeur, soit une propriété basée sur une série de règles.

JPanel pan = (JPanel)frame.getContentPane();
SpringLayout gestionnaire = new SpringLayout();
pan.setLayout(gestionnaire);

JButton bouton = new JButton("Bouton");
JTextField texte = new JTextField(20);
pan.add(bouton);
pan.add(texte);

SpringLayout.Constraints contraintesBouton = 
                               gestionnaire.getConstraints(bouton);
contraintesBouton.setX(Spring.constant(8));
contraintesBouton.setY(Spring.constant(8));

SpringLayout.Constraints contraintesTexte = 
                               gestionnaire.getConstraints(textField);
contraintesTexte.setX(
                  Spring.sum(
                          Spring.constant(5), 
                          contraintesBouton.getConstraint(SpringLayout.EAST)));
contraintesTexte.setY(Spring.constant(5));

La classe SpringLayout fournit quatre constantes désignant chacun des bords du composant graphique contraint (EAST, NORTH, SOUTH et WEST). Une constante passée à la méthode getConstraint() indique qu'un objet Spring concernant le bord spécifié doit être retourné.

Un instance de la classe Spring peut être assimilé à un ressort qui est capable de se comprimer ou de s'étirer entre des valeurs minimum et maximum autour de la valeur préférée. A cet effet, plusieurs méthodes de la classe Spring sont disponibles afin de déterminer les valeurs maximum, minimum et préférée, d'effectuer des soustractions et additions entre des objets Spring.

JTextField texte = new JTextField();
Spring ressortTexte = Spring.width(texte);
JButton bouton = new JButton("Bouton");
Spring ressortBouton = Spring.width(bouton);

int max = ressort.getMaximumValue();
int min = ressort.getMinimumValue();
int pref = ressort.getPreferredValue();

Spring resultatAddition = Spring(
                              ressortTexte, 
                              ressortBouton);
Spring resultatSoustraction = Spring(
                              ressortTexte, 
                              Spring.minus(ressortBouton));
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Spring;
import javax.swing.SpringLayout;

public class RessortPlacement extends JFrame {
    public RessortPlacement() {
        super("Démonstration SpringLayout");

        this.creerInterface();

        super.pack();
        super.setVisible(true);
    }
    public void creerInterface() {
        JPanel pan = (JPanel) this.getContentPane();
        JLabel label1 = new JLabel("Premier label");
        JTextField textField1 = new JTextField(20);
        JButton bouton1 = new JButton("Premier bouton");
        JLabel label2 = new JLabel("Second label");
        JTextField textField2 = new JTextField(20);
        JButton bouton2 = new JButton("Second bouton");
        JLabel label3 = new JLabel("Troisième label");
        JTextField textField3 = new JTextField(20);
        JButton bouton3 = new JButton("Troisième bouton");

        SpringLayout ressort = new SpringLayout();
        pan.setLayout(ressort);

        pan.add(label1);
        pan.add(textField1);
        pan.add(bouton1);
        pan.add(label2);
        pan.add(textField2);
        pan.add(bouton2);
        pan.add(label3);
        pan.add(textField3);
        pan.add(bouton3);

        this.creerGrilleCompacte(pan, 3, 3, 5, 5, 5, 5);
    }
    public void creerGrilleCompacte(
                                JPanel panneau, 
                                int lignes, int colonnes,
                                int initialX, int initialY, 
                                int espacementX, int espacementY) {

        SpringLayout gestionnaire = null;
        if (panneau.getLayout() instanceof SpringLayout)
            gestionnaire = (SpringLayout) panneau.getLayout();
        else throw new ClassCastException();

        Spring x = Spring.constant(initialX);
        for (int col = 0; col < colonnes; col++) {
            Spring largeur = Spring.constant(0);
            for (int ligne = 0; ligne < lignes; ligne++) {
                largeur = Spring.max(largeur, getConstraintesComposant(ligne,
                        col, panneau, colonnes).getWidth());
            }
            for (int ligne = 0; ligne < lignes; ligne++) {
                SpringLayout.Constraints contraintes = getConstraintesComposant(
                        ligne, col, panneau, colonnes);
                contraintes.setX(x);
                contraintes.setWidth(largeur);
            }
            x = Spring
                    .sum(x, Spring.sum(largeur, Spring.constant(espacementX)));
        }
        Spring y = Spring.constant(initialY);
        for (int ligne = 0; ligne < lignes; ligne++) {
            Spring hauteur = Spring.constant(0);
            for (int colonne = 0; colonne < colonnes; colonne++) {
                hauteur = Spring.max(hauteur, getConstraintesComposant(ligne,
                        colonne, panneau, colonnes).getHeight());
            }
            for (int c = 0; c < colonnes; c++) {
                SpringLayout.Constraints contraintes = getConstraintesComposant(
                        ligne, c, panneau, colonnes);
                contraintes.setY(y);
                contraintes.setHeight(hauteur);
            }
            y = Spring
                    .sum(y, Spring.sum(hauteur, Spring.constant(espacementY)));
        }
        SpringLayout.Constraints contraintesPanneau = gestionnaire
                .getConstraints(panneau);
        contraintesPanneau.setConstraint(SpringLayout.SOUTH, y);
        contraintesPanneau.setConstraint(SpringLayout.EAST, x);
    }
    private SpringLayout.Constraints getConstraintesComposant(
                                        int ligne,
                                        int colonne,
                                        JPanel parent,
                                        int colonnes) {
        SpringLayout gestionnaire = (SpringLayout) parent.getLayout();
        Component composant = parent.getComponent(
                                         ligne * colonnes + colonne);
        return gestionnaire.getConstraints(composant);
    }
    public static void main(String[] args) {
        RessortPlacement ressort = new RessortPlacement();
    }
}