Swing y JFC: guía completa para interfaces gráficas en Java 21

El Look and Feel (L&F) controla la apariencia completa de los componentes Swing: colores, fuentes, bordes, sombras y animaciones. Cambiarlo es tan sencillo como una línea de código.

L&F incluidos en el JDK

// Metal (por defecto)
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

// Nimbus (más moderno, incluido desde Java 6u10)
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");

// Sistema nativo
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

// Aplicar SIEMPRE antes de crear componentes
SwingUtilities.invokeLater(() -> {
    try {
        UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (Exception e) {
        e.printStackTrace();
    }
    new MiAplicacion().setVisible(true);
});

FlatLaf: el L&F moderno recomendado en 2026

FlatLaf (de FormDev) es el Look and Feel más popular en 2026 para aplicaciones Swing profesionales. Proporciona un diseño plano y limpio, soporte para modo claro/oscuro, HiDPI, y es compatible con Java 11+. Lo usan IntelliJ IDEA, DataGrip y otros IDEs de JetBrains.

// Dependencia Maven
// <dependency>
//   <groupId>com.formdev</groupId>
//   <artifactId>flatlaf</artifactId>
//   <version>3.5.1</version>
// </dependency>

import com.formdev.flatlaf.FlatLightLaf;
import com.formdev.flatlaf.FlatDarkLaf;
import com.formdev.flatlaf.FlatIntelliJLaf;
import com.formdev.flatlaf.FlatDarculaLaf;

SwingUtilities.invokeLater(() -> {
    FlatLightLaf.setup();  // Tema claro
    // FlatDarkLaf.setup(); // Tema oscuro
    // FlatIntelliJLaf.setup();
    // FlatDarculaLaf.setup();

    new MiAplicacion().setVisible(true);
});

Personalizar FlatLaf con propiedades

FlatLightLaf.setup();

// Personalizar colores de acento
UIManager.put("Component.accentColor", new Color(0, 120, 215));

// Fuente global
UIManager.put("defaultFont", new Font("Segoe UI", Font.PLAIN, 14));

// Esquinas redondeadas
UIManager.put("Button.arc", 8);
UIManager.put("Component.arc", 6);
UIManager.put("TextComponent.arc", 6);

Cambio de tema en tiempo de ejecución

JButton cambiarTema = new JButton("Modo oscuro");
cambiarTema.addActionListener(e -> {
    try {
        UIManager.setLookAndFeel(new FlatDarkLaf());
        SwingUtilities.updateComponentTreeUI(frame);
        frame.pack();
    } catch (UnsupportedLookAndFeelException ex) {
        ex.printStackTrace();
    }
});

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP