Los Layout Managers controlan cómo se organizan los componentes dentro de un contenedor. Swing no usa coordenadas absolutas por defecto —los gestores de diseño adaptan el layout al tamaño de la ventana y al DPI de la pantalla.
BorderLayout
Divide el contenedor en cinco zonas: NORTH, SOUTH, EAST, WEST y CENTER. El layout por defecto de JFrame y JDialog.
JPanel panel = new JPanel(new BorderLayout(5, 5)); // hgap, vgap
panel.add(new JLabel("Norte"), BorderLayout.NORTH);
panel.add(new JLabel("Centro"), BorderLayout.CENTER);
panel.add(new JButton("Sur"), BorderLayout.SOUTH);
panel.add(new JTree(), BorderLayout.WEST);
panel.add(new JTextArea(), BorderLayout.EAST);
FlowLayout
Coloca los componentes en fila, pasando a la siguiente cuando no hay espacio. Layout por defecto de JPanel.
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
panel.add(new JButton("Nuevo"));
panel.add(new JButton("Abrir"));
panel.add(new JButton("Guardar"));
GridLayout
Divide el contenedor en una cuadrícula de celdas del mismo tamaño.
JPanel teclado = new JPanel(new GridLayout(4, 3, 4, 4)); // filas, cols, hgap, vgap
for (int i = 1; i <= 9; i++) {
teclado.add(new JButton(String.valueOf(i)));
}
teclado.add(new JButton("*"));
teclado.add(new JButton("0"));
teclado.add(new JButton("#"));
GridBagLayout
El más flexible y complejo. Permite que los componentes ocupen varias celdas y controla el relleno, anclaje y peso de cada uno.
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(4, 4, 4, 4);
gbc.fill = GridBagConstraints.HORIZONTAL;
// Etiqueta en columna 0, fila 0
gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 0;
panel.add(new JLabel("Nombre:"), gbc);
// Campo de texto en columna 1, fila 0, ocupa 2 columnas
gbc.gridx = 1; gbc.weightx = 1.0; gbc.gridwidth = 2;
panel.add(new JTextField(20), gbc);
BoxLayout
Apila componentes en una sola fila o columna con espaciado controlado.
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JButton("Primero"));
panel.add(Box.createRigidArea(new Dimension(0, 8))); // separación fija
panel.add(new JButton("Segundo"));
panel.add(Box.createVerticalGlue()); // espacio flexible
panel.add(new JButton("Al fondo"));
MigLayout: la alternativa moderna
Si añades la dependencia com.miglayout:miglayout-swing:11.4.2 (Maven), obtienes un gestor de diseño mucho más expresivo:
// Con MigLayout
JPanel panel = new JPanel(new MigLayout("wrap 2, gap 8"));
panel.add(new JLabel("Nombre:"), "right");
panel.add(new JTextField(20), "grow");
panel.add(new JLabel("Email:"), "right");
panel.add(new JTextField(20), "grow");
panel.add(new JButton("Guardar"), "span 2, right");
Combinar layouts
La clave para UIs complejas es anidar paneles (JPanel) con distintos layouts:
JPanel raiz = new JPanel(new BorderLayout());
JPanel barra = new JPanel(new FlowLayout(FlowLayout.LEFT));
barra.add(new JButton("Nuevo")); barra.add(new JButton("Abrir"));
raiz.add(barra, BorderLayout.NORTH);
JPanel formulario = new JPanel(new GridBagLayout());
// ... añadir campos con GridBagConstraints
raiz.add(formulario, BorderLayout.CENTER);
JPanel pie = new JPanel(new FlowLayout(FlowLayout.RIGHT));
pie.add(new JButton("Aceptar")); pie.add(new JButton("Cancelar"));
raiz.add(pie, BorderLayout.SOUTH);
