首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将MaskFormatter和DocumentFilter结合使用

如何将MaskFormatter和DocumentFilter结合使用
EN

Stack Overflow用户
提问于 2014-05-12 19:07:20
回答 1查看 1.5K关注 0票数 3

我需要一个JFormattedTextField,它只允许输入连字符总是出现在文本字段中的##-###**,最后两个字符(由*表示)可以是字母表中的两个字母( all /all),也可以是零。

我知道如何解决这部分问题,但不太确定如何把所有的事情整合在一起。我知道使用MaskFormatter of ##-###**会给我始终存在的连字符,但是我没有办法强制执行最后两个字符的规则,要么是字母,要么什么都没有。此外,MaskFormatter将用最后一个有效的插入替换任何删除,这是不可取的。

我还知道,我可以通过使用regexes (类似于这个功能,但使用不同的regex),使用DocumentFilter只允许我想要的格式:

代码语言:javascript
复制
public void insertString(FilterBypass fb, int offs, int length, String str, AttributeSet a)
        throws BadLocationException {

    String text = fb.getDocument().getText(0, fb.getDocument().getLength());
    text += str;
    if ((fb.getDocument().getLength() + str.length()
            - length) <= maxCharacters && text.matches("^[0-9]+[.]?[0-9]{0,1}$")) {
        super.replace(fb, offs, length, str, a);
    } else {
        Toolkit.getDefaultToolkit().beep();
    }
}

我所看到的问题是,在文本字段中,连字符总是不存在。

有人能帮我完成这两种功能之间的桥梁吗?

EN

回答 1

Stack Overflow用户

发布于 2014-05-13 16:15:07

“我没有办法强制执行最后两个字符的规则,要么是字母,要么是数字。”

很抱歉没看到你在用MaskFormatter。如果您查看API文档,您将看到一个可能的字符格式的图表

  • #任何有效的数字,使用Character.isDigit。
  • '逃逸字符,用于转义任何特殊格式字符。
  • U任意字符(Character.isLetter)。所有小写字母都映射到大写。
  • L任意字符(Character.isLetter)。所有大写字母都映射到小写。
  • A任何字符或数字(Character.isLetter或Character.isDigit)
  • ?任意字符(Character.isLetter)。
  • *什么都行。
  • H任何十六进制字符(0-9,a-f或A).

所以你可以直接用"##-####UU"

使用InputVerifier编辑

代码语言:javascript
复制
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestMaskFormatter {

    private static final String REGEX = "^\\d{2}\\-\\d{4}([A-Z]{2})??";

    private static InputVerifier getInputVerifier() {
        InputVerifier verifier = new InputVerifier() {

            @Override
            public boolean verify(JComponent input) {
                JTextField field = (JTextField) input;
                String text = field.getText();
                return text.matches(REGEX) || text.isEmpty();
            }

            @Override
            public boolean shouldYieldFocus(JComponent input) {
                boolean valid = verify(input);
                if (!valid) {
                    JOptionPane.showMessageDialog(null, "Must Match format: 00-0000AA");
                    JTextField field = (JTextField) input;
                    field.setText("");
                }
                return valid;
            }

        };
        return verifier;
    }

    public static void main(String[] args) {
        JTextField fieldWithVerifier = new JTextField(10);
        fieldWithVerifier.setInputVerifier(getInputVerifier());
        JTextField field1 = new JTextField(10);
        JPanel panel = new JPanel();
        panel.add(fieldWithVerifier);
        panel.add(field1);
        JOptionPane.showMessageDialog(null, panel);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23616927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档