Mega Code Archive

 
Categories / Java / Swing JFC
 

Formatter Factory Demo

/* From http://java.sun.com/docs/books/tutorial/index.html */ /*  * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  * -Redistribution of source code must retain the above copyright notice, this  *  list of conditions and the following disclaimer.  *  * -Redistribution in binary form must reproduce the above copyright notice,  *  this list of conditions and the following disclaimer in the documentation  *  and/or other materials provided with the distribution.  *  * Neither the name of Sun Microsystems, Inc. or the names of contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *  * This software is provided "AS IS," without a warranty of any kind. ALL  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING  * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE  * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")  * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE  * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS  * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  *  * You acknowledge that this software is not designed, licensed or intended  * for use in the design, construction, operation or maintenance of any  * nuclear facility.  */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.NumberFormat; import java.text.ParseException; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.NumberFormatter; /**  * FormatterFactoryDemo.java is a 1.4 example that  * 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() {         //Make sure we have nice window decorations.         JFrame.setDefaultLookAndFeelDecorated(true);         //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);         amountEditFormat = NumberFormat.getNumberInstance();         percentDisplayFormat = NumberFormat.getPercentInstance();         percentDisplayFormat.setMinimumFractionDigits(2);         percentEditFormat = NumberFormat.getNumberInstance();         percentEditFormat.setMinimumFractionDigits(2);         paymentFormat = NumberFormat.getCurrencyInstance();     } }