Personalización

Empleado delegadores de UI para personalizar la apariencia de los componentes

Aprende a utilizar delegadores de UI para personalizar la apariencia de los componentes en Swing, creando una experiencia de usuario única y atractiva.

En esta sección, exploraremos cómo utilizar delegadores de UI para personalizar la apariencia de los componentes en Swing. Los delegadores de UI son una parte fundamental del sistema de renderizado de Swing y te permiten definir cómo se dibujan y se comportan los componentes en tu aplicación. A continuación, se presentan los conceptos clave que debes entender para aprovechar al máximo los delegadores de UI en tu proceso de personalización.

Primero definamos la paleta de colores

Antes de personalizar los delegadores de UI, es importante definir una paleta de colores que se alinee con la identidad visual de tu aplicación. Esto te ayudará a mantener una apariencia coherente en toda la interfaz de usuario. Puedes elegir colores que reflejen la personalidad de tu marca o que simplemente sean agradables a la vista. Por ejemplo, podrías optar por una paleta de colores pastel para una aplicación de bienestar o colores vibrantes para una aplicación de entretenimiento.

Tomemos como ejemplo una paleta de colores que incluye tonos de azul, verde y gris:

public class ColorPalette {
    public static final Color PRIMARY_COLOR = new Color(70, 130, 180); // Azul acero
    public static final Color SECONDARY_COLOR = new Color(60, 179, 113); // Verde mar
    public static final Color BACKGROUND_COLOR = new Color(245, 245, 245); // Gris claro
    public static final Color TEXT_COLOR = new Color(33, 33, 33); // Gris oscuro
}

En este ejemplo, hemos definido una clase ColorPalette que contiene constantes para los colores primarios, secundarios, de fondo y de texto. Puedes utilizar estos colores en tus delegadores de UI para mantener una apariencia consistente en toda tu aplicación.

Recuerda que la elección de colores es crucial para la experiencia del usuario, así que asegúrate de seleccionar colores que sean accesibles y que proporcionen un buen contraste para mejorar la legibilidad.

Personalizando los delegadores de UI

Una vez que hayas definido tu paleta de colores, puedes comenzar a personalizar los delegadores de UI para aplicar estos colores a tus componentes. Para personalizar un delegador de UI, debes crear una clase que extienda la clase base del delegador correspondiente al componente que deseas personalizar. Por ejemplo, si deseas personalizar el botón (JButton), debes crear una clase que extienda BasicButtonUI o MetalButtonUI, dependiendo del Look and Feel que estés utilizando.

import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;

public class CustomButtonUI extends BasicButtonUI {

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        c.setOpaque(false);
        c.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20));
        c.setForeground(ColorPalette.BACKGROUND_COLOR);
        c.setBackground(ColorPalette.PRIMARY_COLOR);
        c.setCursor(new Cursor(Cursor.HAND_CURSOR));
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        AbstractButton button = (AbstractButton) c;
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        if (button.getModel().isPressed()){
            g2d.setColor(ColorPalette.PRIMARY_ACTIVE_COLOR);
        } else if (button.getModel().isRollover()) {
            g2d.setColor(ColorPalette.PRIMARY_HOVER_COLOR);
        } else if (!button.isEnabled()) {
            g2d.setColor(ColorPalette.PRIMARY_DISABLED_COLOR);
        } else {
            g2d.setColor(ColorPalette.PRIMARY_COLOR);
        }
        g2d.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), 20, 20);
        super.paint(g, c);
    }
}

Analicemos el código anterior:

  1. installUI: En este método, configuramos las propiedades del botón, como la opacidad, el borde, el color de fondo y el color del texto utilizando los colores definidos en la paleta de colores. También cambiamos el cursor a una mano para indicar que el botón es interactivo.
    • setOpaque(false): Esto permite que el botón tenga un fondo transparente, lo que es útil para personalizar su apariencia.
    • setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20)): Esto agrega un borde vacío alrededor del botón para aumentar el espacio entre el texto y los bordes del botón, mejorando la apariencia visual.
    • setForeground(ColorPalette.BACKGROUND_COLOR): Esto establece el color del texto del botón utilizando el color de fondo definido en la paleta de colores.
    • setBackground(ColorPalette.PRIMARY_COLOR): Esto establece el color de fondo del botón utilizando el color primario definido en la paleta de colores.
    • setCursor(new Cursor(Cursor.HAND_CURSOR)): Esto cambia el cursor a una mano cuando el usuario pasa el mouse sobre el botón, indicando que es interactivo.
  2. paint: En este método, personalizamos la forma en que se dibuja el botón. Utilizamos Graphics2D para habilitar el antialiasing y mejorar la calidad visual. Cambiamos el color del botón según su estado (presionado, en hover, deshabilitado) utilizando diferentes tonos de la paleta de colores.
    • setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON): Esto habilita el antialiasing para suavizar los bordes del botón y mejorar su apariencia visual.
    • setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON): Esto habilita el antialiasing para el texto del botón, mejorando su legibilidad.
    • g2d.setColor(...): Aquí cambiamos el color del botón según su estado. Puedes definir colores adicionales en tu paleta de colores para los estados activo, hover y deshabilitado.
    • g2d.fillRoundRect(...): Esto dibuja un rectángulo redondeado para el botón, lo que le da una apariencia más moderna y atractiva.
La función fillRoundRect se utiliza para dibujar un rectángulo con bordes redondeados, lo que puede mejorar la apariencia visual de los botones y hacer que se vean más modernos. Puedes ajustar los parámetros de esta función para cambiar el radio de los bordes redondeados según tus preferencias, de la siguiente manera: g2d.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), 20, 20); donde los últimos dos parámetros (20, 20) representan el radio de los bordes redondeados en el eje X e Y respectivamente.

Aplicando el delegador de UI personalizado

Una vez que hayas creado tu delegador de UI personalizado, debes aplicarlo a los componentes de tu aplicación. Puedes hacerlo utilizando el método setUI en el componente que deseas personalizar. Por ejemplo:

JButton myButton = new JButton("Custom Button");
myButton.setUI(new CustomButtonUI());

En este ejemplo, hemos creado un botón y le hemos asignado nuestro CustomButtonUI para que se renderice con la apariencia personalizada que hemos definido.

Conclusión

Los delegadores de UI son una herramienta poderosa para personalizar la apariencia de los componentes en Swing. Al crear tus propios delegadores de UI, puedes lograr una apariencia única y atractiva para tu aplicación, mejorando la experiencia del usuario. En las siguientes secciones, exploraremos cómo personalizar otros aspectos de los componentes utilizando delegadores de UI y cómo integrarlos con otros elementos de personalización, como colores y fuentes. Recuerda que la personalización de delegadores de UI puede requerir un conocimiento profundo de cómo funcionan los componentes en Swing, así que no dudes en experimentar y consultar la documentación oficial para obtener más información sobre cómo personalizar los delegadores de UI de manera efectiva.

Copyright Jesús Aurelio Castro Magaña © 2026