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;
}
}
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;
}
}