在掩码格式

时间:2017-04-24 20:38:28

标签: java keylistener setvalue maskformatter

我使用掩码接受代码为CUIL(阿根廷),其格式如下:## - ######## - #。但是,中间数字有7个数字而不是8个,这是一个可能性,所以我想做的是当用户按下" - "或者右箭头在中间数字的开头自动完成0。

示例:

用户类型 20-1523245

然后用户按 - 结果是 20-01523245 -

重要的是光标保持在最后一个位置以写入最后一个数字。 20-01523245-2

我已经尝试使用KeyListener执行此操作,但我遇到了问题,因为当我将值设置为0时,掩码会消失,而且我也不知道这是否是最好的方法

我给你留下了代码,谢谢

public class JQFormattedTextField extends JFormattedTextField implements KeyListener {


private static final long serialVersionUID = 1L;
private JQFormats format;
private Map<JQFormats,String> formatMap;

public JQFormattedTextField(){
    super();
    addKeyListener(this);
    createMap();
}

public JQFormattedTextField(JQFormats format){
    this();
    setFormat(format);
}

public void setFormat(JQFormats format){
    this.format=format;
    try {
          MaskFormatter mask = new MaskFormatter(formatMap.get(format));
          mask.install(this);

        } catch (ParseException ex) {
            System.out.println("Error creating the mask with the passed format");
      }

}

public JQFormats getFormat(){
    return format;
}

public void createMap(){

    formatMap = new HashMap<JQFormats,String>();
    formatMap.put(JQFormats.CUIL, "##-########-#");
    formatMap.put(JQFormats.CUIT, "##-########-#");
    formatMap.put(JQFormats.DNI, "##.###.###");
    formatMap.put(JQFormats.FECHA,"##/##/####");
    formatMap.put(JQFormats.IMPORTE_2DECIMALES, "####.##");
}


@Override
public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub
    if(arg0.getKeyCode() == KeyEvent.VK_MINUS || arg0.getKeyCode() == 39){
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                StringBuilder s = new StringBuilder(getText());
                s.setCharAt(3,'0');
                setValue(s.toString());
                setFormat(format);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,也许有人对此感兴趣。它对每个maskFormatter来说都有点特殊,但它确实有效。我将发布我如何处理日期格式,因为其他格式对阿根廷来说太具体了

        Date 1  Date 2  Date 3
Part A    122    134      1212
Part B    453     3       4536
Part C    35      23      3

这里我创建了一个由数字选中的掩码,现在是keyListener

                   Part A     Part B    Part C
          Info 1    -            -        -
Date1     Info 2    122         453
          Info 3     -           -         -
          Info 1     -           -         - 
Date 2    Info 2    134         3
          Info 3     -           -        -
          Info 1     -           -         - 
Date 3    Info 2    1212       4536
          Info 3

我使用split函数将字符串分成几部分,只取数字。然后我使用String.format将数字格式化为我想要的数字(2和2),然后再次连接部分。 请记住jqftf有一个掩码,所以我不能在插入的字符串中添加'/'或' - '字符

多数,我希望它可以帮到你

问候!