public class NumberText
    extends TextField{
  public NumberText() throws HeadlessException {
    this.enableEvents(AWTEvent.KEY_EVENT_MASK);
  }  public void processKeyEvent(KeyEvent e) {
    if (e.getKeyCode() < KeyEvent.VK_0 || e.getKeyCode() > KeyEvent.VK_9)
    {
      //??如何在这里实现代码,使符合条件的字符(非数字)不在输入框中显示出来?
    }
  }
}
问题如上,就是通过一个继承TextField的类来实现只输入数字,如何在processKeyEvent(KeyEvent e)编写相应的处理代码?

解决方案 »

  1.   

    自定义JTextField,不通过添加键盘监听实现(避免拷贝、粘贴的情况)public class NumberField extends JTextField{
    public NumberField(){
    setDocument(new IntegerDocument()); 
    }
    //通过Document实现,判断输入的字符都是不是数字
    class IntegerDocument extends PlainDocument {
    public void insertString(int offset, String s, AttributeSet attributeSet)
    throws BadLocationException {
    try {
    Integer.parseInt(s);
    } catch (Exception ex) {
    return;
    }
    super.insertString(offset, s, attributeSet);
    }
    }
    }
      

  2.   

    我继承的是TextField,没有使用SWing组件,有没有针对TextField的方法啊?
      

  3.   


        public static class FloatJTextField extends JTextField {//可以输入 + - * / 的对话框        public FloatJTextField(int cols) {
                super(cols);
                this.addFocusListener(new FocusListener() {                public void focusGained(FocusEvent e) {
                        selectAll();
                    }                public void focusLost(FocusEvent e) {
                    }
                });
            }        @Override
            protected Document createDefaultModel() {
                return new FloatTextDocument();
            }        private static class FloatTextDocument extends PlainDocument {            @Override
                public void insertString(int offs, String str, AttributeSet a)
                        throws BadLocationException {
                    if (str == null || str.length() == 0) {
                        return;
                    }
                    boolean point = true;//默认可以加小数点                int oldLength = getText(0, getLength()).length();
                    str = getText(0, getLength()).substring(0, offs) + str + getText(0, getLength()).substring(offs);
                    String resultStr = "";
                    for (int i = 0; i < str.length(); i++) {
                        if ((str.charAt(i) >= 48 && str.charAt(i) <= 57) || str.charAt(i) == '+' || str.charAt(i) == '-' || str.charAt(i) == '*' || str.charAt(i) == '/' || str.charAt(i) == '.') {
                            if (i == 0 && (str.charAt(i) == '-' || (str.charAt(i) >= 48 && str.charAt(i) <= 57))) {//第一位是 - 或 数字                            resultStr += str.substring(i, i + 1);
                            }
                            if (i != 0) {
                                if (str.charAt(i - 1) < 48 || str.charAt(i - 1) > 57) {
                                    if (str.charAt(i - 1) != '.') {
                                        point = true;
                                    }
                                    if (str.charAt(i) >= 48 && str.charAt(i) <= 57) {
                                        resultStr += str.substring(i, i + 1);
                                    }
                                }
                                if (str.charAt(i - 1) >= 48 && str.charAt(i - 1) <= 57) {
                                    if (str.charAt(i) == '.') {
                                        if (point) {
                                            resultStr += str.substring(i, i + 1);
                                            point = false;
                                        }
                                    } else {
                                        resultStr += str.substring(i, i + 1);
                                    }
                                }
                            }
                        }
                    }
                    if (resultStr.length() - oldLength > 0) {
                        resultStr = resultStr.substring(offs, resultStr.length() - oldLength + offs);
                        //    System.out.println(resultStr);
                        super.insertString(offs, resultStr, a);
                    }
                }
            }
        }除了数字,还可以输入 + - * / . 你要是不需要你可以去掉,懒得给你去了,你自己可以搞定的!
      

  4.   

    我现在改用了JTextField组件,但super.insertString(offs, resultStr, a);编译不通过!!
    经过测试我根本就不能调用PalinDocument的insertString(int offs, String str, AttributeSet a)函数,在Java的帮助中说 Serialized objects of this class will not be compatible with future Swing releases. 不知道是不知这个问题引起的又改如何解决呢?
      

  5.   

    大家帮帮忙啊!!PalinDocument的insertString(int offs, String str, AttributeSet a)函数明明是有的,就是不能调用。
      

  6.   

    你将四楼的代码全部拷贝了???@Override只是在1.5以后才可以这么用的,把这些都去掉
      

  7.   

    @Override没有写进去,就是不能用。我建了一个PalinDocument的实例,也不能调用insertString(int offs, String str, AttributeSet a)函数。大家帮帮忙啊!
      

  8.   

    给你个方法, 你参考下
    protected void verifyTextHandler(VerifyEvent e){
    // 几种情况,输入控制键,输入中文,输入字符,输入数字    
        // 正整数验证    
        Pattern pattern = Pattern.compile("[0-9]\\d*");    
        Matcher matcher = pattern.matcher(e.text);    
        if (matcher.matches()) // 处理数字    
         e.doit = true;    
        else if (e.text.length() > 0) // 有字符情况,包含中文、空格    
         e.doit = false;    
        else   
         // 控制键    
         e.doit = true; 
    }
    用正则吧!
      

  9.   


    import java.awt.AWTEvent;
    import java.awt.HeadlessException;
    import java.awt.TextField;
    import java.awt.event.KeyEvent;public class NumberText extends TextField {
    public NumberText() throws HeadlessException {
    this.enableEvents(AWTEvent.KEY_EVENT_MASK);
    } public void processKeyEvent(KeyEvent e) {
    if (e.getKeyCode() < KeyEvent.VK_0 || e.getKeyCode() > KeyEvent.VK_9) {

    //如果为非数字,把文本框的最后一个字去掉后重新设置文本框不就OK了
    this.setText(this.getText().substring(0, this.getText().length()));
    }
    }
    }
      

  10.   

    2楼是最佳解决办法 他的代码不行么?
    public class UpperCaseTextField extends JTextField {
    public UpperCaseTextField() {
    super();
    }

    protected Document createDefaultModel() {
    return new PlainDocument() {
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
    if (str == null || str == "")
    return;
    String oldString = getText(0, getLength());
    String newString = oldString.substring(0, offs) + str + oldString.substring(offs);
    //if (newString.length() < 12) {
    //super.insertString(offs, str.toUpperCase(), a);
    //}
                                    try{
                                        Integer.parseInt(newString);
                                    }catch{
                                        return;
                                    }
                                    super.insertString(offs, str.toUpperCase(), a);
    }
    };
    }
    }
    与2楼大同小异 你试试
      

  11.   

    catch 后面没加 exception 你加上
      

  12.   

    最后一句  super.insertString(offs, str, a); 
      

  13.   

    不好意思,不行啊!
    我的super.insertString(offs, str, a); 不能调用!
    我建了一个PalinDocument的实例,也不能调用insertString(int offs, String str, AttributeSet a)函数。
    不知道我为什么用不了PlainDocument!!!
      

  14.   

    泪奔!!!我和JBuilder9结了什么仇啊!!我就是不能用2和19楼的方法!!TNND!!