?

??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(99999,?0.00001);
13????????doc.setLength(5,?5);
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