JFrame es el contenedor principal de cualquier aplicación Swing. Hereda de Frame (AWT) y añade soporte para el sistema de capas de Swing.
Estructura interna de JFrame
El JFrame contiene un JRootPane, que a su vez tiene:
- ContentPane: el área donde añades tus componentes (
frame.getContentPane()o simplementeframe.add()). - GlassPane: capa transparente sobre todo, útil para interceptar eventos.
- LayeredPane: gestiona las capas (menús desplegables, tooltips, etc.).
- JMenuBar: la barra de menús, que se añade con
frame.setJMenuBar().
Configuración esencial de JFrame
JFrame frame = new JFrame("Título de la ventana");
// Comportamiento al cerrar la ventana
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Opciones: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, DISPOSE_ON_CLOSE, EXIT_ON_CLOSE
// Tamaño fijo
frame.setSize(800, 600);
// O ajuste automático al contenido
frame.pack();
// Centrar en pantalla
frame.setLocationRelativeTo(null);
// Icono de la aplicación
frame.setIconImage(new ImageIcon("icono.png").getImage());
// Mostrar la ventana
frame.setVisible(true);
Patrón recomendado: extender JFrame
import javax.swing.*;
import java.awt.*;
public class VentanaPrincipal extends JFrame {
public VentanaPrincipal() {
super("Mi Aplicación");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
initComponents();
}
private void initComponents() {
// Paneles y componentes se añaden aquí
JPanel panel = new JPanel(new BorderLayout());
JLabel titulo = new JLabel("Bienvenido", SwingConstants.CENTER);
titulo.setFont(new Font("SansSerif", Font.BOLD, 24));
panel.add(titulo, BorderLayout.NORTH);
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new VentanaPrincipal().setVisible(true));
}
}
JDialog: ventanas secundarias
JDialog es el componente para ventanas secundarias. Puede ser modal (bloquea la ventana padre hasta que se cierra) o no modal:
// Diálogo modal JDialog dialogo = new JDialog(frame, "Configuración", true); dialogo.setSize(400, 300); dialogo.setLocationRelativeTo(frame); dialogo.setVisible(true); // Diálogos predefinidos con JOptionPane JOptionPane.showMessageDialog(frame, "Operación completada"); int respuesta = JOptionPane.showConfirmDialog(frame, "¿Deseas continuar?"); String texto = JOptionPane.showInputDialog(frame, "Introduce tu nombre:");
