//用来限制JTextField里输入的只能为数字和最多一个小数点并且限制给定输入长度的类:
  
  private static class NumberLenghtLimitedDmt extends PlainDocument {
     private int limit;  //输入最大长度
     private boolean dot = false;// 表示有无小数点 
     public NumberLenghtLimitedDmt(int limit) {
      super();
       this.limit = limit;
     }  
     public void insertString  //重载insertString方法
                (int offset, String  str, AttributeSet attr) throws BadLocationException {   
       if (str == null){
        return;
       }
       if ((getLength() + str.length()) <= limit) {
        char[] upper = str.toCharArray();
         int length=0;
         for (int i = 0; i < upper.length; i++) { 
              
          if (upper[i]>='0'&&upper[i]<='9' || upper[i]=='.'&&dot==false){ //为数字或为第一个小数点        
          upper[length++] = upper[i];
           }
           if(upper[i]=='.'){ //出现小数点则dot置true
             dot=true;
           }  
         }
         super.insertString(offset, new String(upper,0,length), attr); //调用父类的insertString
       }
     }
   }   private static JTextField t1 = new JTextField(8);
  
   然后在main方法里建立了界面后有:
   t1.setDocument(new NumberLenghtLimitedDmt(12));   运行后,在t1这个JTextField里只能输入数字和最多一个小数点。但是一旦退格将那个小数点删除后就不能再输入小数点了,求高手解释下原因。如果要按照我需要的限制(只能输入数字和最多一个小数点,输入长度限制)该怎么设计?

解决方案 »

  1.   


    将JTextField中的字符串转化为数字,如double,如果成功转化,说明输入的是数字,没问题,就让这个字符串继续存在否则,一旦在转化为字符串的过程中出现异常,如InputMismatchException异常,
    就将JTextField中的内容设为空(""),并弹出消息框,告诉用户输入的内容不合法
    限制给定输入长度的类:
    查一下API文档,看看有没有限制长度的,很可能有如果没有,就用判断字符串的长度的方法来限制输入长度
    仅供参考
      

  2.   

    (upper[i]>='0'&&upper[i]<='9' || upper[i]=='.'&&dot==false)是不是应该写成((upper[i]>='0'&&upper[i]<='9') || (upper[i]=='.'&&dot==false))还有你是静态方法,在调用父类insertString之前,是不是应该把dot再置成false
    dot=false;
    super.insertString(offset, new String(upper,0,length), attr); //调用父类的insertString
      

  3.   

    很显然是你的小数点判断出问题了。
    退格键删除了小数点,你的pg却没有reset标志位。
    我觉得你完全没必要想那么复杂,每次keyDown都去做整体check就OK了。如果已经存在小数点了,则不响应小数点的输入。也别跳出对话框,那样会让人很烦。
      

  4.   

    JTextField(String text, int columns) 
    这是他的构造函数,后面那个参数应该就是限定他的长度了
      

  5.   

    你的意思是一旦输入了一个非数字(其他字符或第二次输入小数点)就马上提示错误并将整个JTextField置空吗?这个效果也可行。具体实现还是继承PlainDocument类并重载insertString方法吗?
      

  6.   

    逻辑没错,&&运算符比||运算符优先级高,我加了括号也一样的。我在调用父类insertString之前,把dot再置成false后就不限制小数点输入个数了...郁闷ing
      

  7.   

    有点高深,你说的我不知道具体怎么实现啊。在insertString里getText()然后判断吗?我初学java只是还很混乱
      

  8.   

    你把dot = false;
    放到本体方法insertString结束之前呢