Como limitar max input en un campo de texto (JtextField)

Esta es una forma de limitar el maximo numero de caracteres que pueden ingresar en una caja de texto  (JTextField),  esta misma tecnica se puede aplicar a cualquier componente de swing que permita editar texto, como JTextArea, JTextPane, JEditorPane o mejor dicho toda clase que extienda a javax.swing.JTextComponent.

import java.awt.*;
import javax.swing.text.*;
import javax.swing.*;

public class LimitadorDeDocumento extends DefaultStyledDocument {
int caracteresMaximos;

public LimitadorDeDocumento( int caracteresMaximos ) {
this.caracteresMaximos = caracteresMaximos;
}

public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if ( (getLength() + str.length()) <= caracteresMaximos)
super.insertString(offs, str, a);
else
Toolkit.getDefaultToolkit().beep();
}

public static void main( String [] a ){
// este sera un limitador para 20 caracteres
LimitadorDeDocumento limitador = new LimitadorDeDocumento(20);
JTextField campo = new JTextField();
campo.setDocument(limitador);
// esto es para mostrarlo
JOptionPane.showMessageDialog(null,campo);
System.exit(0);
}

}

8 Responses to Como limitar max input en un campo de texto (JtextField)

  1. Mario dice:

    esto no está del todo bien, en lugar de implements AbstractDocument seria extends PlainDocument.

    Ya que con *extends* AbstractDocument te hace implementar un par de cosas más.

    Igual me sirvió la idea, gracias…

    • g2-76620b25b38add5807f305840a61e422 dice:

      La razon por la que implemento la interface es porque te da la libertad de extender cualquier clase si tu quieres, por ejemplo podrias tener una clase que extienda a JTextField y que implemente esta interface y asi tendrias un JTextField mas completo. Pero esta valido tu consejo si alguno quiere seguirlo 😀

  2. Mario dice:

    El punto es que no existe esa interfaz al menos en mi JDK! :-O

    Deberias extender AbstractDocument, pero como digo en mi post anterior, te hace implementar un par de cosas mas.

    El punto es: implements AbstractDocument no es válido o me estoy perdiendo algo, que tambien puede ser… a vos te compila ese código?

  3. g2-76620b25b38add5807f305840a61e422 dice:

    Gracias Mario por tu comentario! He correjido el problema… Ese era un codigo viejo que no se de donde salio… ahora si debe funcionar 🙂

  4. Rodi dice:

    yo lo hice de la siguiente forma, utilice esta código dentro de un evento del tipo keypressed, en mi caso seria, txtuserKeyPressed, donde txtuser es mi jtextfield

    if (txtuser.getText().length()==10){
    txtuser.setEditable(false);
    }
    if (evt.getKeyCode() == evt.VK_BACK_SPACE){
    if (txtuser.getText().length()==10){
    txtuser.setEditable(true);
    }

  5. leo117 dice:

    Rodi muy buen codigo hermano es justo lo que buscaba gracias

Replica a g2-76620b25b38add5807f305840a61e422 Cancelar la respuesta