JFormattedTextField例子

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

    
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章