Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在maskFormatter中自动完成数字前的零_Java_Keylistener_Setvalue_Maskformatter - Fatal编程技术网

Java 在maskFormatter中自动完成数字前的零

Java 在maskFormatter中自动完成数字前的零,java,keylistener,setvalue,maskformatter,Java,Keylistener,Setvalue,Maskformatter,我正在使用一个掩码来接受CUIL(阿根廷)的代码,其格式如下#-#-#-#。但是中间数字可能有7个数字而不是8个,所以我想做的是,当用户按“-”或右箭头时,在中间数字的开头自动完成0 例如: 用户类型 20-1523245 然后用户按-键,结果是 20-01523245- 光标保持在最后一个位置以写入最后一个数字,这一点很重要。 20-01523245-2 我曾尝试使用KeyListener来实现这一点,但我遇到了一个问题,因为当我将值与0一起放入时,掩码会消失,而且我不知道这是否是实现这一点的

我正在使用一个掩码来接受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);
            }
        });
    }
}
公共类JQFormattedTextField扩展JFormattedTextField实现KeyListener{
私有静态最终长serialVersionUID=1L;
私有JQFormats格式;
私有地图格式地图;
公共JQFormattedTextField(){
超级();
addKeyListener(此);
createMap();
}
公共JQFormattedTextField(JQFormats格式){
这个();
setFormat(格式);
}
公共void集合格式(JQFormats格式){
this.format=format;
试一试{
maskformattermask=新的MaskFormatter(formatMap.get(format));
安装(这个);
}捕获(解析异常){
System.out.println(“使用传递的格式创建掩码时出错”);
}
}
公共JQFormats getFormat(){
返回格式;
}
public void createMap(){
formatMap=新的HashMap();
formatMap.put(JQFormats.CUIL,“#-#-#-#-#”);
formatMap.put(JQFormats.CUIT,“#-#-#-#-#”);
formatMap.put(JQFormats.DNI,“################“);
formatMap.put(JQFormats.FECHA,“##/##/##/#####“);
formatMap.put(JQFormats.importe2decimales,“####.##””;
}
@凌驾
按下公共无效键(KeyEvent arg0){
//TODO自动生成的方法存根
如果(arg0.getKeyCode()==KeyEvent.VK_减去| | arg0.getKeyCode()==39){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
StringBuilders=新的StringBuilder(getText());
s、 setCharAt(3,'0');
setValue(s.toString());
setFormat(格式);
}
});
}
}

我找到了解决方案,可能有人对此感兴趣。它对每个maskFormatter都有一点特定,但很有效。我将发布我是如何使用日期格式的,因为其他格式对于阿根廷来说太过具体

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

@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有一个掩码,所以我不能在插入的字符串中添加“/”或“-”字符。

就这些,我希望它能帮助你

问候