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);
}
}
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…
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 😀
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?
Gracias Mario por tu comentario! He correjido el problema… Ese era un codigo viejo que no se de donde salio… ahora si debe funcionar 🙂
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);
}
es mas sencillo tu metodo, gracias camarada, me ayudo un buen ese sencillito codigo pero eficas
Rodi muy buen codigo hermano es justo lo que buscaba gracias
Muy bueno he, excelente!!!