<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FSwing%2FJFromattedField_MaskFormatter</id>
		<title>Java Tutorial/Swing/JFromattedField MaskFormatter - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FSwing%2FJFromattedField_MaskFormatter"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/JFromattedField_MaskFormatter&amp;action=history"/>
		<updated>2026-04-22T01:49:04Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/JFromattedField_MaskFormatter&amp;diff=3919&amp;oldid=prev</id>
		<title> в 17:44, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/JFromattedField_MaskFormatter&amp;diff=3919&amp;oldid=prev"/>
				<updated>2010-05-31T17:44:27Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 17:44, 31 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/JFromattedField_MaskFormatter&amp;diff=3920&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/JFromattedField_MaskFormatter&amp;diff=3920&amp;oldid=prev"/>
				<updated>2010-05-31T15:32:44Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==  Apply a mask to String ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javax.swing.text.MaskFormatter;&lt;br /&gt;
public class Main {&lt;br /&gt;
  &lt;br /&gt;
  public static void main(String args[]) throws Exception {&lt;br /&gt;
    MaskFormatter mf = new MaskFormatter(&amp;quot;A-AAAA-AAAA-A&amp;quot;);&lt;br /&gt;
    mf.setValueContainsLiteralCharacters(false);&lt;br /&gt;
    System.out.println(mf.valueToString(&amp;quot;123123123123&amp;quot;));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
//1-2312-3123-1&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Formatted Masked Input: new MaskFormatter(###-##-####) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.awt.FlowLayout;&lt;br /&gt;
import java.text.ParseException;&lt;br /&gt;
import javax.swing.BoxLayout;&lt;br /&gt;
import javax.swing.JFormattedTextField;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.text.MaskFormatter;&lt;br /&gt;
public class MaskInputSample {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    JFrame frame = new JFrame(&amp;quot;Mask Input&amp;quot;);&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    JLabel label;&lt;br /&gt;
    JFormattedTextField input;&lt;br /&gt;
    JPanel panel;&lt;br /&gt;
    MaskFormatter formatter;&lt;br /&gt;
    BoxLayout layout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);&lt;br /&gt;
    frame.setLayout(layout);&lt;br /&gt;
    try {&lt;br /&gt;
      label = new JLabel(&amp;quot;SSN&amp;quot;);&lt;br /&gt;
      formatter = new MaskFormatter(&amp;quot;###&amp;quot;-##&amp;quot;-####&amp;quot;);&lt;br /&gt;
      input = new JFormattedTextField(formatter);&lt;br /&gt;
      input.setValue(&amp;quot;123-45-6789&amp;quot;);&lt;br /&gt;
      input.setColumns(20);&lt;br /&gt;
      panel = new JPanel();&lt;br /&gt;
      panel.add(label);&lt;br /&gt;
      panel.add(input);&lt;br /&gt;
      frame.add(panel);&lt;br /&gt;
    } catch (ParseException e) {&lt;br /&gt;
      System.err.println(&amp;quot;Unable to add SSN&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Formatted Masked Input: new MaskFormatter((###)###-####) (For phone number) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.text.ParseException;&lt;br /&gt;
import javax.swing.BoxLayout;&lt;br /&gt;
import javax.swing.JFormattedTextField;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.text.MaskFormatter;&lt;br /&gt;
public class MaskInputSample2 {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    JFrame frame = new JFrame(&amp;quot;Mask Input&amp;quot;);&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    JLabel label;&lt;br /&gt;
    JFormattedTextField input;&lt;br /&gt;
    JPanel panel;&lt;br /&gt;
    MaskFormatter formatter;&lt;br /&gt;
    BoxLayout layout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);&lt;br /&gt;
    frame.setLayout(layout);&lt;br /&gt;
    try {&lt;br /&gt;
      label = new JLabel(&amp;quot;SSN&amp;quot;);&lt;br /&gt;
      formatter = new MaskFormatter(&amp;quot;&amp;quot;(###&amp;quot;)&amp;quot; ###&amp;quot;-####&amp;quot;);&lt;br /&gt;
      input = new JFormattedTextField(formatter);&lt;br /&gt;
      input.setValue(&amp;quot;(123) 145-6789&amp;quot;);&lt;br /&gt;
      input.setColumns(20);&lt;br /&gt;
      panel = new JPanel();&lt;br /&gt;
      panel.add(label);&lt;br /&gt;
      panel.add(input);&lt;br /&gt;
      frame.add(panel);&lt;br /&gt;
    } catch (ParseException e) {&lt;br /&gt;
      System.err.println(&amp;quot;Unable to add SSN&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Input Masks Summary Table ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CharacterDescription#Matches numeric character (Character.isDigit())HMatches hexadecimal number (0-9, a-f, and A-F)AMatches alphanumeric character (Character.is LetterOrDigit())?Matches alphabetic character (Character.isLetter())UMatches uppercase letter; maps lowercase to uppercaseLMatches lowercase letter; maps uppercase to lowercase*Wildcard, matches any character&amp;quot;Escape character to have literal strings/separators in input field&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Regex Formatter with a JFormattedTextField ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Sun grants you (&amp;quot;Licensee&amp;quot;) a non-exclusive, royalty free, license to use,&lt;br /&gt;
 * modify and redistribute this software in source and binary code form,&lt;br /&gt;
 * provided that i) this copyright notice and license appear on all copies of&lt;br /&gt;
 * the software; and ii) Licensee does not utilize the software in a manner&lt;br /&gt;
 * which is disparaging to Sun.&lt;br /&gt;
 *&lt;br /&gt;
 * This software is provided &amp;quot;AS IS,&amp;quot; without a warranty of any kind. ALL&lt;br /&gt;
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY&lt;br /&gt;
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR&lt;br /&gt;
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE&lt;br /&gt;
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING&lt;br /&gt;
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS&lt;br /&gt;
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,&lt;br /&gt;
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER&lt;br /&gt;
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF&lt;br /&gt;
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
 *&lt;br /&gt;
 * This software is not designed or intended for use in on-line control of&lt;br /&gt;
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in&lt;br /&gt;
 * the design, construction, operation or maintenance of any nuclear&lt;br /&gt;
 * facility. Licensee represents and warrants that it will not use or&lt;br /&gt;
 * redistribute the Software for such purposes.&lt;br /&gt;
 */    &lt;br /&gt;
    &lt;br /&gt;
import java.text.ParseException;&lt;br /&gt;
import java.util.regex.Matcher;&lt;br /&gt;
import java.util.regex.Pattern;&lt;br /&gt;
import java.util.regex.PatternSyntaxException;&lt;br /&gt;
import javax.swing.JFormattedTextField;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JTextField;&lt;br /&gt;
import javax.swing.text.DefaultFormatter;&lt;br /&gt;
/**&lt;br /&gt;
 * A regular expression based implementation of AbstractFormatter.&lt;br /&gt;
 */&lt;br /&gt;
class RegexFormatter extends DefaultFormatter {&lt;br /&gt;
  private Pattern pattern;&lt;br /&gt;
  private Matcher matcher;&lt;br /&gt;
  public RegexFormatter() {&lt;br /&gt;
    super();&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a regular expression based AbstractFormatter.&lt;br /&gt;
   * pattern specifies the regular expression that will be used&lt;br /&gt;
   * to determine if a value is legal.&lt;br /&gt;
   */&lt;br /&gt;
  public RegexFormatter(String pattern) throws PatternSyntaxException {&lt;br /&gt;
    this();&lt;br /&gt;
    setPattern(Pattern.rupile(pattern));&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a regular expression based AbstractFormatter.&lt;br /&gt;
   * pattern specifies the regular expression that will be used&lt;br /&gt;
   * to determine if a value is legal.&lt;br /&gt;
   */&lt;br /&gt;
  public RegexFormatter(Pattern pattern) {&lt;br /&gt;
    this();&lt;br /&gt;
    setPattern(pattern);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the pattern that will be used to determine if a value is legal.&lt;br /&gt;
   */&lt;br /&gt;
  public void setPattern(Pattern pattern) {&lt;br /&gt;
    this.pattern = pattern;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the Pattern used to determine if a value is legal.&lt;br /&gt;
   */&lt;br /&gt;
  public Pattern getPattern() {&lt;br /&gt;
    return pattern;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the Matcher used in the most recent test if a value is&lt;br /&gt;
   * legal.&lt;br /&gt;
   */&lt;br /&gt;
  protected void setMatcher(Matcher matcher) {&lt;br /&gt;
    this.matcher = matcher;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the Matcher from the most test.&lt;br /&gt;
   */&lt;br /&gt;
  protected Matcher getMatcher() {&lt;br /&gt;
    return matcher;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Parses text returning an arbitrary Object. Some formatters&lt;br /&gt;
   * may return null.&lt;br /&gt;
   * &lt;br /&gt;
   * If a Pattern has been specified and the text completely&lt;br /&gt;
   * matches the regular expression this will invoke setMatcher.&lt;br /&gt;
   * &lt;br /&gt;
   * @throws ParseException&lt;br /&gt;
   *           if there is an error in the conversion&lt;br /&gt;
   * @param text&lt;br /&gt;
   *          String to convert&lt;br /&gt;
   * @return Object representation of text&lt;br /&gt;
   */&lt;br /&gt;
  public Object stringToValue(String text) throws ParseException {&lt;br /&gt;
    Pattern pattern = getPattern();&lt;br /&gt;
    if (pattern != null) {&lt;br /&gt;
      Matcher matcher = pattern.matcher(text);&lt;br /&gt;
      if (matcher.matches()) {&lt;br /&gt;
        setMatcher(matcher);&lt;br /&gt;
        return super.stringToValue(text);&lt;br /&gt;
      }&lt;br /&gt;
      throw new ParseException(&amp;quot;Pattern did not match&amp;quot;, 0);&lt;br /&gt;
    }&lt;br /&gt;
    return text;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class UsingRegexFormatter {&lt;br /&gt;
  public static void main(String[] a){&lt;br /&gt;
    JFrame frame = new JFrame();&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
   JFormattedTextField formattedField = new JFormattedTextField(new RegexFormatter(&amp;quot;\\(\\d{3}\\)\\d{3}-\\d{4}&amp;quot;));&lt;br /&gt;
    frame.add(formattedField,&amp;quot;North&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    frame.add(new JTextField(),&amp;quot;South&amp;quot;);&lt;br /&gt;
    frame.setSize(300, 200);&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Work with DefaultFormatterFactory ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.beans.PropertyChangeEvent;&lt;br /&gt;
import java.beans.PropertyChangeListener;&lt;br /&gt;
import java.text.NumberFormat;&lt;br /&gt;
import java.text.ParseException;&lt;br /&gt;
import javax.swing.BorderFactory;&lt;br /&gt;
import javax.swing.JFormattedTextField;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import javax.swing.UIManager;&lt;br /&gt;
import javax.swing.text.DefaultFormatterFactory;&lt;br /&gt;
import javax.swing.text.NumberFormatter;&lt;br /&gt;
/**&lt;br /&gt;
 * FormatterFactoryDemo.java requires no other files.&lt;br /&gt;
 */&lt;br /&gt;
public class FormatterFactoryDemo extends JPanel implements&lt;br /&gt;
    PropertyChangeListener {&lt;br /&gt;
  // Values for the text fields&lt;br /&gt;
  private double amount = 100000;&lt;br /&gt;
  private double rate = .075; // 7.5 %&lt;br /&gt;
  private int numPeriods = 30;&lt;br /&gt;
  // Labels to identify the fields&lt;br /&gt;
  private JLabel amountLabel;&lt;br /&gt;
  private JLabel rateLabel;&lt;br /&gt;
  private JLabel numPeriodsLabel;&lt;br /&gt;
  private JLabel paymentLabel;&lt;br /&gt;
  // Strings for the labels&lt;br /&gt;
  private static String amountString = &amp;quot;Loan Amount: &amp;quot;;&lt;br /&gt;
  private static String rateString = &amp;quot;APR (%): &amp;quot;;&lt;br /&gt;
  private static String numPeriodsString = &amp;quot;Years: &amp;quot;;&lt;br /&gt;
  private static String paymentString = &amp;quot;Monthly Payment: &amp;quot;;&lt;br /&gt;
  // Fields for data entry&lt;br /&gt;
  private JFormattedTextField amountField;&lt;br /&gt;
  private JFormattedTextField rateField;&lt;br /&gt;
  private JFormattedTextField numPeriodsField;&lt;br /&gt;
  private JFormattedTextField paymentField;&lt;br /&gt;
  // Formats to format and parse numbers&lt;br /&gt;
  private NumberFormat amountDisplayFormat;&lt;br /&gt;
  private NumberFormat amountEditFormat;&lt;br /&gt;
  private NumberFormat percentDisplayFormat;&lt;br /&gt;
  private NumberFormat percentEditFormat;&lt;br /&gt;
  private NumberFormat paymentFormat;&lt;br /&gt;
  public FormatterFactoryDemo() {&lt;br /&gt;
    super(new BorderLayout());&lt;br /&gt;
    setUpFormats();&lt;br /&gt;
    double payment = computePayment(amount, rate, numPeriods);&lt;br /&gt;
    // Create the labels.&lt;br /&gt;
    amountLabel = new JLabel(amountString);&lt;br /&gt;
    rateLabel = new JLabel(rateString);&lt;br /&gt;
    numPeriodsLabel = new JLabel(numPeriodsString);&lt;br /&gt;
    paymentLabel = new JLabel(paymentString);&lt;br /&gt;
    // Create the text fields and set them up.&lt;br /&gt;
    amountField = new JFormattedTextField(new DefaultFormatterFactory(&lt;br /&gt;
        new NumberFormatter(amountDisplayFormat), new NumberFormatter(&lt;br /&gt;
            amountDisplayFormat), new NumberFormatter(amountEditFormat)));&lt;br /&gt;
    amountField.setValue(new Double(amount));&lt;br /&gt;
    amountField.setColumns(10);&lt;br /&gt;
    amountField.addPropertyChangeListener(&amp;quot;value&amp;quot;, this);&lt;br /&gt;
    NumberFormatter percentEditFormatter = new NumberFormatter(&lt;br /&gt;
        percentEditFormat) {&lt;br /&gt;
      public String valueToString(Object o) throws ParseException {&lt;br /&gt;
        Number number = (Number) o;&lt;br /&gt;
        if (number != null) {&lt;br /&gt;
          double d = number.doubleValue() * 100.0;&lt;br /&gt;
          number = new Double(d);&lt;br /&gt;
        }&lt;br /&gt;
        return super.valueToString(number);&lt;br /&gt;
      }&lt;br /&gt;
      public Object stringToValue(String s) throws ParseException {&lt;br /&gt;
        Number number = (Number) super.stringToValue(s);&lt;br /&gt;
        if (number != null) {&lt;br /&gt;
          double d = number.doubleValue() / 100.0;&lt;br /&gt;
          number = new Double(d);&lt;br /&gt;
        }&lt;br /&gt;
        return number;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    rateField = new JFormattedTextField(new DefaultFormatterFactory(&lt;br /&gt;
        new NumberFormatter(percentDisplayFormat), new NumberFormatter(&lt;br /&gt;
            percentDisplayFormat), percentEditFormatter));&lt;br /&gt;
    rateField.setValue(new Double(rate));&lt;br /&gt;
    rateField.setColumns(10);&lt;br /&gt;
    rateField.addPropertyChangeListener(&amp;quot;value&amp;quot;, this);&lt;br /&gt;
    numPeriodsField = new JFormattedTextField();&lt;br /&gt;
    numPeriodsField.setValue(new Integer(numPeriods));&lt;br /&gt;
    numPeriodsField.setColumns(10);&lt;br /&gt;
    numPeriodsField.addPropertyChangeListener(&amp;quot;value&amp;quot;, this);&lt;br /&gt;
    paymentField = new JFormattedTextField(paymentFormat);&lt;br /&gt;
    paymentField.setValue(new Double(payment));&lt;br /&gt;
    paymentField.setColumns(10);&lt;br /&gt;
    paymentField.setEditable(false);&lt;br /&gt;
    paymentField.setForeground(Color.red);&lt;br /&gt;
    // Tell accessibility tools about label/textfield pairs.&lt;br /&gt;
    amountLabel.setLabelFor(amountField);&lt;br /&gt;
    rateLabel.setLabelFor(rateField);&lt;br /&gt;
    numPeriodsLabel.setLabelFor(numPeriodsField);&lt;br /&gt;
    paymentLabel.setLabelFor(paymentField);&lt;br /&gt;
    // Lay out the labels in a panel.&lt;br /&gt;
    JPanel labelPane = new JPanel(new GridLayout(0, 1));&lt;br /&gt;
    labelPane.add(amountLabel);&lt;br /&gt;
    labelPane.add(rateLabel);&lt;br /&gt;
    labelPane.add(numPeriodsLabel);&lt;br /&gt;
    labelPane.add(paymentLabel);&lt;br /&gt;
    // Layout the text fields in a panel.&lt;br /&gt;
    JPanel fieldPane = new JPanel(new GridLayout(0, 1));&lt;br /&gt;
    fieldPane.add(amountField);&lt;br /&gt;
    fieldPane.add(rateField);&lt;br /&gt;
    fieldPane.add(numPeriodsField);&lt;br /&gt;
    fieldPane.add(paymentField);&lt;br /&gt;
    // Put the panels in this panel, labels on left,&lt;br /&gt;
    // text fields on right.&lt;br /&gt;
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));&lt;br /&gt;
    add(labelPane, BorderLayout.CENTER);&lt;br /&gt;
    add(fieldPane, BorderLayout.LINE_END);&lt;br /&gt;
  }&lt;br /&gt;
  /** Called when a field&amp;quot;s &amp;quot;value&amp;quot; property changes. */&lt;br /&gt;
  public void propertyChange(PropertyChangeEvent e) {&lt;br /&gt;
    Object source = e.getSource();&lt;br /&gt;
    if (source == amountField) {&lt;br /&gt;
      amount = ((Number) amountField.getValue()).doubleValue();&lt;br /&gt;
    } else if (source == rateField) {&lt;br /&gt;
      rate = ((Number) rateField.getValue()).doubleValue();&lt;br /&gt;
    } else if (source == numPeriodsField) {&lt;br /&gt;
      numPeriods = ((Number) numPeriodsField.getValue()).intValue();&lt;br /&gt;
    }&lt;br /&gt;
    double payment = computePayment(amount, rate, numPeriods);&lt;br /&gt;
    paymentField.setValue(new Double(payment));&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Create the GUI and show it. For thread safety, this method should be&lt;br /&gt;
   * invoked from the event dispatch thread.&lt;br /&gt;
   */&lt;br /&gt;
  private static void createAndShowGUI() {&lt;br /&gt;
    // Create and set up the window.&lt;br /&gt;
    JFrame frame = new JFrame(&amp;quot;FormatterFactoryDemo&amp;quot;);&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    // Add contents to the window.&lt;br /&gt;
    frame.add(new FormatterFactoryDemo());&lt;br /&gt;
    // Display the window.&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    // Schedule a job for the event dispatch thread:&lt;br /&gt;
    // creating and showing this application&amp;quot;s GUI.&lt;br /&gt;
    SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        // Turn off metal&amp;quot;s use of bold fonts&lt;br /&gt;
        UIManager.put(&amp;quot;swing.boldMetal&amp;quot;, Boolean.FALSE);&lt;br /&gt;
        createAndShowGUI();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  // Compute the monthly payment based on the loan amount,&lt;br /&gt;
  // APR, and length of loan.&lt;br /&gt;
  double computePayment(double loanAmt, double rate, int numPeriods) {&lt;br /&gt;
    double I, partial1, denominator, answer;&lt;br /&gt;
    numPeriods *= 12; // get number of months&lt;br /&gt;
    if (rate &amp;gt; 0.001) {&lt;br /&gt;
      I = rate / 12.0; // get monthly rate from annual&lt;br /&gt;
      partial1 = Math.pow((1 + I), (0.0 - numPeriods));&lt;br /&gt;
      denominator = (1 - partial1) / I;&lt;br /&gt;
    } else { // rate ~= 0&lt;br /&gt;
      denominator = numPeriods;&lt;br /&gt;
    }&lt;br /&gt;
    answer = (-1 * loanAmt) / denominator;&lt;br /&gt;
    return answer;&lt;br /&gt;
  }&lt;br /&gt;
  // Create and set up number formats. These objects also&lt;br /&gt;
  // parse numbers input by user.&lt;br /&gt;
  private void setUpFormats() {&lt;br /&gt;
    amountDisplayFormat = NumberFormat.getCurrencyInstance();&lt;br /&gt;
    amountDisplayFormat.setMinimumFractionDigits(0);&lt;br /&gt;
    amountEditFormat = NumberFormat.getNumberInstance();&lt;br /&gt;
    percentDisplayFormat = NumberFormat.getPercentInstance();&lt;br /&gt;
    percentDisplayFormat.setMinimumFractionDigits(2);&lt;br /&gt;
    percentEditFormat = NumberFormat.getNumberInstance();&lt;br /&gt;
    percentEditFormat.setMinimumFractionDigits(2);&lt;br /&gt;
    paymentFormat = NumberFormat.getCurrencyInstance();&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>