Limitar el número de caracteres en un JTextField

Quiero establecer la longitud máxima de un JTextField , para que no pueda ingresar más caracteres que el límite. Este es el código que tengo hasta ahora …

  textField = new JTextField(); textField.setBounds(40, 39, 105, 20); contentPane.add(textField); textField.setColumns(10); 

¿Hay alguna manera simple de poner un límite en la cantidad de caracteres?

Puedes hacer algo como esto (tomado de aquí ):

 import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; class JTextFieldLimit extends PlainDocument { private int limit; JTextFieldLimit(int limit) { super(); this.limit = limit; } JTextFieldLimit(int limit, boolean upper) { super(); this.limit = limit; } public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { if (str == null) return; if ((getLength() + str.length()) < = limit) { super.insertString(offset, str, attr); } } } public class Main extends JFrame { JTextField textfield1; JLabel label1; public void init() { setLayout(new FlowLayout()); label1 = new JLabel("max 10 chars"); textfield1 = new JTextField(15); add(label1); add(textfield1); textfield1.setDocument(new JTextFieldLimit(10)); setSize(300,300); setVisible(true); } } 

Editar: Eche un vistazo a esta publicación SO anterior. Podría interceptar eventos de pulsación de tecla y agregarlos / ignorarlos según la cantidad actual de caracteres en el campo de texto.

Desde la introducción del DocumentFilter en Java 1.4, se ha aprendido la necesidad de reemplazar el Document .

DocumentFilter proporciona los medios para filtrar el contenido que se ha pasado al Document antes de que realmente llegue a él.

Esto permite que el campo continúe manteniendo el documento que necesite, al tiempo que proporciona los medios para filtrar la información del usuario.

 import java.awt.EventQueue; import java.awt.GridBagLayout; import javax.swing.JFrame; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; public class LimitTextField { public static void main(String[] args) { new LimitTextField(); } public LimitTextField() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JTextField pfPassword = new JTextField(20); ((AbstractDocument)pfPassword.getDocument()).setDocumentFilter(new LimitDocumentFilter(15)); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridBagLayout()); frame.add(pfPassword); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class LimitDocumentFilter extends DocumentFilter { private int limit; public LimitDocumentFilter(int limit) { if (limit < = 0) { throw new IllegalArgumentException("Limit can not be <= 0"); } this.limit = limit; } @Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { int currentLength = fb.getDocument().getLength(); int overLimit = (currentLength + text.length()) - limit - length; if (overLimit > 0) { text = text.substring(0, text.length() - overLimit); } if (text.length() > 0) { super.replace(fb, offset, length, text, attrs); } } } } 

Es extraño que el kit de herramientas Swing no incluya esta funcionalidad, pero esta es la mejor respuesta a su pregunta:

  textField = new JTextField(); textField.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { if (txtGuess.getText().length() >= 3 ) // limit to 3 characters e.consume(); } }); 

Utilizo esto en un divertido juego de adivinanzas en mi curso de Udemy.com “Aprender Java como un niño”. Saludos – Bryson

 private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { if(jTextField1.getText().length()>=5) { jTextField1.setText(jTextField1.getText().substring(0, 4)); } } 

He tomado un jtextfield cuyo nombre es jTextField1, el código está en su evento clave presionada. Lo he probado y funciona. Y estoy usando el NetBeans IDE.

 private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) { if (jTextField1.getText().length()>=3) { getToolkit().beep(); evt.consume(); } } 
 public void Letters(JTextField a) { a.addKeyListener(new KeyAdapter() { @Override public void keyTyped(java.awt.event.KeyEvent e) { char c = e.getKeyChar(); if (Character.isDigit(c)) { e.consume(); } if (Character.isLetter(c)) { e.setKeyChar(Character.toUpperCase(c)); } } }); } public void Numbers(JTextField a) { a.addKeyListener(new KeyAdapter() { @Override public void keyTyped(java.awt.event.KeyEvent e) { char c = e.getKeyChar(); if (!Character.isDigit(c)) { e.consume(); } } }); } public void Caracters(final JTextField a, final int lim) { a.addKeyListener(new KeyAdapter() { @Override public void keyTyped(java.awt.event.KeyEvent ke) { if (a.getText().length() == lim) { ke.consume(); } } }); } 

Aquí hay una versión optimizada de la respuesta de npinti :

 import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.JTextComponent; import javax.swing.text.PlainDocument; import java.awt.*; public class TextComponentLimit extends PlainDocument { private int charactersLimit; private TextComponentLimit(int charactersLimit) { this.charactersLimit = charactersLimit; } @Override public void insertString(int offset, String input, AttributeSet attributeSet) throws BadLocationException { if (isAllowed(input)) { super.insertString(offset, input, attributeSet); } else { Toolkit.getDefaultToolkit().beep(); } } private boolean isAllowed(String string) { return (getLength() + string.length()) < = charactersLimit; } public static void addTo(JTextComponent textComponent, int charactersLimit) { TextComponentLimit textFieldLimit = new TextComponentLimit(charactersLimit); textComponent.setDocument(textFieldLimit); } } 

Para agregar un límite a su JTextComponent , simplemente escriba la siguiente línea de código:

 JTextFieldLimit.addTo(myTextField, myMaximumLength);