java - 具有混合大小写字符且 DocumentFilter 设置为大写的 FormattedTextField

标签 java swing jformattedtextfield documentfilter

我的问题如下:

我有一个:

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 属性。当该值为 true 时 - 我希望允许用户在字段中输入混合大小写字符,但仅限特定字符。

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

最佳答案

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

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

关于java - 具有混合大小写字符且 DocumentFilter 设置为大写的 FormattedTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19030966/

相关文章:

java - 提交后 MySQL 与 Hibernate JPA 错误 id

java - 如何将动态参数传递给jquery函数

java - 为什么系统会自动将我的 LinkedHashMap 转换为 HashMap,同时将其作为可序列化的 Intent 传递?

java - 如何在Java中将文本字段放置在框架的特定位置并使其具有特定的大小?

java - Log4j2 HTMLLayout 配置和输出

java - 如何根据 jSpinner 中超出最小/最大范围的文本字段的无效手动编辑来触发事件

java - 在 Java 的 JFormattedTextfield 中设置数字的上限

java - 比较两个文件中的值

java - 如何使 JFormattedTextField 使用 $1.55,但将值存储为整数 155?

java - 如何在 ActionListener 中拥有两个相关的操作?