特定区域设置的JFormattedTextField货币格式

时间:2012-09-08 02:46:45

标签: java swing locale jformattedtextfield

我使用了以下链接中的信息来显示特定区域设置的货币格式:

How to change the format of a JFormattedTextField at runtime?

但是在更改区域设置时格式没有改变。

这是代码。

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
}

1 个答案:

答案 0 :(得分:5)

如果使用setText,显示将会更改,但值不会更新。您应该使用JFormattedTextField.setValue代替setText(),即:

取代:

currencyField.setText("1234567.89");

使用:

currencyField.setValue(1234567.89);

这是引用How to Use Formatted Text Fields

  

请注意,尽管JFormattedTextField类继承了setText   从JTextField类的方法,你通常不会调用setText   格式化文本字段上的方法。如果你这样做,该字段的显示   相应地改变但是值没有更新(除非字段是   formatter不断更新它。