Ejemplos

Ejemplo 02: Diferencias de validar un JTextField y un JFormattedTextField

En este ejemplo, compararemos la validación de un `JTextField` con la validación de un `JFormattedTextField` utilizando una máscara de formato.

En este ejemplo, compararemos la validación de un JTextField con la validación de un JFormattedTextField.

En primera instancia debemos comprender que un JTextField es un componente de texto simple que no tiene una validación incorporada, mientras que un JFormattedTextField es un componente de texto que permite aplicar una máscara de formato para validar la entrada del usuario u otro formateador personalizado.

Validación con JTextField

Para validar un JTextField, podemos usar la función setInputVerifier para establecer un verificador de entrada personalizado. Aquí hay un ejemplo de cómo validar que el texto ingresado en un JTextField sea un número entero:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JTextFieldValidationExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Validación con JTextField");
        JTextField textField = new JTextField(20);
        JButton validateButton = new JButton("Validar");

        // Establecer un InputVerifier para validar la entrada
        textField.setInputVerifier(new InputVerifier() {
            @Override
            public boolean verify(JComponent input) {
                String text = ((JTextField) input).getText();
                try {
                    Integer.parseInt(text); // Intentar convertir a entero
                    return true; // Validación exitosa
                } catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(frame, "Por favor, ingresa un número entero.");
                    return false; // Validación fallida
                }
            }
        });

        validateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (textField.getInputVerifier().verify(textField)) {
                    JOptionPane.showMessageDialog(frame, "¡Entrada válida!");
                }
            }
        });

        frame.setLayout(new FlowLayout());
        frame.add(textField);
        frame.add(validateButton);
        frame.setSize(300, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

En este caso podemos notar que creamos una clase anónima que extiende de InputVerifier para validar la entrada del JTextField. Si el texto ingresado no es un número entero, se muestra un mensaje de error. Si la validación es exitosa, se muestra un mensaje de confirmación.

Aunque, debemos tener en cuenta que esta validación se realiza cada vez que el campo pierde el foco, lo que puede no ser ideal para todos los casos de uso. Además, el componente InputVerifier no proporciona una forma de formatear la entrada, lo que puede ser una limitación en algunos casos.

Validación con JFormattedTextField

Para validar un JFormattedTextField, podemos usar una máscara de formato para restringir la entrada del usuario. Por ejemplo, si queremos que el usuario ingrese una fecha en el formato "dd/MM/yyyy", podemos hacer lo siguiente:

import javax.swing.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JFormattedTextFieldValidationExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Validación con JFormattedTextField");
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        JFormattedTextField formattedTextField = new JFormattedTextField(dateFormat);
        formattedTextField.setColumns(20);
        JButton validateButton = new JButton("Validar");

        validateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    dateFormat.parse(formattedTextField.getText()); // Intentar parsear la fecha
                    JOptionPane.showMessageDialog(frame, "¡Entrada válida!");
                } catch (ParseException ex) {
                    JOptionPane.showMessageDialog(frame, "Por favor, ingresa una fecha en el formato dd/MM/yyyy.");
                }
            }
        });

        frame.setLayout(new FlowLayout());
        frame.add(formattedTextField);
        frame.add(validateButton);
        frame.setSize(300, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
Copyright Jesús Aurelio Castro Magaña © 2026