日期:2014-05-20  浏览次数:20698 次

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();

        // 格式化新输入的字符串