例1:
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import javax.swing.event.*;
- import javax.swing.text.*;
- import java.beans.PropertyChangeListener;
- import java.beans.PropertyChangeEvent;
- import java.text.*;
- /**
- * FormatterFactoryDemo.java requires no other files.
- */
- public class FormatterFactoryDemo extends JPanel
- implements PropertyChangeListener {
- //Values for the text fields
- private double amount = 100000;
- private double rate = .075; //7.5 %
- private int numPeriods = 30;
- //Labels to identify the fields
- private JLabel amountLabel;
- private JLabel rateLabel;
- private JLabel numPeriodsLabel;
- private JLabel paymentLabel;
- //Strings for the labels
- private static String amountString = "Loan Amount: ";
- private static String rateString = "APR (%): ";
- private static String numPeriodsString = "Years: ";
- private static String paymentString = "Monthly Payment: ";
- //Fields for data entry
- private JFormattedTextField amountField;
- private JFormattedTextField rateField;
- private JFormattedTextField numPeriodsField;
- private JFormattedTextField paymentField;
- //Formats to format and parse numbers
- private NumberFormat amountDisplayFormat;
- private NumberFormat amountEditFormat;
- private NumberFormat percentDisplayFormat;
- private NumberFormat percentEditFormat;
- private NumberFormat paymentFormat;
- public FormatterFactoryDemo() {
- super(new BorderLayout());
- setUpFormats();
- double payment = computePayment(amount,
- rate,
- numPeriods);
- //Create the labels.
- amountLabel = new JLabel(amountString);
- rateLabel = new JLabel(rateString);
- numPeriodsLabel = new JLabel(numPeriodsString);
- paymentLabel = new JLabel(paymentString);
- //Create the text fields and set them up.
- amountField = new JFormattedTextField(//格式化文本框
- new DefaultFormatterFactory(//格式化工厂
- new NumberFormatter(amountDisplayFormat),//总数量默认的格式
- new NumberFormatter(amountDisplayFormat),//总数量显示时的格式
- new NumberFormatter(amountEditFormat)));//总数量编辑时的格式
- amountField.setValue(new Double(amount));
- amountField.setColumns(10);
- amountField.addPropertyChangeListener("value", this);
- NumberFormatter percentEditFormatter =//百分比的编辑格式
- new NumberFormatter(percentEditFormat) {
- public String valueToString(Object o)
- throws ParseException {
- Number number = (Number)o;
- if (number != null) {
- double d = number.doubleValue() * 100.0;
- number = new Double(d);
- }
- return super.valueToString(number);
- }
- public Object stringToValue(String s)
- throws ParseException {
- Number number = (Number)super.stringToValue(s);
- if (number != null) {
- double d = number.doubleValue() / 100.0;
- number = new Double(d);
- }
- return number;
- }
- };
- rateField = new JFormattedTextField(
- new DefaultFormatterFactory(
- new NumberFormatter(percentDisplayFormat),
- new NumberFormatter(percentDisplayFormat),
- percentEditFormatter));
- rateField.setValue(new Double(rate));
- rateField.setColumns(10);
- rateField.addPropertyChangeListener("value", this);
- numPeriodsField = new JFormattedTextField();
- numPeriodsField.setValue(new Integer(numPeriods));
- numPeriodsField.setColumns(10);
- numPeriodsField.addPropertyChangeListener("value", this);
- paymentField = new JFormattedTextField(paymentFormat);
- paymentField.setValue(new Double(payment));
- paymentField.setColumns(10);
- paymentField.setEditable(false);
- paymentField.setForeground(Color.red);
- //Tell accessibility tools about label/textfield pairs.
- amountLabel.setLabelFor(amountField);
- rateLabel.setLabelFor(rateField);
- numPeriodsLabel.setLabelFor(numPeriodsField);
- paymentLabel.setLabelFor(paymentField);
- //Lay out the labels in a panel.
- JPanel labelPane = new JPanel(new GridLayout(0,1));
- labelPane.add(amountLabel);
- labelPane.add(rateLabel);
- labelPane.add(numPeriodsLabel);
- labelPane.add(paymentLabel);
- //Layout the text fields in a panel.
- JPanel fieldPane = new JPanel(new GridLayout(0,1));
- fieldPane.add(amountField);
- fieldPane.add(rateField);
- fieldPane.add(numPeriodsField);
- fieldPane.add(paymentField);
- //Put the panels in this panel, labels on left,
- //text fields on right.
- setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
- add(labelPane, BorderLayout.CENTER);
- add(fieldPane, BorderLayout.LINE_END);
- }
- /** Called when a field's "value" property changes. */
- public void propertyChange(PropertyChangeEvent e) {
- Object source = e.getSource();
- if (source == amountField) {
- amount = ((Number)amountField.getValue()).doubleValue();
- } else if (source == rateField) {
- rate = ((Number)rateField.getValue()).doubleValue();
- } else if (source == numPeriodsField) {
- numPeriods = ((Number)numPeriodsField.getValue()).intValue();
- }
- double payment = computePayment(amount, rate, numPeriods);
- paymentField.setValue(new Double(payment));
- }
- /**
- * Create the GUI and show it. For thread safety,
- * this method should be invoked from the
- * event-dispatching thread.
- */
- private static void createAndShowGUI() {
- //Create and set up the window.
- JFrame frame = new JFrame("FormatterFactoryDemo");
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- //Create and set up the content pane.
- JComponent newContentPane = new FormatterFactoryDemo();
- newContentPane.setOpaque(true); //content panes must be opaque
- frame.setContentPane(newContentPane);
- //Display the window.
- frame.pack();
- frame.setVisible(true);
- }
- public static void main(String[] args) {
- //Schedule a job for the event-dispatching thread:
- //creating and showing this application's GUI.
- javax.swing.SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- createAndShowGUI();
- }
- });
- }
- //Compute the monthly payment based on the loan amount,
- //APR, and length of loan.
- double computePayment(double loanAmt, double rate, int numPeriods) {
- double I, partial1, denominator, answer;
- numPeriods *= 12; //get number of months
- if (rate > 0.001) {
- I = rate / 12.0; //get monthly rate from annual
- partial1 = Math.pow((1 + I), (0.0 - numPeriods));
- denominator = (1 - partial1) / I;
- } else { //rate ~= 0
- denominator = numPeriods;
- }
- answer = (-1 * loanAmt) / denominator;
- return answer;
- }
- //Create and set up number formats. These objects also
- //parse numbers input by user.
- private void setUpFormats() {
- amountDisplayFormat = NumberFormat.getCurrencyInstance();//获得货币的格式化实例
- amountDisplayFormat.setMinimumFractionDigits(0);//设置小数部分的最小位数,默认为0
- amountDisplayFormat.setMaximumFractionDigits(10);//设置小数部分的最大位数,默认为0
- amountEditFormat = NumberFormat.getNumberInstance();//获得数字的格式化实例
- amountEditFormat.setMinimumFractionDigits(0);//设置小数部分的最小位数 ,默认为0
- amountEditFormat.setMaximumFractionDigits(10)//设置小数部分的最大位数,默认为0
- percentDisplayFormat = NumberFormat.getPercentInstance();
- percentDisplayFormat.setMinimumFractionDigits(2);//默认小数部分最大为0
- percentEditFormat = NumberFormat.getNumberInstance();
- percentEditFormat.setMinimumFractionDigits(2);//默认小数部分最大为0
- paymentFormat = NumberFormat.getCurrencyInstance();//获得货币的格式化实例
- }
- }
- import java.awt.*;
- import javax.swing.*;
- import javax.swing.text.*;
- import java.util.*;
- import java.text.*;
- public class FormattedSample {
- public static void main (String args[]) throws ParseException {
- JFrame f = new JFrame("JFormattedTextField Sample");
- f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- Container content = f.getContentPane();
- content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS));
- // Four-digit year, followed by month name and day of month,
- // each separated by two dashes (--)
- DateFormat format =
- new SimpleDateFormat("yyyy--MMMM--dd");
- DateFormatter df = new DateFormatter(format);
- JFormattedTextField ftf1 = new
- JFormattedTextField(df);
- ftf1.setValue(new Date());
- content.add(ftf1);
- // US Social Security number
- MaskFormatter mf1 =
- new MaskFormatter("###-##-####");
- mf1.setPlaceholderCharacter('_');
- JFormattedTextField ftf2 = new
- JFormattedTextField(mf1);
- content.add(ftf2);
- // US telephone number
- MaskFormatter mf2 =
- new MaskFormatter("(###) ###-####");
- JFormattedTextField ftf3 = new
- JFormattedTextField(mf2);
- content.add(ftf3);
- f.setSize(300, 100);
- f.show();
- }
- }