package ch9; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.Array; import java.net.MalformedURLException; import java.net.URL; import java.text.DateFormat; import java.text.NumberFormat; import java.text.ParseException; import java.util.Date; import java.util.StringTokenizer; import javax.swing.InputVerifier; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultFormatter; import javax.swing.text.DocumentFilter; import javax.swing.text.InternationalFormatter; import javax.swing.text.MaskFormatter; public class TextFieldTest ... { public static void main(String[] args) ...{ JFrame frame=new TextFieldFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }} class TextFieldFrame extends JFrame ... { public TextFieldFrame()...{ setTitle("TextField Test"); Toolkit toolkit=Toolkit.getDefaultToolkit(); Dimension screenSize=toolkit.getScreenSize(); int screenWidth=screenSize.width; int screenHeight=screenSize.height; setBounds(screenWidth/4, screenHeight/4, screenWidth/2, screenHeight/2); JPanel buttonPanel=new JPanel(); okButton=new JButton("OK"); buttonPanel.add(okButton); add(buttonPanel, BorderLayout.SOUTH); mainPanel=new JPanel(); mainPanel.setLayout(new GridLayout(0,3)); add(mainPanel, BorderLayout.CENTER); JFormattedTextField intField1=new JFormattedTextField(NumberFormat.getIntegerInstance()); intField1.setValue(new Integer(100)); addRow("Number:",intField1); JFormattedTextField intField2=new JFormattedTextField(NumberFormat.getIntegerInstance()); intField2.setValue(new Integer(100)); intField2.setFocusLostBehavior(JFormattedTextField.COMMIT); addRow("Number(Commit behavior", intField2); JFormattedTextField intField3=new JFormattedTextField(new InternationalFormatter(NumberFormat.getIntegerInstance())...{ protected DocumentFilter getDocumentFilter()...{ return filter; } DocumentFilter filter=new IntFilter(); }); intField3.setValue(new Integer(100)); addRow("Filtered Number: ", intField3); JFormattedTextField intField4=new JFormattedTextField(NumberFormat.getIntegerInstance()); intField4.setInputVerifier(new FormattedTextFieldVerifier()); intField4.setValue(new Integer(100)); addRow("Verifier Field: ", intField4); //NumberFormat还有getNumberInstance(), getCurrencyInstance(), getPercentInstance() JFormattedTextField intField5=new JFormattedTextField(NumberFormat.getCurrencyInstance()); intField5.setValue(new Integer(100)); addRow("Currency Field: ", intField5); //DateFormat有getDateInstance(), getTimeInstance(), getDateTimeInstance() JFormattedTextField intField6=new JFormattedTextField(DateFormat.getDateInstance()); intField6.setValue(new Date()); addRow("Date Field: ", intField6); DateFormat format=DateFormat.getDateInstance(DateFormat.SHORT); format.setLenient(false); JFormattedTextField intField7=new JFormattedTextField(format); intField7.setValue(new Date()); addRow("Date (short) Field:", intField7); try...{ DefaultFormatter formatter=new DefaultFormatter(); formatter.setOverwriteMode(false); JFormattedTextField urlField=new JFormattedTextField(formatter); urlField.setValue(new URL("http://www.sina.com.cn")); addRow("URL: ", urlField); }catch(MalformedURLException e)...{ e.printStackTrace(); } try...{ MaskFormatter formatter=new MaskFormatter("###-##-####"); formatter.setPlaceholderCharacter('0'); JFormattedTextField ssnField=new JFormattedTextField(formatter); ssnField.setValue("078-05-1220"); addRow("MaskFormatter Field:", ssnField); }catch(ParseException e)...{ e.printStackTrace(); } JFormattedTextField ipField=new JFormattedTextField(new IPAddressFormatter()); ipField.setValue(new byte[]...{(byte)130, 65, 86, 66}); addRow("IP Address Field: ", ipField); } public void addRow(String labeltext, final JFormattedTextField field)...{ JLabel label=new JLabel(labeltext); mainPanel.add(label); mainPanel.add(field); final JLabel valueLabel=new JLabel(); mainPanel.add(valueLabel); okButton.addActionListener(new ActionListener()...{ public void actionPerformed(ActionEvent event)...{ Object value=field.getValue(); if(value.getClass().isArray())...{ StringBuilder str=new StringBuilder(); str.append('{'); for(int i=0; i<Array.getLength(value); i++)...{ if(i>0) str.append(','); str.append(Array.get(value, i).toString()); } str.append('}'); valueLabel.setText(str.toString()); }else...{ valueLabel.setText(value.toString()); } } }); } private JButton okButton; private JPanel mainPanel;} class IntFilter extends DocumentFilter ... { public void insertString(FilterBypass fp, int offset, String string, AttributeSet attr) throws BadLocationException...{ StringBuilder builder=new StringBuilder(string); for(int i=builder.length()-1; i>=0; i--)...{ int cp=builder.codePointAt(i); if(!Character.isDigit(cp) && cp!='-')...{ builder.deleteCharAt(i); if(Character.isSupplementaryCodePoint(cp))...{ i--; builder.deleteCharAt(i); } } } super.insertString(fp, offset, builder.toString(), attr); } public void replace(FilterBypass fp, int offset, int length, String string, AttributeSet attr) throws BadLocationException...{ if(string != null)...{ StringBuilder builder=new StringBuilder(string); for(int i=builder.length()-1; i>=0; i--)...{ int cp=builder.codePointAt(i); if(!Character.isDigit(cp) && cp!='-')...{ builder.deleteCharAt(i); if(Character.isSupplementaryCodePoint(cp))...{ i--; builder.deleteCharAt(i); } } } string=builder.toString(); } super.replace(fp, offset, length, string, attr); }} class FormattedTextFieldVerifier extends InputVerifier ... { public boolean verify(JComponent component)...{ JFormattedTextField field=(JFormattedTextField)component; return field.isEditValid(); }} class IPAddressFormatter extends DefaultFormatter ... { public String valueToString(Object value) throws ParseException...{ if(!(value instanceof byte[]))...{ throw new ParseException("Not a byte[]",0); } byte[] a=(byte[])value; if(a.length!=4)...{ throw new ParseException("Length!=4", 0); } StringBuilder builder=new StringBuilder(); for(int i=0; i<4; i++)...{ int b=a[i]; if(b<0) b+=256; builder.append(String.valueOf(b)); if(i<3) builder.append('.'); } return builder.toString(); } public Object stringToValue(String text) throws ParseException...{ StringTokenizer tokenizer=new StringTokenizer(text, "."); byte[] a=new byte[4]; for(int i=0; i<4; i++)...{ int b=0; if(!tokenizer.hasMoreTokens()) throw new ParseException("Too few bytes", 0); try...{ b=Integer.parseInt(tokenizer.nextToken()); }catch(NumberFormatException e)...{ throw new ParseException("Not an integer", 0); } if(b<0 || b>=256)...{ throw new ParseException("Byte out of range", 0); } a[i]=(byte)b; } if(tokenizer.hasMoreTokens()) throw new ParseException("Too many bytes", 0); return a; } }