首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >maskFormatter中数字前的自动补全零

maskFormatter中数字前的自动补全零
EN

Stack Overflow用户
提问于 2017-04-25 04:38:28
回答 1查看 107关注 0票数 0

我使用掩码接受CUIL (阿根廷)的代码,其格式为##-#-#。但是中间的数字可能有7个数字而不是8个,所以我想要做的是,当用户在中间数字的开头按下"-“或向右箭头时,自动补全0。

示例:

用户键入20-1523245

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

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

我尝试过用KeyListener来做这件事,但是我遇到了一个问题,因为当我把值和0放在一起时,掩码就消失了,而且我也不知道这是不是最好的方法

我把密码留给你了,谢谢

代码语言:javascript
复制
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);
            }
        });
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-04-28 20:33:07

我找到了解决方案,也许有人会感兴趣。它对每个maskFormatter都有点具体,但它是有效的。我会张贴我如何做日期格式,因为其他太具体的格式阿根廷

代码语言:javascript
复制
public class JQDateTextField extends JFormattedTextField {


/**
 * Creates a JQFechaTextField that extends from JQFormattedTextField with a date mask chosen
 * The options are: ##/##/#### - specify int 1 , ##/#### - specify int 2
 * The JQFechaTextField will be autocompleted if the user types one digit in day or month and press '-', '/' or right arrow
 */
public JQFechaTextField(int maskNumber){
    super();
    jqftf = this;
    this.maskNumber=maskNumber;
    if(maskNumber==2){
        setFormat("##/####"); 
    }
    else{
        setFormat("##/##/####");  //Default format
    }
    addKeyListener(this);
}

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

代码语言:javascript
复制
@Override
public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub
    if(arg0.getKeyCode() == KeyEvent.VK_MINUS || arg0.getKeyCode() == 39 || arg0.getKeyCode() == 191 
            || arg0.getKeyCode() == KeyEvent.VK_SUBTRACT){
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                String s = getText().replaceAll("\\s","");
                String parts[] = s.split("/");

                if(s.length()==3 && maskNumber!=2 || s.length()==2 && maskNumber==2){
                    String aux = String.format("%02d",Integer.parseInt(parts[0]));
                    jqftf.setText(aux);
                }
                if(s.length()==5 && maskNumber!=2){
                    String aux = String.format("%02d",Integer.parseInt(parts[1]));
                    String aux2 = parts[0] + aux;
                    jqftf.setText(aux2);
                }
            }
        });
    }
}

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

这就是全部,我希望它能帮助你。

致以问候!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43597311

复制
相关文章

相似问题

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