1 import  java.awt.event.KeyEvent;
  2 import  java.awt.event.KeyListener;
  3
  4 import  javax.swing.JTextField;
  5 import  javax.swing.event.CaretEvent;
  6 import  javax.swing.event.CaretListener;
  7 import  javax.swing.text.AttributeSet;
  8 import  javax.swing.text.BadLocationException;
  9 import  javax.swing.text.PlainDocument;
 10
 11 public   class  NumberTextFieldDocument  extends  PlainDocument  implements  KeyListener, CaretListener {
 12     
 13      int  integerLength  =   - 1 ;
 14      int  fractionLength  =   - 1 ;
 15      double  MaxValue, MinValue;
 16      boolean  useBound  =   false ;
 17     String correctValue  =   "" ;
 18      private   int  caretposold;
 19      private   int  caretpos;
 20     
 21      /**
 22      * 
 23      *
 24       */

 25      public  NumberTextFieldDocument()  {
 26          super ();
 27     }

 28     
 29      /**
 30      * 
 31      *  @param  maxValue
 32      *  @param  minValue
 33       */

 34      public  NumberTextFieldDocument( double  maxValue,  double  minValue)  {
 35          super ();
 36         setBound(maxValue, minValue);
 37     }

 38     
 39      /**
 40      * 
 41      *  @param  integerLength
 42      *  @param  fractionLength
 43       */

 44      public  NumberTextFieldDocument( int  integerLength,  int  fractionLength)  {
 45          super ();
 46         setLength(integerLength, fractionLength);
 47     }

 48      /**
 49      * 
 50      *  @param  integerLength
 51      *  @param  fractionLength
 52       */

 53      public   void  setLength( int  integerLength,  int  fractionLength)  {
 54          if  (integerLength  <   1   ||  fractionLength  <   0 {
 55 //             Error
 56         }
  else   {
 57              this .integerLength  =  integerLength;
 58              this .fractionLength  =  fractionLength;
 59         }

 60     }

 61     
 62      /**
 63      * 
 64      *  @param  maxValue
 65      *  @param  minValue
 66       */

 67      public   void  setBound( double  maxValue,  double  minValue)  {
 68          if  (maxValue  <  minValue) 
 69              return ;
 70         MaxValue  =  maxValue;
 71         MinValue  =  minValue;
 72         useBound  =   true ;
 73     }

 74
 75     
 76      public   void  insertString( int  offs, String str, AttributeSet a)  throws  BadLocationException  {
 77         
 78         String oldtxt  =  getText( 0 , getLength());
 79         String newtxt  =  oldtxt.substring( 0 , offs)  +  str  +  oldtxt.substring(offs);
 80          boolean  strRight  =  testString(oldtxt);
 81          boolean  newtxtRight  =  testString(newtxt);
 82          if  (strRight  &&   ! newtxtRight) {
 83              return ;
 84         }
  else   if  ( ! strRight  &&   ! newtxtRight)  {
 85              int  rlen  =  correctValue.length();
 86              int  flen  =  oldtxt.length();
 87              int  sublen  =  rlen  -  flen;
 88              for  ( int  i  =   0 ; i  <  flen; i ++ {
 89                 String substr  =  correctValue.substring( 0 , i)  +  correctValue.substring(i  +  sublen);
 90                  if  (substr.equals(oldtxt))  {
 91                      super .insertString(i, correctValue.substring(i, i  +  sublen), a);
 92                     correctValue  =  String.copyValueOf(getText( 0 , getLength()).toCharArray());
 93                      return ;
 94                 }

 95             }

 96              return ;
 97         }

 98         
 99          super .insertString(offs, str, a);
100         correctValue  =  String.copyValueOf(getText( 0 , getLength()).toCharArray());
101         
102     }

103     
104      public   void  caretUpdate(CaretEvent e)  {
105         caretposold  =  caretpos;
106         caretpos  =  e.getDot();
107 //         System.out.print(" " + caretpos);
108     }

109     
110      public   void  keyTyped(KeyEvent e)  {
111         
112     }

113
114      public   void  keyPressed(KeyEvent e)  {
115          if  (e.getKeyCode()  ==  KeyEvent.VK_BACK_SPACE  ||  e.getKeyCode()  ==  KeyEvent.VK_DELETE)  {
116             JTextField field  =  (JTextField) e.getSource();
117              try   {
118                 String nowtxt  =  getText( 0 , getLength());
119                 String selecttxt  =  field.getSelectedText();
120                  if  (correctValue  ==   null   ||  (selecttxt  !=   null   &&  selecttxt.equals(correctValue)))  {
121                     correctValue  =   null ;
122                      return ;
123                 }

124                  if  ( ! testString(nowtxt))  {
125                      int  nowpos  =  
126                     caretposold  -  caretpos  ==  correctValue.length()  -  nowtxt.length()  ?  caretposold : caretpos;
127                     remove( 0 , getLength());
128                     insertString( 0 , correctValue,  null );
129                     field.setCaretPosition(nowpos);
130                 }
  else   {
131                     correctValue  =  nowtxt;
132                 }

133             }
  catch  (BadLocationException e1)  {
134                 System.out.println(e1);
135             }

136         }

137     }

138
139      public   void  keyReleased(KeyEvent e)  {
140          if  (getLength()  ==   0 {
141              return ;
142         }

143          if  (e.getKeyCode()  ==  KeyEvent.VK_BACK_SPACE  ||  e.getKeyCode()  ==  KeyEvent.VK_DELETE)  {
144             JTextField field  =  (JTextField) e.getSource();
145              try   {
146                 String nowtxt  =  getText( 0 , getLength());
147                 String selecttxt  =  field.getSelectedText();
148                  if  (correctValue  ==   null   ||  (selecttxt  !=   null   &&  selecttxt.equals(correctValue)))  {
149                     correctValue  =   null ;
150                      return ;
151                 }

152                  if  ( ! testString(nowtxt))  {
153                      int  nowpos  =  
154                     caretposold  -  caretpos  ==  correctValue.length()  -  nowtxt.length()  ?  caretposold : caretpos;
155                     remove( 0 , getLength());
156                     insertString( 0 , correctValue,  null );
157                     field.setCaretPosition(nowpos);
158                 }
  else   {
159                     correctValue  =  nowtxt;
160                 }

161             }
  catch  (BadLocationException e1)  {
162                 System.out.println(e1);
163             }

164         }

165     }

166     
167      private   boolean  testString(String waitfortest)  {
168          int  dotindex  =  waitfortest.indexOf( " . " );
169          int  strLength  =  waitfortest.length();
170          if  (integerLength  !=   - 1   &&  fractionLength  !=   - 1 {
171              if  (fractionLength  ==   0   &&  dotindex  >=   0 {
172                  return   false ;
173             }

174              if  (dotindex  >   0   &&  dotindex  !=  strLength  -   1 {
175                 String[] splitstrs  =  waitfortest.split( " \\. " );
176                  if  (splitstrs.length  !=   2 { // impossible
177                      return   false ;
178                 }
  else   if  (splitstrs[ 0 ].length()  >  integerLength  ||  splitstrs[ 1 ].length()  >  fractionLength)  {
179                      return   false ;
180                 }

181             }
  else   if  ((dotindex  ==   0   &&  strLength  >  fractionLength  +   1
182                      ||  (dotindex  ==  strLength  -   1   &&  strLength  >  integerLength  +   1 )
183                      ||  (dotindex  <   0   &&  strLength  >  integerLength))  {
184                  return   false ;
185             }

186         }

187
188         waitfortest  =  waitfortest.toLowerCase();
189          if  (waitfortest.indexOf( "   " >=   0   ||  waitfortest.indexOf( " d " >=   0   ||  waitfortest.indexOf( " f " >=   0  )  {
190              return   false ;
191         }

192          try   {
193              if  (dotindex  ==   0 {
194                 waitfortest  =   " 0 "   +  waitfortest;
195             }

196              double  num  =  Double.parseDouble(waitfortest);
197              if  (useBound  &&  (num  >  MaxValue  ||  num  <  MinValue))  {
198                  return   false ;
199             }

200         }
  catch  (Exception e)  {
201              return   false ;
202         }

203          return   true ;
204     }

205     
206 }

207


下面是Test

 1import javax.swing.*;
 2
 3public class NumberTextFieldDocumentTest {
 4    public static void main(String[] args) {
 5        JFrame f = new JFrame("TextDocumentTest");
 6        JPanel panel = new JPanel();
 7        f.getContentPane().add(panel);
 8        JTextField txt = new JTextField();
 9        txt.setColumns(20);
10        
11        NumberTextFieldDocument doc = new NumberTextFieldDocument();
12        doc.setBound(999990.00001);
13        doc.setLength(55);
14        txt.setDocument(doc);
15        txt.addKeyListener(doc);
16        txt.addCaretListener(doc);
17        
18        panel.add(txt);
19        f.pack();
20        f.setVisible(true);
21        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
22        txt.setText("123.123");
23        
24    }

25}

26