Extends from PlainDocument and override insertString method to provide verification.Come to http://www.javaunion.com to build our own home.

解决方案 »

  1.   

    难道用addKeyListener不可以吗?
      

  2.   

    To hello_wyq:
      Just try it, you'll know. :)
      

  3.   

    从输入的字符创建一个Ingeger,如异常则提示
      

  4.   

    来用我写的东西好了,
    import java.io.*;public class Format

       public Format(String s)
       {  width = 0;
          precision = -1;
          pre = "";
          post = "";
          leading_zeroes = false;
          show_plus = false;
          alternate = false;
          show_space = false;
          left_align = false;
          fmt = ' '; 
          
          int state = 0; 
          int length = s.length();
          int parse_state = 0; 
          // 0 = prefix, 1 = flags, 2 = width, 3 = precision,
          // 4 = format, 5 = end
          int i = 0;
          
          while (parse_state == 0)
          {  if (i >= length) parse_state = 5;
             else if (s.charAt(i) == '%')
             {  if (i < length - 1)
                {  if (s.charAt(i + 1) == '%')
                   {  pre = pre + '%';
                      i++;
                   }
                   else
                      parse_state = 1;
                }
                else throw new java.lang.IllegalArgumentException();
             }
             else
                pre = pre + s.charAt(i);
             i++;
          }
          while (parse_state == 1)
          {  if (i >= length) parse_state = 5;
             else if (s.charAt(i) == ' ') show_space = true;
             else if (s.charAt(i) == '-') left_align = true; 
             else if (s.charAt(i) == '+') show_plus = true;
             else if (s.charAt(i) == '0') leading_zeroes = true;
             else if (s.charAt(i) == '#') alternate = true;
             else { parse_state = 2; i--; }
             i++;
          }      
          while (parse_state == 2)
          {  if (i >= length) parse_state = 5;
             else if ('0' <= s.charAt(i) && s.charAt(i) <= '9')
             {  width = width * 10 + s.charAt(i) - '0';
                i++;
             }
             else if (s.charAt(i) == '.')
             {  parse_state = 3;
                precision = 0;
                i++;
             }
             else 
                parse_state = 4;            
          }
          while (parse_state == 3)
          {  if (i >= length) parse_state = 5;
             else if ('0' <= s.charAt(i) && s.charAt(i) <= '9')
             {  precision = precision * 10 + s.charAt(i) - '0';
                i++;
             }
             else 
                parse_state = 4;                  
          }
          if (parse_state == 4) 
          {  if (i >= length) parse_state = 5;
             else fmt = s.charAt(i);
             i++;
          }
          if (i < length)
             post = s.substring(i, length);
       }        /** 
         prints a formatted number following printf conventions     @param fmt the format string
         @param x the double to print
       */
      
       public static void printf(String fmt, double x)
       {  System.out.print(new Format(fmt).format(x));
       }  /** 
         prints a formatted number following printf conventions     @param fmt the format string
         @param x the int to print
       */   public static void printf(String fmt, int x)
       {  System.out.print(new Format(fmt).format(x));
       }  /** 
         prints a formatted number following printf conventions     @param fmt the format string
         @param x the long to print
       */  public static void printf(String fmt, long x)
       {  System.out.print(new Format(fmt).format(x));
       }  /** 
         prints a formatted number following printf conventions     @param fmt the format string
         @param x the character to print
       */
      
       public static void printf(String fmt, char x)
       {  System.out.print(new Format(fmt).format(x));
       }  /** 
         prints a formatted number following printf conventions     @param fmt the format string
         @param x a string to print
       */
      
       public static void printf(String fmt, String x)
       {  System.out.print(new Format(fmt).format(x));
       }  /** 
         Converts a string of digits (decimal, octal or hex) to an integer     @param s a string
         @return the numeric value of the prefix of s representing a base 10 integer
       */
      
       public static int atoi(String s)
       {  return (int)atol(s);
       } 
       
      /** 
         Converts a string of digits (decimal, octal or hex) to a long integer     @param s a string
         @return the numeric value of the prefix of s representing a base 10 integer
       */
      
       public static long atol(String s)
       {  int i = 0;      while (i < s.length() && Character.isWhitespace(s.charAt(i))) i++;
          if (i < s.length() && s.charAt(i) == '0')
          {  if (i + 1 < s.length() && (s.charAt(i + 1) == 'x' || s.charAt(i + 1) == 'X'))
                return parseLong(s.substring(i + 2), 16);
             else return parseLong(s, 8);
          }
          else return parseLong(s, 10);
       }   private static long parseLong(String s, int base)
       {  int i = 0;
          int sign = 1;
          long r = 0;
          
          while (i < s.length() && Character.isWhitespace(s.charAt(i))) i++;
          if (i < s.length() && s.charAt(i) == '-') { sign = -1; i++; }
          else if (i < s.length() && s.charAt(i) == '+') { i++; }
          while (i < s.length())
          {  char ch = s.charAt(i);
             if ('0' <= ch && ch < '0' + base)
                r = r * base + ch - '0';
             else if ('A' <= ch && ch < 'A' + base - 10)
                r = r * base + ch - 'A' + 10 ;
             else if ('a' <= ch && ch < 'a' + base - 10)
                r = r * base + ch - 'a' + 10 ;
             else 
                return r * sign;
             i++;
          }
          return r * sign;      
       }
          
       /** 
          Converts a string of digits to a <tt>double</tt>      @param s a string
        */
       
       public static double atof(String s)
       {  int i = 0;
          int sign = 1;
          double r = 0; // integer part
          double f = 0; // fractional part
          double p = 1; // exponent of fractional part
          int state = 0; // 0 = int part, 1 = frac part
          
          while (i < s.length() && Character.isWhitespace(s.charAt(i))) i++;
          if (i < s.length() && s.charAt(i) == '-') { sign = -1; i++; }
          else if (i < s.length() && s.charAt(i) == '+') { i++; }
          while (i < s.length())
          {  char ch = s.charAt(i);
             if ('0' <= ch && ch <= '9')
             {  if (state == 0)
                   r = r * 10 + ch - '0';
                else if (state == 1)
                {  p = p / 10;
                   r = r + p * (ch - '0');
                }
             }
             else if (ch == '.') 
             {  if (state == 0) state = 1; 
                else return sign * r;
             }
             else if (ch == 'e' || ch == 'E')
             {  long e = (int)parseLong(s.substring(i + 1), 10);
                return sign * r * Math.pow(10, e);
             }
             else return sign * r;
             i++;
          }
          return sign * r;
       }
                
       /** 
          Formats a <tt>double</tt> into a string (like sprintf in C)      @param x the number to format
          @return the formatted string 
          @exception IllegalArgumentException if bad argument
        */
       
       public String format(double x)
       {  String r;
          if (precision < 0) precision = 6;
          int s = 1;
          if (x < 0) { x = -x; s = -1; }
          if (fmt == 'f')
             r = fixed_format(x);
          else if (fmt == 'e' || fmt == 'E' || fmt == 'g' || fmt == 'G')
             r = exp_format(x);
          else throw new java.lang.IllegalArgumentException();
          
          return pad(sign(s, r));
       }   /** 
          Formats an integer into a string (like sprintf in C)      @param x the number to format
          @return the formatted string 
        */
       
       public String format(int x)
       {  long lx = x;
          if (fmt == 'o' || fmt == 'x' || fmt == 'X')
             lx &= 0xFFFFFFFFL; 
          return format(lx);
       }
       
       /** 
          Formats a long integer into a string (like sprintf in C)      @param x the number to format
          @return the formatted string 
        */
       
       public String format(long x)
       {  String r; 
          int s = 0;
          if (fmt == 'd' || fmt == 'i')
          {  if (x < 0) 
             {  r = ("" + x).substring(1);
                s = -1; 
             }
             else 
             {  r = "" + x; 
                s = 1;
             }
          }
          else if (fmt == 'o')
             r = convert(x, 3, 7, "01234567");
          else if (fmt == 'x')
             r = convert(x, 4, 15, "0123456789abcdef");
          else if (fmt == 'X')
             r = convert(x, 4, 15, "0123456789ABCDEF");
          else throw new java.lang.IllegalArgumentException();
             
          return pad(sign(s, r));
       }
       
       /** 
          Formats a character into a string (like sprintf in C)      @param x the value to format
          @return the formatted string 
        */
       
       public String format(char c)
       {  if (fmt != 'c')
             throw new java.lang.IllegalArgumentException();      String r = "" + c;
          return pad(r);
       }
       
       /** 
          Formats a string into a larger string (like sprintf in C)      @param x the value to format
          @return the formatted string 
        */
       
       public String format(String s)
       {  if (fmt != 's')
             throw new java.lang.IllegalArgumentException();
          if (precision >= 0 && precision < s.length())
             s = s.substring(0, precision);
          return pad(s);
       }
       
        
       /**
          a test stub for the format class
        */
       
       public static void main(String[] a)
       {  double x = 1.23456789012;
          double y = 123;
          double z = 1.2345e30;
          double w = 1.02;
          double u = 1.234e-5;
          int d = 0xCAFE;
          Format.printf("x = |%f|\n", x);
          Format.printf("u = |%20f|\n", u);
          Format.printf("x = |% .5f|\n", x);
          Format.printf("w = |%20.5f|\n", w);
          Format.printf("x = |%020.5f|\n", x);
          Format.printf("x = |%+20.5f|\n", x);
          Format.printf("x = |%+020.5f|\n", x);
          Format.printf("x = |% 020.5f|\n", x);
          Format.printf("y = |%#+20.5f|\n", y);
          Format.printf("y = |%-+20.5f|\n", y);
          Format.printf("z = |%20.5f|\n", z);
          
          Format.printf("x = |%e|\n", x);
          Format.printf("u = |%20e|\n", u);
          Format.printf("x = |% .5e|\n", x);
          Format.printf("w = |%20.5e|\n", w);
          Format.printf("x = |%020.5e|\n", x);
          Format.printf("x = |%+20.5e|\n", x);
          Format.printf("x = |%+020.5e|\n", x);
          Format.printf("x = |% 020.5e|\n", x);
          Format.printf("y = |%#+20.5e|\n", y);
          Format.printf("y = |%-+20.5e|\n", y);
          
          Format.printf("x = |%g|\n", x);
          Format.printf("z = |%g|\n", z);
          Format.printf("w = |%g|\n", w);
          Format.printf("u = |%g|\n", u);
          Format.printf("y = |%.2g|\n", y);
          Format.printf("y = |%#.2g|\n", y);      Format.printf("d = |%d|\n", d);
          Format.printf("d = |%20d|\n", d);            
          Format.printf("d = |%020d|\n", d);    
          Format.printf("d = |%+20d|\n", d);
          Format.printf("d = |% 020d|\n", d);
          Format.printf("d = |%-20d|\n", d);
          Format.printf("d = |%20.8d|\n", d);
          Format.printf("d = |%x|\n", d);            
          Format.printf("d = |%20X|\n", d);    
          Format.printf("d = |%#20x|\n", d);
          Format.printf("d = |%020X|\n", d);
          Format.printf("d = |%20.8x|\n", d);
          Format.printf("d = |%o|\n", d);            
          Format.printf("d = |%020o|\n", d);    
          Format.printf("d = |%#20o|\n", d);
          Format.printf("d = |%#020o|\n", d);
          Format.printf("d = |%20.12o|\n", d);
          
          Format.printf("s = |%-20s|\n", "Hello");      
          Format.printf("s = |%-20c|\n", '!');            // regression test to confirm fix of reported bugs      Format.printf("|%i|\n", Long.MIN_VALUE);      Format.printf("|%6.2e|\n", 0.0);
          Format.printf("|%6.2g|\n", 0.0);      Format.printf("|%6.2f|\n", 9.99);
          Format.printf("|%6.2f|\n", 9.999);      Format.printf("|%6.0f|\n", 9.999);
          
          d = -1;
          Format.printf("d = |%X|\n", d);
       }
       
       private static String repeat(char c, int n)
       {  if (n <= 0) return "";
          StringBuffer s = new StringBuffer(n);
          for (int i = 0; i < n; i++) s.append(c);
          return s.toString();
       }   private static String convert(long x, int n, int m, String d)
       {  if (x == 0) return "0";
          String r = "";
          while (x != 0)
          {  r = d.charAt((int)(x & m)) + r;
             x = x >>> n;
          }
          return r;
       }   private String pad(String r)
       {  String p = repeat(' ', width - r.length());
          if (left_align) return pre + r + p + post;
          else return pre + p + r + post;
       }
       
       private String sign(int s, String r)
       {  String p = "";
          if (s < 0) p = "-"; 
          else if (s > 0)
          {  if (show_plus) p = "+";
             else if (show_space) p = " ";
          }
          else
          {  if (fmt == 'o' && alternate && r.length() > 0 && r.charAt(0) != '0') p = "0";
             else if (fmt == 'x' && alternate) p = "0x";
             else if (fmt == 'X' && alternate) p = "0X";
          }
          int w = 0;
          if (leading_zeroes) 
             w = width;
          else if ((fmt == 'd' || fmt == 'i' || fmt == 'x' || fmt == 'X' || fmt == 'o') 
             && precision > 0) w = precision;
          
          return p + repeat('0', w - p.length() - r.length()) + r;
       }
       
       private String fixed_format(double d)
       {  boolean removeTrailing
             = (fmt == 'G' || fmt == 'g') && !alternate;
             // remove trailing zeroes and decimal point      if (d > 0x7FFFFFFFFFFFFFFFL) return exp_format(d);
          if (precision == 0) 
             return (long)(d + 0.5) + (removeTrailing ? "" : ".");      long whole = (long)d;
          double fr = d - whole; // fractional part
          if (fr >= 1 || fr < 0) return exp_format(d);      double factor = 1;
          String leading_zeroes = "";
          for (int i = 1; i <= precision && factor <= 0x7FFFFFFFFFFFFFFFL; i++) 
          {  factor *= 10; 
             leading_zeroes = leading_zeroes + "0"; 
          }
          long l = (long) (factor * fr + 0.5);
          if (l >= factor) { l = 0; whole++; } // CSH 10-25-97
          
          String z = leading_zeroes + l;
          z = "." + z.substring(z.length() - precision, z.length());      if (removeTrailing)
          {  int t = z.length() - 1;
             while (t >= 0 && z.charAt(t) == '0') t--;
             if (t >= 0 && z.charAt(t) == '.') t--;
             z = z.substring(0, t + 1);
          }      return whole + z;
       }   private String exp_format(double d)
       {  String f = "";
          int e = 0;
          double dd = d;
          double factor = 1;
          if (d != 0)
          {  while (dd > 10) { e++; factor /= 10; dd = dd / 10; }
             while (dd < 1) { e--; factor *= 10; dd = dd * 10; }
          }
          if ((fmt == 'g' || fmt == 'G') && e >= -4 && e < precision) 
             return fixed_format(d);
          
          d = d * factor;
          f = f + fixed_format(d);
          
          if (fmt == 'e' || fmt == 'g')
             f = f + "e";
          else
             f = f + "E";      String p = "000";      
          if (e >= 0) 
          {  f = f + "+";
             p = p + e;
          }
          else
          {  f = f + "-";
             p = p + (-e);
          }
             
          return f + p.substring(p.length() - 3, p.length());
       }
       
       private int width;
       private int precision;
       private String pre;
       private String post;
       private boolean leading_zeroes;
       private boolean show_plus;
       private boolean alternate;
       private boolean show_space;
       private boolean left_align;
       private char fmt; // one of cdeEfgGiosxXos
    }import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
    import javax.swing.event.*;    
    public class CustomTextFormator extends PlainDocument
      {    private String strAllowChar =null;
           private int intMaxLength =0;
           private int intDataType=0;
           private int intPricesion=0;
           public static final int INTEGER_TEXT=1;
           public static final int FLOAT_TEXT=2;
           public static final int DATE_YEAR=3;
           public static final int DATE_MONTH=4;
           //--- Construct Function
           public CustomTextFormator(int intMaxLength)
           {   super();
               this.intMaxLength = intMaxLength;
           }
          //----
           public CustomTextFormator(int intMaxLength, String strCharList)
           {  super();
              this.intMaxLength = intMaxLength;
              this.strAllowChar  = strCharList;
           }
          //----
           public CustomTextFormator(int intMaxLength, int intDataType)
           {  super();
              this.intMaxLength = intMaxLength;
              this.intDataType  = intDataType;
              if(intDataType == this.INTEGER_TEXT)
                 this.strAllowChar = "-1234567890";
              else if(intDataType == this.DATE_YEAR)
                 this.strAllowChar = "1234567890";
              else if(intDataType == this.DATE_MONTH)
                 this.strAllowChar = "1234567890";
              else if(intDataType == this.FLOAT_TEXT)
                 this.strAllowChar = "-1234567890.";
           }
          //----
           public CustomTextFormator(int intMaxLength, int intDataType, int intPricesion)
           {  super();
              this.intMaxLength = intMaxLength;
              this.intDataType  = intDataType;
              if(intDataType == this.INTEGER_TEXT)
                 this.strAllowChar = "-1234567890";
              else if(intDataType == this.FLOAT_TEXT)
                 this.strAllowChar = "-1234567890.";
              this.intPricesion = intPricesion;
           }
          //==== Check Function Panel ===
          public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException
          
          {   
           if (!(s == null)) {
          //-- Check Length
              String strLastText = super.getText(0,super.getLength());
              if(this.intMaxLength>0)
              {  /*if(s.length()>1)
                 {  if(s.getBytes().length+strLastText.getBytes().length>=(this.intMaxLength+this.intPricesion+1))
                       s=s.substring(0,this.intMaxLength-strLastText.getBytes().length);
                 }
                 else*/ 
                 {  int intIntegerPos = strLastText.indexOf(".");
                    if(intIntegerPos >=0)
                    {  if(intIntegerPos>this.intMaxLength)
                          return; 
                       if(strLastText.getBytes().length>=(this.intMaxLength+this.intPricesion+1))
                          return;   
                    }
                    else
                    {  if(strLastText.getBytes().length>=this.intMaxLength && (!s.equals(".")))
                          return;
                    }   
                    
                  }
              }
              //-- Check Char String--
              if(this.strAllowChar instanceof String)
              {   String strCheckChar=null;
                  for(int i=0;i<s.length();i++)
                  {   strCheckChar=s.substring(i,i+1);
                      if(this.strAllowChar.indexOf(strCheckChar)<0)
                       return;
                  }
              }
              //---- Check Signed Position
              int intSignedPos = s.trim().indexOf("-");
              if(intSignedPos >0 && offset>0)
                 return;
              //----
              if(this.intDataType == this.DATE_MONTH)
              {  if(strLastText.length()>0)
                 {  if(strLastText.compareTo("1")>0)
                       return;
                    else if(strLastText.compareTo("1")==0 && s.compareTo("2")>0)
                       return;
                    else if(strLastText.compareTo("0")==0 && s.compareTo("0")==0)
                       return;
                 }
              }
              //--- Check Precision -
              else if(this.intPricesion >0)
              {  int intDotPos=strLastText.lastIndexOf(".");
                 if(s.indexOf(".")>=0)
                 {  if(intDotPos >0)
                      return;  //--- 已有点号
                    else    //--- 插入点号
                    { int intCurrentDotPos = s.indexOf(".");
                      if((s.length()-intCurrentDotPos-1) + (strLastText.length()-offset) > this.intPricesion)
                        return;
                    }             }
                 if(intDotPos>=0 && (strLastText.trim().length()-intDotPos>this.intPricesion)
                    && offset>intDotPos)
                   return;
              }
              }
              super.insertString(offset,s,attributeSet);
          }
          //============================
      }示例如下:
    JTextField.setDocument(new CustomTextFormator(max_length, type));