我使用掩码接受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);
}
});
}
}发布于 2017-04-28 20:33:07
我找到了解决方案,也许有人会感兴趣。它对每个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中添加'/‘或'-’字符
这就是全部,我希望它能帮助你。
致以问候!
https://stackoverflow.com/questions/43597311
复制相似问题