我使用了以下链接中的信息来显示特定区域设置的货币格式:
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
}
答案 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不断更新它。