Limitando o número de caracteres em um JTextField

Eu quero definir o comprimento máximo de um JTextField , de modo que você não pode inserir mais caracteres do que o limite. Este é o código que tenho até agora …

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

Existe alguma maneira simples de colocar um limite no número de caracteres?

Você pode fazer algo assim (tirado daqui ):

 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: dê uma olhada nesta postagem anterior. Você pode interceptar events de pressionamento de teclas e adicioná-los / ignorá-los de acordo com a quantidade atual de caracteres no campo de texto.

Desde a introdução do DocumentFilter no Java 1.4, a necessidade de replace o Document foi resolvida.

DocumentFilter fornece os meios para filtrar o conteúdo que foi passado para o Document antes de realmente alcançá-lo.

Isso permite que o campo continue a manter o documento que precisa, enquanto fornece os meios para filtrar a input do usuário.

 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); } } } } 

É estranho que o kit de ferramentas Swing não inclua essa funcionalidade, mas aqui está a melhor resposta para sua pergunta:

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

Eu uso isso em um divertido exemplo de jogo de adivinhação no meu curso da Udemy.com “Learn Java Like a Kid”. Felicidades – Bryson

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

Eu tomei um jtextfield cujo nome é jTextField1, o código está em seu evento key pressed. Eu testei e funciona. E estou usando o 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(); } } }); } 

Aqui está uma versão otimizada da resposta do 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 adicionar um limite ao seu JTextComponent , basta escrever a seguinte linha de código:

 JTextFieldLimit.addTo(myTextField, myMaximumLength);