编程语言
首页 > 编程语言> > java-如何一起使用MaskFormatter和DocumentFilter

java-如何一起使用MaskFormatter和DocumentFilter

作者:互联网

我需要有一个JFormattedTextField,它仅允许输入##-### **,其中连字符始终出现在文本字段中,并且用*表示的最后2个字符可以是2个字母( az / AZ)或完全不显示.

我知道如何解决部分问题,但不确定如何将所有内容整合在一起.我知道使用##-### **的MaskFormatter将给我始终存在的连字符,但是我没有办法强制执行最后2个字符为字母或完全没有字符的规则.此外,MaskFormatter将用最后一个有效插入替换任何删除,这是不希望的.

我也知道我可以使用DocumentFilter通过使用正则表达式仅允许我想要的格式,类似于此功能,但具有不同的正则表达式:

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

我看到的使用此命令的问题是我将无法使连字符始终出现在文本字段中.

有人可以帮助我完成这两个所需功能之间的桥梁吗?

解决方法:

“there is no way for me to enforce the rule of the last 2 characters being either letters or numbers.”

抱歉,没有看到您使用的是MaskFormatter.如果您查看API docs,则会看到可能的字符格式图表

>#任何有效数字,使用Character.isDigit.
>’转义字符,用于转义任何特殊格式的字符.
> U任何字符(Character.isLetter).所有小写​​字母都映射为大写.
> L任何字符(Character.isLetter).所有大写字母都映射为小写字母.
>任何字符或数字(Character.isLetter或Character.isDigit)
>?任何字符(Character.isLetter).
> *任何东西.
> H任何十六进制字符(0-9,a-f或A-F).

因此,您实际上可以只使用“ ##-#### UU”

使用InputVerifier编辑

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

标签:swing,jtextfield,documentfilter,java
来源: https://codeday.me/bug/20191121/2054094.html