Come limitare il JTextField al numero di caratteri dell’asse

Devo limitare il numero di caratteri in JTextField. Ho usato il seguente codice per farlo, ma il problema è che sto alimentando i dati su JTextField usando la tastiera virtuale. Quindi l’offset è impostato su 0 per tutto il tempo. Quando inserisco più del numero specificato di caratteri, reimposta il campo e inizia a farlo dall’inizio. Per esempio se il mio limite è di 3 caratteri e sto inserendo xyz0 mia casella di testo limitata legge il carattere fino a z e poi cancella il campo e ricomincia. Quindi rimango con 0 sul campo. Il codice è il seguente.

  public class JTextFieldLimit extends PlainDocument { private int limit; public JTextFieldLimit(int limit) { super(); this.limit = limit; } @Override public void insertString( int offset, String str, AttributeSet attr ) throws BadLocationException { if (str == null) return; System.out.println("from document helper getLength():"+getLength()); System.out.println("from document helper str.length():"+str.length()); System.out.println("from document helper str:"+str); System.out.println("from document helper attr:"+attr); System.out.println("from document helper offset:"+offset); if ((getLength() + str.length()) <= limit) { super.insertString(offset, str, attr); } } } 

Dovresti usare un DocumentFilter come da questo tutorial . Per esempio:

 import javax.swing.*; import javax.swing.text.*; public class JTextFieldLimit2 extends JPanel{ JTextField textfield = new JTextField(5); public JTextFieldLimit2() { PlainDocument doc = (PlainDocument) textfield.getDocument(); doc.setDocumentFilter(new TextLengthDocFilter(3)); add(textfield); } private class TextLengthDocFilter extends DocumentFilter { private int maxTextLength; public TextLengthDocFilter(int maxTextLength) { this.maxTextLength = maxTextLength; } private boolean verifyText(String text) { return text.length() <= maxTextLength; } @Override public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { Document doc = fb.getDocument(); String oldText = doc.getText(0, doc.getLength()); StringBuilder sb = new StringBuilder(oldText); sb.insert(offset, string); if (verifyText(sb.toString())) { super.insertString(fb, offset, string, attr); } } @Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { Document doc = fb.getDocument(); String oldText = doc.getText(0, doc.getLength()); StringBuilder sb = new StringBuilder(oldText); sb.replace(offset, offset + length, text); if (verifyText(sb.toString())) { super.replace(fb, offset, length, text, attrs); } } @Override public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { Document doc = fb.getDocument(); String oldText = doc.getText(0, doc.getLength()); StringBuilder sb = new StringBuilder(oldText); sb.replace(offset, offset + length, ""); if (verifyText(sb.toString())) { super.remove(fb, offset, length); } } } private static void createAndShowUI() { JFrame frame = new JFrame("JTextFieldLimit2"); frame.getContentPane().add(new JTextFieldLimit2()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } }