本文介绍了Java:JFormattedTextField保存数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我想将数字(金额)输入到特定限制,因此使用了JFormattedTextField。限制为12345678.99,即。之前的8位数。和。之后的2。等等。这是我的实现代码,但它没有按预期结果。

In my application I want to input numbers (amounts) to a specific limit, and hence have used JFormattedTextField. Limit like "12345678.99" i.e. 8 digits before "." and 2 after "." or so on. This is my implementation code, but it doesn't result as expected.

    startBalTxt.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("########.##"))));
    startBalTxt.setText(resourceMap.getString("startBalTxt.text")); // NOI18N
    startBalTxt.setFont(Utility.getTextFont());
    startBalTxt.setName("startBalTxt"); // NOI18N







  INPUT                RESULT
"12345678905.99"   => "12345678906"      ==> Should give "12345678.99" or "12345679.99"
"12345678.555"     => "12345678.56"      ==> CORRECT
"1234567890123456" => "1234567890123456" ==> Absolutely wrong in all aspects

我哪里错了?以及如何按照我的预期使其正常工作。

Where am I going wrong ? And how to make this working as I am expecting it.

StanislavL建议的更新:

    numberFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
    numberFormat.setMaximumFractionDigits(2);
    numberFormat.setMaximumIntegerDigits(8);
    numberFormat.setMinimumFractionDigits(0);
    numberFormat.setMinimumIntegerDigits(2);

    nfr = new NumberFormatter(numberFormat);

    initComponents();
    myParent = parent;
    this.startBalTxt.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nfr));

    Results ->  4562147896.45  == > 62,147,896.45

它遵守了真实的限制,但它消除了以前的数字,而不是以后的数字。我的意思是在4562147896.45而不是4596不应该被淘汰。

Its obeying the limit that's true, but its eliminating previous numbers instead of later. I mean in 4562147896.45 instead of "45" "96" shouldn't be eliminated.

推荐答案

甚至 JFormattedTextField 实现 DecimalFormat NumberFormat ,最好使用 DocumentListener

even JFormattedTextField implements DecimalFormat and NumberFormat, better would be use DocumentListener,

1)使用<$ c跳过大数字之间的差距不大实现setMinimum()$ c> DecimalFormat 或 NumberFormat 简单用户不可接受和setMaximum()

1) its not good jumping betweens Big Figures by using DecimalFormat or NumberFormat simple User-non-Acceptable by implements setMinimum() and setMaximum()

2) JTextComponents 默认情况下实现插入文本,然后任何解决方法都是<$ c通过implements JFormattedTextField 使用 DecimalFormat User-non-Acceptable $ c> NumberFormat by implements setMinimum()和setMaximum()

2) JTextComponents by default implements insert the text, then any workaround is so User-non-Acceptable by implementsJFormattedTextField with DecimalFormat orNumberFormat by implements setMinimum() and setMaximum()

3)它非常舒适的使用 DocumentListener 允许添加任何金额,但突出显示范围

3) its very confortable je use DocumentListener allows add any amount, but with highlighting out-off range

4)或使用 JSpinner SpinnerNumberModel ,可以设置Formatter和Number Instance

4) or use JSpinner with SpinnerNumberModel, there is posible to set Formatter as for Number Instance

InternationalFormatter的例子 DocumentListener 一起

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 static void main(String args[]) {
        JFrame frame = new JFrame("AbstractTextField Test");
        final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01));
        textField1.setFormatterFactory(new AbstractFormatterFactory() {

            @Override
            public AbstractFormatter getFormatter(JFormattedTextField tf) {
                NumberFormat format = DecimalFormat.getInstance();
                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 Float(10.01));
        textField2.setFormatterFactory(new AbstractFormatterFactory() {

            @Override
            public AbstractFormatter getFormatter(JFormattedTextField tf) {
                NumberFormat format = DecimalFormat.getInstance();
                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;
            }
        });
        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);
                }
            }
        });
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textField1, BorderLayout.NORTH);
        frame.add(textField2, BorderLayout.SOUTH);
        frame.setVisible(true);
        frame.pack();
    }

    private DocumentListenerAdapter() {
    }
}

这篇关于Java:JFormattedTextField保存数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-24 08:49