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();
}
});
