JFormattedTextField currency format for specific locale

i have used the information in the below link to display the currency format for specific locale :

How to change the format of a JFormattedTextField?

But the format is not changing, when changing the locale.

here is the code.

package testapp;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

/**
 *
 * @author Sanjeev
 */
public class JFormattedTextFieldAndCurrency extends javax.swing.JFrame {

    private class LocaleInfo implements Comparable<LocaleInfo> {

        private Locale locale;

        public Locale getLocale() {
            return locale;
        }

        public void setLocale(Locale locale) {
            this.locale = locale;
        }

        @Override
        public int compareTo(LocaleInfo localeInfo) {
            return this.locale.getDisplayLanguage().compareTo(localeInfo.locale.getDisplayLanguage());
        }

        @Override
        public String toString() {
            return locale.getDisplayLanguage() + " " + locale.getDisplayCountry();
        }
    }

    public JFormattedTextFieldAndCurrency() {
        initComponents();
        loadLocales();
        localeCombo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                updateField();
            }
        });
        this.setLocationRelativeTo(null);
        this.setTitle("JFormatted Text Field & Currency");
        updateField();
    }

    private void loadLocales() {
        DefaultComboBoxModel<LocaleInfo> localeModel = new DefaultComboBoxModel<>();
        localeCombo.setModel(localeModel);
        ArrayList<LocaleInfo> localeInfos = new ArrayList<>();
        for (Locale locale : Locale.getAvailableLocales()) {
            LocaleInfo localeIno = new LocaleInfo();
            localeIno.setLocale(locale);
            localeInfos.add(localeIno);
        }
        Collections.sort(localeInfos);
        for (LocaleInfo localeInfo : localeInfos) {
            localeModel.addElement(localeInfo);
        }
        infoLabel.setText(localeModel.getSize() + " Locales available.");
    }

    private void updateField() {
        LocaleInfo localeInfo = (LocaleInfo) localeCombo.getSelectedItem();
        NumberFormatter currencyFormatter = new NumberFormatter(NumberFormat.getCurrencyInstance(localeInfo.getLocale()));
        DefaultFormatterFactory currencyFormatterFactory = new DefaultFormatterFactory(currencyFormatter, currencyFormatter, currencyFormatter);
        currencyField.setFormatterFactory(currencyFormatterFactory);
        currencyField.setText("1234567.89");
        System.out.println("currency format set to : "+localeInfo.locale.getDisplayCountry());
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        localisationPanel = new JPanel();
        jLabel11 = new JLabel();
        localeCombo = new JComboBox();
        infoLabel = new JLabel();
        currencyField = new JFormattedTextField();
        jLabel1 = new JLabel();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);

        jLabel11.setText("Select Locale : ");

        jLabel1.setHorizontalAlignment(SwingConstants.TRAILING);
        jLabel1.setText("Currency : ");

        GroupLayout localisationPanelLayout = new GroupLayout(localisationPanel);
        localisationPanel.setLayout(localisationPanelLayout);
        localisationPanelLayout.setHorizontalGroup(
            localisationPanelLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(Alignment.TRAILING, localisationPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(localisationPanelLayout.createParallelGroup(Alignment.TRAILING)
                    .addComponent(infoLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(Alignment.LEADING, localisationPanelLayout.createSequentialGroup()
                        .addGroup(localisationPanelLayout.createParallelGroup(Alignment.LEADING, false)
                            .addComponent(jLabel11, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabel1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addGroup(localisationPanelLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(currencyField)
                            .addComponent(localeCombo, 0, 256, Short.MAX_VALUE))))
                .addContainerGap())
        );
        localisationPanelLayout.setVerticalGroup(
            localisationPanelLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(localisationPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(localisationPanelLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(jLabel11)
                    .addComponent(localeCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addGroup(localisationPanelLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(currencyField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addPreferredGap(ComponentPlacement.RELATED, 68, Short.MAX_VALUE)
                .addComponent(infoLabel, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        getContentPane().add(localisationPanel, BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JFormattedTextFieldAndCurrency().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private JFormattedTextField currencyField;
    private JLabel infoLabel;
    private JLabel jLabel1;
    private JLabel jLabel11;
    private JComboBox localeCombo;
    private JPanel localisationPanel;
    // End of variables declaration//GEN-END:variables
}

Answers


If you do use setText the display will change but the value will not get updated. You should use JFormattedTextField.setValue instead of setText(), ie:

replace:

currencyField.setText("1234567.89");

with:

currencyField.setValue(1234567.89);

Here is a quote How to Use Formatted Text Fields:

Note that although the JFormattedTextField class inherits the setText method from the JTextField class, you do not usually call the setText method on a formatted text field. If you do, the field's display changes accordingly but the value is not updated (unless the field's formatter updates it constantly).


Need Your Help

How to replace Fragment with FragmentActivity

android android-fragments replace fragment android-fragmentactivity

I'm trying to load a FragmentActivity from another FragmentActivity (instead of a Fragment), but am getting an error. Is there a way to accomplish this?

creating a toggle function in emacs

function emacs transparency toggle

How to get a function that toggles transparency for instance?

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.