【问题标题】:How to restrict the JTextField to a x number of characters如何将 JTextField 限制为 x 个字符
【发布时间】:2011-05-30 04:23:18
【问题描述】:

我必须限制 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);  
    }  
  }  
}  

【问题讨论】:

    标签: java swing jtextfield


    【解决方案1】:

    您应该按照this tutorial 使用 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();
             }
          });
       }
    }
    

    【讨论】:

    • 这不仅仅是完美的 :) 按我的预期工作。我只是做了一些修改以适应我的应用程序。谢谢你...
    • @Deepak:不客气,但请务必查看上面链接的教程,以便了解它的作用。
    • 真的需要覆盖remove()吗?
    猜你喜欢
    • 2014-01-25
    • 2012-05-22
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2015-12-10
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多