java文本框的一些问题
我要实现用户在输入银行卡账号的时候,每输完4个数字继续输的时候,系统会自动用一个空格键隔开来,即每4个数字用一个空格键隔开。就像平时我们在ATM机上输账号一样,每次系统都会用一个空格键4个数字的隔开。求高手大侠指教,谢谢!
jt2.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e){
String s1=new String(jt2.getText());
if(s1.length()>0&&(s1.length()!= 6||!(s1.matches("\\d+")))){
JOptionPane.showMessageDialog(null, "账号由21个数字组成!");
jt2.setText(null);
jt2.requestFocus();
}
}
});
麻烦各位高手最好在我这个代码框里面进行操作,感激! java
[解决办法]
package com.tur.demo;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class TextFieldDocumentDemo {
private static void createAndShowGui() {
final JTextField textField = new JTextField(20);
textField.setDocument(new FormatedDocument());
JFrame frame = new JFrame("Text Field Document Demo");
frame.getContentPane().add(textField);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
createAndShowGui();
}
}
class FormatedDocument extends PlainDocument {
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
// 如果输入非数字,则输入无效
if (!str.matches("\\d+")) {
return;
}
// 取得输入的所有字符,输入有可能是插入,而不是每次都是输入在最后一个字符
int length = getLength();
StringBuilder sb = new StringBuilder(getText(0, length));
sb.insert(offs, str);
// 去掉字符中的所有空格
char[] chs = sb.toString().replaceAll("\\s+", "").toCharArray();
// 格式化新输入的字符串
sb.replace(0, sb.length(), "");
for (int i = 1; i <= chs.length; ++i) {
sb.append(chs[i - 1]);
if (i % 4 == 0) {
sb.append(" ");
}
}
// 删除原来的字符串,并显示新输入和格式化后的字符串
remove(0, getLength());
super.insertString(0, sb.toString().trim(), a);
}
}
MaskFormatter editFormatter = new MaskFormatter("#### #### #### ###");
MaskFormatter displayFormatter = new MaskFormatter("#### #### #### ###");
DefaultFormatterFactory factory = new DefaultFormatterFactory( displayFormatter, displayFormatter, editFormatter);
JFormattedTextField tf = new JFormattedTextField(factory);