Java 在maskFormatter中自动完成数字前的零
我正在使用一个掩码来接受CUIL(阿根廷)的代码,其格式如下#-#-#-#。但是中间数字可能有7个数字而不是8个,所以我想做的是,当用户按“-”或右箭头时,在中间数字的开头自动完成0 例如: 用户类型 20-1523245 然后用户按-键,结果是 20-01523245- 光标保持在最后一个位置以写入最后一个数字,这一点很重要。 20-01523245-2 我曾尝试使用KeyListener来实现这一点,但我遇到了一个问题,因为当我将值与0一起放入时,掩码会消失,而且我不知道这是否是实现这一点的最佳方法 我把密码留给你了,谢谢Java 在maskFormatter中自动完成数字前的零,java,keylistener,setvalue,maskformatter,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);
}
});
}
}
公共类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有一个掩码,所以我不能在插入的字符串中添加“/”或“-”字符。
就这些,我希望它能帮助你
问候