【问题标题】:FormattedTextField with mixed case characters with DocumentFilter set to uppercaseFormattedTextField 混合大小写字符且 DocumentFilter 设置为大写
【发布时间】:2013-09-26 14:26:20
【问题描述】:

我的问题如下:

我有一个:

public class WWFormattedTextField extends JFormattedTextField implements FocusListener {

所有屏幕上的所有格式化文本字段都将始终为大写。我们希望它们在打字等时显示为大写。所以我们为此做了以下工作:

public class WWFormattedTextField extends JFormattedTextField implements FocusListener {

private DocumentFilter filter = new UppercaseDocumentFilter();
private boolean isEmail = false;

public WWFormattedTextField() {
    super();
    init();
}

private void init() {
    addFocusListener(this);
    ((AbstractDocument) this.getDocument()).setDocumentFilter(filter);
}
public void setIsEmail(boolean email) {
    //Normally this is where I would put something like
    //if email is true - allow mixed case characters
    this.isEmail = email;
}

public boolean getIsEmail() {
    return isEmail;
}

现在所有屏幕上的所有 WWFormattedTextField 都以大写字符输入。 这里是前面提到的UppercaseDocumentFilter():

public class UppercaseDocumentFilter extends DocumentFilter{
    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
        fb.insertString(offset, text.toUpperCase(), attr);
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        fb.replace(offset, length, text.toUpperCase(), attrs);
    }
}

如您所见,这个 FormattedTextField 也有一个 isEmail 属性。当该值为真时 - 我希望允许用户在字段中输入混合大小写字符,但只能输入特定的字符。

关于我如何做到这一点的任何提示/建议?

【问题讨论】:

    标签: java swing jformattedtextfield documentfilter


    【解决方案1】:

    isEmail 属性添加到UppercaseDocumentFilter 以便特定过滤器可以生成大写文本

    public class UppercaseDocumentFilter extends DocumentFilter {
    
        private boolean isEmail;
    
        public UppercaseDocumentFilter(boolean isEmail) {
            this.isEmail = isEmail; 
        }
    
        @Override
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
            fb.insertString(offset, isEmail? text: text.toUpperCase(), attr);
        }
    
        @Override
        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            fb.replace(offset, length, isEmail? text: text.toUpperCase(), attrs);
        }
    }
    

    然后像这样设置过滤器

    DocumentFilter filter = new UppercaseDocumentFilter(isEmail);
    ((AbstractDocument) this.getDocument()).setDocumentFilter(filter);
    

    【讨论】:

    • 感谢@Reimeus 的回答!也许我对代码的使用有误解,但现在我所有的文本字段都是大小写混合的,不管 isEmail 的真假。你能稍微详细说明一下吗?我看到了 UppercaseDocumentFilter 的逻辑,但不确定 TextField 类中应该发生什么变化。
    • 我怀疑您在创建文本字段之后设置了isEmail 标志。这不起作用,因为您只是设置了 isEmail 标志。如果是这种情况,您需要致电setDocument
    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多