【问题标题】:jFormatedTextField currency format on real time user inputjFormatedTextField 实时用户输入的货币格式
【发布时间】:2016-09-12 19:03:03
【问题描述】:

这是我的代码:

// create the formatters, default, display, edit
NumberFormatter defaultFormatter = new NumberFormatter(new DecimalFormat("#.##"));
NumberFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#.##€"));
NumberFormatter editFormatter = new NumberFormatter(new DecimalFormat("#.##")); 
// set their value classes
defaultFormatter.setValueClass(Double.class);
displayFormatter.setValueClass(Double.class);
editFormatter.setValueClass(Double.class);   
// create and set the DefaultFormatterFactory
DefaultFormatterFactory valueFactory = new DefaultFormatterFactory(defaultFormatter,displayFormatter,editFormatter);
jFormattedTextField4.setFormatterFactory(valueFactory);
jFormattedTextField1.setFormatterFactory(valueFactory);

当用户输入一个带有点的值时,我遇到了问题,例如 (2.33) ,formatedtextfield 更改为 (2€) ,这是不应该的,因为用户输入了一个有效值。 如果用户输入 (2,33) 结果是 (2,33) 并且再次不应该是,因为应该是 (2.33)

基本上我总是想要格式(X.XX)。 示例:

输入与我想要的: 2-2.00€ / 2,22-2.22€ / 312.54-312.54€ / 432-432.00€ / 2,2-2.20€

已编辑:一周前这是可行的,在我将这个项目安装在另一个窗口中后,问题出现了。此时我有一个葡萄牙语键盘。问题是否可能与任何 Windows 或系统属性有关?

已编辑:我仍在寻求帮助。任何人??? :s

【问题讨论】:

    标签: java swing format currency jformattedtextfield


    【解决方案1】:
    • 你必须使用getCurrencyInstance(),而不是普通的DecimalFormat,确保你的描述有问题(“one week ago this was working, after i mount this project in another windows the issue appear....”)

    • 和/或您可以在那里定义受Locale限制的格式化程序

    • 我不会使用CurrencyInstance,这对我来说不是很好,可以通过使用NavigationFilter 和字符来强制使用真正的简写名称(例如Euro = EUR)与setDot/moveDotcode example by @camickr在行中的位置

    • 这里是简单的标准,你需要的默认值,

    import java.awt.*;
    import java.awt.font.TextAttribute;
    import java.math.*;
    import java.text.*;
    import java.util.Map;
    import javax.swing.*;
    import javax.swing.JFormattedTextField.*;
    import javax.swing.event.*;
    import javax.swing.text.InternationalFormatter;
    
    public class DocumentListenerAdapter {
    
        public DocumentListenerAdapter() {
            JFrame frame = new JFrame("AbstractTextField Test");
            final JFormattedTextField textField1 = new JFormattedTextField(new Double(10.01));
            textField1.setFormatterFactory(new AbstractFormatterFactory() {
                @Override
                public AbstractFormatter getFormatter(JFormattedTextField tf) {
                    NumberFormat format = DecimalFormat.getCurrencyInstance();
                    format.setMinimumFractionDigits(2);
                    format.setMaximumFractionDigits(2);
                    format.setRoundingMode(RoundingMode.HALF_UP);
                    InternationalFormatter formatter = new InternationalFormatter(format);
                    formatter.setAllowsInvalid(false);
                    //formatter.setMinimum(0.0);
                    //formatter.setMaximum(1000.00);
                    return formatter;
                }
            });
            final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes();
            attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
            final JFormattedTextField textField2 = new JFormattedTextField(new Double(10.01));
            textField2.setFormatterFactory(new AbstractFormatterFactory() {
                @Override
                public AbstractFormatter getFormatter(JFormattedTextField tf) {
                    NumberFormat format = DecimalFormat.getInstance();
                    format.setMinimumFractionDigits(3);
                    format.setMaximumFractionDigits(3);
                    format.setRoundingMode(RoundingMode.HALF_UP);
                    InternationalFormatter formatter = new InternationalFormatter(format);
                    formatter.setAllowsInvalid(false);
                    //formatter.setMinimum(0.0);
                    //formatter.setMaximum(1000.00);
                    return formatter;
                }
            });
            textField2.getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void changedUpdate(DocumentEvent documentEvent) {
                    printIt(documentEvent);
                }
    
                @Override
                public void insertUpdate(DocumentEvent documentEvent) {
                    printIt(documentEvent);
                }
    
                @Override
                public void removeUpdate(DocumentEvent documentEvent) {
                    printIt(documentEvent);
                }
    
                private void printIt(DocumentEvent documentEvent) {
                    DocumentEvent.EventType type = documentEvent.getType();
                    double t1a1 = (((Number) textField2.getValue()).doubleValue());
                    if (t1a1 > 1000) {
                        Runnable doRun = new Runnable() {
                            @Override
                            public void run() {
                                textField2.setFont(new Font(attributes));
                                textField2.setForeground(Color.red);
                            }
                        };
                        SwingUtilities.invokeLater(doRun);
                    } else {
                        Runnable doRun = new Runnable() {
                            @Override
                            public void run() {
                                textField2.setFont(new Font("Serif", Font.BOLD, 16));
                                textField2.setForeground(Color.black);
                            }
                        };
                        SwingUtilities.invokeLater(doRun);
                    }
                }
            });
            //https://stackoverflow.com/a/20008786/714968
            JFormattedTextField jftf2 = new JFormattedTextField();
            final InternationalFormatter fmt = new InternationalFormatter(
                    new MessageFormat("{0,number,000}-{1,number,0000}"));
            jftf2.setFormatterFactory(new JFormattedTextField.AbstractFormatterFactory() {
                @Override
                public JFormattedTextField.AbstractFormatter getFormatter(JFormattedTextField tf) {
                    return fmt;
                }
            });
            jftf2.setValue(new Object[]{111, 1234});
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(textField1, BorderLayout.NORTH);
            frame.add(textField2, BorderLayout.CENTER);
            frame.add(jftf2, BorderLayout.SOUTH);
            frame.setVisible(true);
            frame.pack();
        }
    
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    DocumentListenerAdapter main = new DocumentListenerAdapter();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多