Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何限制JTextField中的字符数?_Java_Swing - Fatal编程技术网

Java 如何限制JTextField中的字符数?

Java 如何限制JTextField中的字符数?,java,swing,Java,Swing,如何限制在JTextField中输入的字符数 假设我想输入最多5个字符,之后就不能输入字符了。 (来自谷歌的第一个结果)如果你想将所有内容都整合到一段代码中,那么你可以将tim的答案与API中的示例方法相结合,得到如下结果: public class JTextFieldLimit extends JTextField { private int limit; public JTextFieldLimit(int limit) { super();

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

假设我想输入最多5个字符,之后就不能输入字符了。


(来自谷歌的第一个结果)

如果你想将所有内容都整合到一段代码中,那么你可以将tim的答案与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);
            }
        }       

    }

}
公共类JTextFieldLimit扩展了JTextField{
私有整数限制;
公共JTextFieldLimit(整数限制){
超级();
这个极限=极限;
}
@凌驾
受保护的文档createDefaultModel(){
返回新文档();
}
私有类LimitDocument扩展了PlainDocument{
@凌驾
public void insertString(int offset、String str、AttributeSet attr)引发BadLocationException{
if(str==null)返回;

如果((getLength()+str.length())阅读上的Swing教程中的部分,以获得更新的解决方案

此解决方案适用于任何文档,而不仅仅是普通文档

这是一个比已接受的解决方案更为流行的解决方案。

请尝试以下方法:

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();
         }
     }
});
导入java.awt.KeyboardFocusManager;
导入javax.swing.InputVerifier;
导入javax.swing.JTextField;
导入javax.swing.text.AbstractDocument;
导入javax.swing.text.AttributeSet;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.DocumentFilter;
导入javax.swing.text.DocumentFilter.FilterBypass;
/**
*
*@作者伊戈尔
*/
公共类CustomLengthTextField扩展了JTextField{
受保护布尔值上限=false;
受保护的整数maxlength=0;
公共CustomLengthTextField(){
这是(-1);
}
公共CustomLengthTextField(整数长度,布尔上限){
该值(长度、上限、空值);
}
公共CustomLengthTextField(int-length,InputVerifier-Inputver){
这(长度、错误、输入);
}
/**
*
*@param-length-maksimalan长度
*@param upper-将其转为大写
*@param Inputver-InputVerifier
*/
公共CustomLengthTextField(整数长度、布尔值上限、InputVerifier Inputver){
超级();
this.maxlength=长度;
this.upper=upper;
如果(长度>0){
AbstractDocument doc=(AbstractDocument)getDocument();
doc.setDocumentFilter(新DocumentSizeFilter());
}
setInputVerifier(输入验证程序);
}
公共CustomLengthTextField(整数长度){
这个(长度,假);
}
公共void setMaxLength(整数长度){
this.maxlength=长度;
}
类DocumentSizeFilter扩展了DocumentFilter{
public void insertString(FilterBypass fb、int offs、String str、AttributeSet a)
抛出BadLocationException{
//这将拒绝整个插入,如果它将
//内容太长。另一个选项是
//截断插入的字符串以便
//长度正好是maxCharacters。

if((fb.getDocument().getLength()+str.length())这是一个很好的问题,奇怪的是Swing工具包没有为JTextFields自带这个功能。但是,我的Udemy.com课程“像孩子一样学习Java”给出了一个很好的答案:


这将猜测游戏文本字段中的字符数限制为3个字符,方法是覆盖keyTyped事件并检查文本字段是否已经有3个字符-如果已经有,则您正在“消费”键事件(e),因此无法像正常情况一样处理它。

我使用以下代码段解决了此问题:

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
    boolean max = jTextField1.getText().length() > 4;
    if ( max ){
        evt.consume();
    }        
}

只需将此代码放入KeyTyped事件:

    if ((jtextField.getText() + evt.getKeyChar()).length() > 20) {
        evt.consume();
    }

其中“20”是所需的最大字符数。

是否没有像textfield这样的直接函数。maximumlimit(10);不,它告诉您在javadoc for
JTextField
中使用一个扩展了
PlainDocument
的类。当我输入上述代码时,我遇到两个错误。1-package com.sun.java.swing.text不存在2-找不到符号PlainDocument也可以从相关问题中考虑,这显示了另一个备选方案。FYI Sinc在Java 1.4中,不再需要并建议您使用
文档
来实现此功能,而是使用
文档过滤器
,请参阅和了解更多详细信息。尽管使用自定义文档可以工作,但此解决方案的首选方法是使用JFormattedTextField或使用DocumentFilter我相信在版本1.3中添加到JDK中的其他特性。Swing教程涵盖了这两种方法(甚至从教程中删除了自定义文档方法).FYI自Java 1.4以来,不再需要并建议您使用
文档
来实现此功能,而是使用
文档过滤器
,请参阅和了解更多详细信息。自Java 1.4以来,不再需要并建议您使用
文档
来实现此功能,而是使用
文档umentFilter
,请参阅和了解更多详细信息自从Java 1.4以来,不再需要并建议您使用
文档
来实现此功能,而是使用
文档过滤器
,请参阅和了解更多详细信息,
KeyListener
对于像charm这样的文本组件从来都不是一个好主意!谢谢此问题至少有3个答案是此答案的副本。对剽窃行为没有任何控制吗?如果答案已经存在,为什么要添加与新答案相同的答案?这也会阻止退格或删除关键事件,因此一旦达到3个字符,就不能再删除它们。
import java.awt.KeyboardFocusManager;
import javax.swing.InputVerifier;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

/**
 *
 * @author Igor
 */
public class CustomLengthTextField extends JTextField {

    protected boolean upper = false;
    protected int maxlength = 0;

    public CustomLengthTextField() {
        this(-1);
    }

    public CustomLengthTextField(int length, boolean upper) {
        this(length, upper, null);
    }

    public CustomLengthTextField(int length, InputVerifier inpVer) {
        this(length, false, inpVer);
    }

    /**
     *
     * @param length - maksimalan length
     * @param upper - turn it to upercase
     * @param inpVer - InputVerifier
     */
    public CustomLengthTextField(int length, boolean upper, InputVerifier inpVer) {
        super();
        this.maxlength = length;
        this.upper = upper;
        if (length > 0) {
            AbstractDocument doc = (AbstractDocument) getDocument();
            doc.setDocumentFilter(new DocumentSizeFilter());
        }
        setInputVerifier(inpVer);
    }

    public CustomLengthTextField(int length) {
        this(length, false);
    }

    public void setMaxLength(int length) {
        this.maxlength = length;
    }

    class DocumentSizeFilter extends DocumentFilter {

        public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
                throws BadLocationException {

            //This rejects the entire insertion if it would make
            //the contents too long. Another option would be
            //to truncate the inserted string so the contents
            //would be exactly maxCharacters in length.
            if ((fb.getDocument().getLength() + str.length()) <= maxlength) {
                super.insertString(fb, offs, str, a);
            }
        }

        public void replace(FilterBypass fb, int offs,
                int length,
                String str, AttributeSet a)
                throws BadLocationException {

            if (upper) {
                str = str.toUpperCase();
            }

            //This rejects the entire replacement if it would make
            //the contents too long. Another option would be
            //to truncate the replacement string so the contents
            //would be exactly maxCharacters in length.
            int charLength = fb.getDocument().getLength() + str.length() - length;

            if (charLength <= maxlength) {
                super.replace(fb, offs, length, str, a);
                if (charLength == maxlength) {
                    focusNextComponent();
                }
            } else {
                focusNextComponent();
            }
        }

        private void focusNextComponent() {
            if (CustomLengthTextField.this == KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()) {
                KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
            }
        }
    }
}
txtGuess = new JTextField();
txtGuess.addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) { 
        if (txtGuess.getText().length() >= 3 ) // limit textfield to 3 characters
            e.consume(); 
    }  
});
private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
    boolean max = jTextField1.getText().length() > 4;
    if ( max ){
        evt.consume();
    }        
}
    if ((jtextField.getText() + evt.getKeyChar()).length() > 20) {
        evt.consume();
    }