如何限制JTextField中的字符数?

San*_*V M 28 java swing

如何限制在JTextField中输入的字符数?

假设我想输入最多5个字符.之后,不能输入任何字符.

tim*_*tes 33

http://www.rgagnon.com/javadetails/java-0198.html

import javax.swing.text.PlainDocument

public class JTextFieldLimit extends PlainDocument {
  private int limit;

  JTextFieldLimit(int limit) {
   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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后

import java.awt.*;
import javax.swing.*;

 public class DemoJTextFieldWithLimit extends JApplet{
   JTextField textfield1;
   JLabel label1;

   public void init() {
     getContentPane().setLayout(new FlowLayout());
     //
     label1 = new JLabel("max 10 chars");
     textfield1 = new JTextField(15);
     getContentPane().add(label1);
     getContentPane().add(textfield1);
     textfield1.setDocument
        (new JTextFieldLimit(10));
     }
}
Run Code Online (Sandbox Code Playgroud)

(谷歌的第一个结果)

  • 有没有像textfield.maximumlimit(10)这样的直接函数; (2认同)

Fra*_*lla 7

如果你想将所有内容都集成到一段代码中,那么你可以将tim的答案与JTextField的API上的示例方法混合起来,你会得到这样的结果:

public class JTextFieldLimit extends JTextField {
    private int limit;

    public JTextFieldLimit(int limit) {
        super();
        this.limit = limit;
    }

    @Override
    protected Document createDefaultModel() {
        return new LimitDocument();
    }

    private class LimitDocument extends PlainDocument {

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

    }

}
Run Code Online (Sandbox Code Playgroud)

然后,由于JTextFieldLimit已经具有内部功能,因此无需将文档添加到JTextFieldLimit.


小智 7

很棒的问题,Swing工具包本身不包含JTextFields的这个功能,这很奇怪.但是,这是我的Udemy.com课程"像孩子一样学习Java"的一个很好的答案:

txtGuess = new JTextField();
txtGuess.addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) { 
        if (txtGuess.getText().length() >= 3 ) // limit textfield to 3 characters
            e.consume(); 
    }  
});
Run Code Online (Sandbox Code Playgroud)

这会将猜测游戏文本字段中的字符数限制为3个字符,方法是重写keyTyped事件并检查文本字段是否已有3个字符 - 如果是,则"消耗"关键事件(e),以便它没有得到正常的处理.

  • 这也会阻止退格键或删除键事件,因此一旦达到3个字符,就无法再将其删除。 (2认同)

cam*_*ckr 6

阅读Swing教程中有关实现DocumentFilter的部分,以获取最新的解决方案。

该解决方案将适用于任何文档,而不仅仅是PlainDocument。

这是比接受的解决方案最新的解决方案。


Adh*_*mal 5

试试这个:

textfield.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyTyped(java.awt.event.KeyEvent evt) {
        if(textfield.getText().length()>=5&&!(evt.getKeyChar()==KeyEvent.VK_DELETE||evt.getKeyChar()==KeyEvent.VK_BACK_SPACE)) {
            getToolkit().beep();
            evt.consume();
         }
     }
});
Run Code Online (Sandbox Code Playgroud)