如何将JTextField限制为ax个字符数

我必须限制JTextField中的字符数。 我使用以下代码来做到这一点,但问题是我使用虚拟键盘将数据提供给JTextField。 所以偏移量始终设置为0。 当我输入超过指定数量的字符时,它会重置字段并从头开始执行。 例如,如果我的限制是3个字符并且我输入xyz0我的有限文本框会将字符读取到z ,然后清除该字段并重新启动。 所以我在场上留下了0 。 代码如下。

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

您应该按照本教程使用DocumentFilter。 例如:

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