ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-如何一起使用MaskFormatter和DocumentFilter

2019-11-21 19:12:15  阅读:311  来源: 互联网

标签:swing jtextfield documentfilter java


我需要有一个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有