Cambiar color borde de JTextField cuando pierde el foco | Java

En esta ocasión hemos creado un JTextField común para todo un proyecto y que tiene configuraciones específicas como el tipo de letra, y un borde que cambia de color cada vez que pierde o gana el foco, es decir hacemos uso de los métodos focusGained y focusLost.
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

import java.awt.SystemColor;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.Font;

public class TextField extends JTextField {

    private static final long serialVersionUID = 1L;

    private boolean required;
    private boolean upperCase;

    private Border requiredBorder;

    public TextField() {
        this.required = false;
        this.upperCase = true;
        initComponents();
    }

    public TextField(boolean required) {
        this.required = required;
        this.upperCase = true;
        initComponents();
    }

    public TextField(boolean required, boolean upperCase) {
        this.required = required;
        this.upperCase = upperCase;
        initComponents();
    }

    private void initComponents() {
        LineBorder lineBorder = new LineBorder(SystemColor.textHighlight);
        Border defaultBorder = UIManager.getBorder("TextField.border");

        requiredBorder = new LineBorder(SystemColor.red);

        setFont(new Font("Segoe UI", Font.PLAIN, 15));

        addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent event) {
                setBorder(lineBorder);
            }

            @Override
            public void focusLost(FocusEvent event) {
                if (upperCase)
                    setText(getText().trim().toUpperCase());
                setBorder(defaultBorder);
                if (required && getText().trim().isEmpty())
                    setBorder(requiredBorder);
            }
        });
    }

    public void setRequired(boolean b) {
        this.required = b;
    }
}
Como primer paso hemos declarado variables necesarias globales para usar en la clase, después mostramos 3 constructores que permiten establecer si son requeridos los campos y si cada vez que se pierde el foco automáticamente se pone en mayúsculas todo.

Después de eso tenemos un método que inicia los componentes, es decir la construcción del JTextField, inicializamos los bordes que necesitamos, el tipo de letra que usaremos en nuestro proyecto, finalmente añadimos un listener para ejecutar cierto código cuando se gana o pierde el foco, dependiendo si el campo es requerido entonces si esta vacío mandamos un borde rojo y además hacemos que la letra se ponga en mayúscula.

Comentarios

Entradas populares