Search code examples
javaswingjformattedtextfieldnumberformatter

JFormattedTextField value is different then what I have set


I am using JFormattedTextField to display percentage values in a text field as below:

NumberFormat percentDisplayFormat = NumberFormat.getPercentInstance();
NumberFormat editFormat = NumberFormat.getNumberInstance();

percentDisplayFormat.setMinimumFractionDigits(2);

NumberFormatter percentEditFormatter = new NumberFormatter(editFormat);

JFormattedTextField jftfPercentage = new JFormattedTextField(new DefaultFormatterFactory(new NumberFormatter(percentDisplayFormat), new NumberFormatter(percentDisplayFormat), percentEditFormatter));

jftfPercentage.setBounds(113, 95, 236, 21);
jftfPercentage.setName("JftfPercentage");

And setting the value like below:

jftfPercentage.setValue(<someDoubleValue>);

Now, suppose I have set the value as 80, then it is displaying the value as 8000%.
But, whenever I click on the field, it is displaying as 80 only.

Can someone help me on displaying the same value that we set. Thanks in advance


Solution

  • I got the issue here. Internally the default number formatter multiplies the given value with 100 while displaying it. (If we use the PercentInstance)

    NumberFormat percentDisplayFormat = NumberFormat.getPercentInstance();
    NumberFormat editFormat = NumberFormat.getNumberInstance();
    
    percentDisplayFormat.setMinimumFractionDigits(2);
    
    NumberFormatter percentEditFormatter = new NumberFormatter(editFormat);
    
    // This was the new change that I have made
    NumberFormatter percentDisplayFormatter = new NumberFormatter(percentDisplayFormat)
    {
        @Override
        public String valueToString(Object o) throws ParseException
        {
            Double number = null;
            if (o != null)
            {
                number = Double.valueOf(o.toString());
                number /= 100;
            }
            // In super class, it multiplies the number by 100. So as we are dividing the number by 100 here. In super level it will become the same value that we have given        
            return super.valueToString(number);
        }
    };
    
    JFormattedTextField jftfPercentage = new JFormattedTextField(new DefaultFormatterFactory(percentDisplayFormatter, percentDisplayFormatter, percentEditFormatter));
    
    jftfPercentage.setBounds(113, 95, 236, 21);
    jftfPercentage.setName("JftfPercentage");