我现在需要在用户输入4个数字的时候,就需要做一个判断。主要在keytype中实现。限制为数字可以实现。现在的问题就是,如果在keytype中判断jtextfield.gettext().lenght()==3,那么只能显示前面输入的三个数字,无法显示第四输入的数字,后面的方法就触发了。请问我该怎么实现当用户输入4个数字后,就会自动触发一个事件。

解决方案 »

  1.   

    每次keydown 用正则判断文本框内容的 格式和长度可以吗?
      

  2.   

    设置document。
    package tkl.client.guiutil;import java.awt.Toolkit;import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;import tkl.client.util.TKLCommonUtil;
    public class MaskInputDocument extends PlainDocument
    {
    public static final int SHORT_LENGTH = 10;
    public static final int MID_LENGTH = 20;
    public static final int LONG_LENGTH = 40;
    public static final int TEXT_MASK = 0;
    public static final int DIGIT_MASK = 1;
    public static final int DECIMAL_MASK = 2;
    public static final int PHONE_MASK = 3;
    private int length;
    private int mask; public MaskInputDocument()
    {
    super();
    this.length = MID_LENGTH;
    this.mask = TEXT_MASK;
    } public MaskInputDocument(int mask, int length)
    {
    super();
    this.mask = mask;
    this.length = length;
    } public void insertString(int offs, String input, AttributeSet a)
    throws BadLocationException
    {
    int len = getLength();
    if (len >= this.length)
    {
    Toolkit.getDefaultToolkit().beep();
    return;
    }
    String str = TKLCommonUtil.ToDBC(input);
    char[] se = str.toCharArray();
    char[] buf = new char[se.length];
    int count = 0; for (int i = 0; i < se.length; ++i)
    {
    if (len + count >= this.length)
    {
    Toolkit.getDefaultToolkit().beep();
    return;
    }
    char chr = se[i];
    if (this.mask == PHONE_MASK)
    {
    if (Character.isDigit(chr))
    {
    buf[(count++)] = chr;
    }
    else if ((chr == '-') && (getText(0, len).indexOf("-") == -1)
    && ((i + offs) != 0))
    {
    buf[(count++)] = chr;
    }
    else
    {
    Toolkit.getDefaultToolkit().beep();
    }
    }
    else if (this.mask == DIGIT_MASK)
    {
    if (Character.isDigit(chr))
    {
    buf[(count++)] = chr;
    }
    else
    {
    Toolkit.getDefaultToolkit().beep();
    }
    }
    else if (this.mask == DECIMAL_MASK)
    {
    if (Character.isDigit(chr))
    {
    buf[(count++)] = chr;
    }
    else if ((chr == '.') && (getText(0, len).indexOf(".") == -1)
    && ((i + offs) != 0))
    {
    buf[(count++)] = chr;
    }
    else
    {
    Toolkit.getDefaultToolkit().beep();
    }
    }
    else
    {
    buf[(count++)] = chr;
    }
    }
    if (count > 0)
    {
    str = new String(buf);
    super.insertString(offs, str, a);
    }
    }}fldUser = new JTextField();
    fldUser.setDocument(new MaskInputDocument(MaskInputDocument.TEXT_MASK,
    MaskInputDocument.LONG_LENGTH));
      

  3.   

    要激发事件的话在Toolkit.getDefaultToolkit().beep();后面去做。
      

  4.   

    监听DocumentListener可以实现嘛?
    比如这样:
    jtextfield.getDocument().addDocumentListener(new DocumentListener(){
    public void changedUpdate(DocumentEvent e) {} public void insertUpdate(DocumentEvent e) {
    if (fldMin.getText().length() == 4) {
    System.out.println("4");
    }
    } public void removeUpdate(DocumentEvent e) {}
    });
    这个里面需要注意的是在insertUpdate事件处理的过程中,
    如果你企图改变jtextfield的本身的一些相关属性最好用SwingUtilities.invokeLater
    否则,很难保证你的代码可以正确的执行
      

  5.   

    jtextfield.getDocument().addDocumentListener(new DocumentListener(){
                    public void changedUpdate(DocumentEvent e) {}                public void insertUpdate(DocumentEvent e) {
                        if (jtextfield.getText().length() == 4) {
                            System.out.println("4");
                        }
                    }                public void removeUpdate(DocumentEvent e) {}
                });刚才有点笔误
      

  6.   

    用了sunyiz的方法,后台可以到4位数字,但是文本框只能显示前面3位数字。不知道为什么?
      

  7.   

    {
    txtMsg = new JTextField();
    this.add(txtMsg);
    txtMsg.setText(mess);
    txtMsg.setBounds(0, 0, 100, 28);
    txtMsg.requestFocus();
    txtMsg.addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    e.consume();
    sureActionPerformed();
    return;
     }
     }
    public void keyTyped(KeyEvent e) {
    char c = e.getKeyChar();
    if (c > '9' || c < '0') {
    e.consume();
    return;
    }
    // if (txtMsg.getText().length() > 3) {
    // e.consume();
    // //sureActionPerformed();
    // return;
    // }

    }
    });
    txtMsg.getDocument().addDocumentListener(new DocumentListener(){ public void changedUpdate(DocumentEvent e) {
    // TODO 自动生成方法存根

    } public void insertUpdate(DocumentEvent e) {
    // TODO 自动生成方法存根
     if (txtMsg.getText().length() == 4) {
                            System.out.println(txtMsg.getText());
                            Thread thread=new Thread();
                 try {
    thread.sleep(500);
    } catch (InterruptedException e1) {
    // TODO 自动生成 catch 块
    e1.printStackTrace();
    }
                            sureActionPerformed();
                            return;
                        }
    } public void removeUpdate(DocumentEvent e) {
    // TODO 自动生成方法存根

    }
                });

    }以上是我的主要代码块