Los administradores de esquemas o diseño ofrecen una gran serie de ventajas,  ya que permite colocar los componentes de manera facil siempre que conozca el funcionamiento de los administradores de diseño. Sin embargo, el administrador por defecto en una ventana (JFrame) es BorderLayout y para el JPanel el administrador de esquema usado es FlowLayout.

El metodo usado setLayout(): permite establecer el administrador de diseño, recibe por parametro un objeto de tipo LayoutManager (es una interfaz), los administradores de diseño implementan LayoutManager por este motivo es posible pasar por parametro al metodo. Si pasas por parametro null se indica que no tendra ningún administrador de diseño y todos los componentes agregados se hacen de forma absoluta es decir un valor de posición fijo X y Y.

FlowLayout

Este es uno de ls administradores de esquema mas simple, pues todos los componentes agregados al JPanel que establezca este comportamiento se agregan de izquierda a derecha y cuando los componentes llegan al limite de la ventana los componentes pasan a una segunda linea ordenando de la misma forma.

Ademas permite alinear los componentes al centro, izquierda o derecha.

El código para crear la ventana de la imagen anterior es el siguiente:

class ProbandoEsquemas extends JPanel {

    private JButton[] botones;

    public ProbandoEsquemas() {
        addComponentes();
    }

    public final void addComponentes() {
        /*No hace falta decir que usara FlowLayout, JPanel lo usa por defecto*/
        setLayout(new FlowLayout());
        botones = new JButton[10];
        for (int i = 0; i<10; i++) {
            botones[i] = new JButton("Boton " + i);
            add(botones[i]);
        }
    }

}

BorderLayout

Este administrador de esquemas ofrece 5 regiones donde poner los componentes y estos se adaptan al tamaño de las regiones. Sin embargo, como comentaba anteriormente es posible agregar un JPanel dentro de otro y en cada region usted sera capaz de agregar un Panel de tipo FlowLayout o GridLayout, puede quedar mas claro el funcionamiento con la siguiente imagen:

El código creado es:

class ProbandoEsquemas extends JPanel {

    public ProbandoEsquemas() {
        addComponentes();
    }

    public final void addComponentes() {
        setLayout(new BorderLayout());
        JButton botonNorte = new JButton("Norte");
        JButton botonSur = new JButton("Sur");
        JButton botonEste = new JButton("Este");
        JButton botonOeste = new JButton("Oeste");
        JButton botonCentro = new JButton("Centro");
        add(botonNorte, BorderLayout.NORTH);
        add(botonSur, BorderLayout.SOUTH);
        add(botonEste, BorderLayout.EAST);
        add(botonOeste, BorderLayout.WEST);
        add(botonCentro, BorderLayout.CENTER);
    }

}

Existe una diferencia entre FlowLayout al agregar elementos, en BorderLayout debemos especificar la posición donde agregar nuestro componente:

add(botonSur, BorderLayout.SOUTH);

Como podrás observar al metodo add() se le pasa un segundo parametro indicando la posición del componente.

Algo importante que no he mencionado, todos los componentes creados ya sea un boton, panel, entre otros (cualquier componente) debe ser agregado al panel (JPanel) mediante el metodo mencionado anteriormente.

GridLayout

Hasta ahora hemos visto FlowLayout, BorderLayout y en breve GridLayout, todos estos administradores de diseño tienen una sobre carga de constructores. Pero en la mayoría de los casos GridLayout(numeroFilas, numeroColumnas) recibe por parametro el numero de filas y columnas creando una especie de tabla o matriz (como gustes verlo).

Los componentes se agregan de acuerdo al orden de filas, los componentes se colocan en la primer fila de izquierda a derecha cubriendo el numero de columnas y al terminar la fila se pasa con la siguiente realizando el mismo procedimiento. La siguiente imagen te ayuda a comprender lo explicado:

El código para utilizar GridLayout es:

class ProbandoEsquemas extends JPanel {

    private JButton[] botones;

    public ProbandoEsquemas() {
        addComponentes();
    }

    public final void addComponentes() {
        setLayout(new GridLayout(2, 5));
        botones = new JButton[10];
        for (int i = 0; i<10; i++) {
            botones[i] = new JButton(i + "");
            add(botones[i]);
        }
    }

}

Finalmente usted podrá poner a prueba todos estos JPanel utilizando una ventana:

public class AdministradoresDeDiseño {

    public static void main(String[] args) {
        JFrame f = new JFrame("Administrador de Esquemas");
        f.setBounds(300, 200, 400, 300);
        f.add(new ProbandoEsquemas());
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}