JFormattedTextField to format percent numbers?

后端 未结 3 1745
南笙
南笙 2021-01-07 05:04

I would like to format a float number as a percent-value with JFormattedTextField that allows inputs from 0 to 100 percent (converted to 0.0f-1.0f), always shows the percent

3条回答
  •  Happy的楠姐
    2021-01-07 06:08

    Imho https://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html gives a pretty good example (see section "Specifying Formatters and Using Formatter Factories").

    The key is to use a Percent Format to display values and a custom NumberFormatter to edit values. This approach also allows the use of fraction digits.

    // create a format for displaying percentages (with %-sign)
    NumberFormat percentDisplayFormat = NumberFormat.getPercentInstance();
    
    // create a format for editing percentages (without %-sign)
    NumberFormat percentEditFormat = NumberFormat.getNumberInstance();
    
    // create a formatter for editing percentages - input will be transformed to percentages (eg. 50 -> 0.5)
    NumberFormatter percentEditFormatter = new NumberFormatter(percentEditFormat) {
        private static final long serialVersionUID = 1L;
    
        @Override
        public String valueToString(Object o) throws ParseException {
            Number number = (Number) o;
            if (number != null) {
                double d = number.doubleValue() * 100.0;
                number = new Double(d);
            }
            return super.valueToString(number);
        }
    
        @Override
        public Object stringToValue(String s) throws ParseException {
            Number number = (Number) super.stringToValue(s);
            if (number != null) {
                double d = number.doubleValue() / 100.0;
                number = new Double(d);
            }
            return number;
        }
    };
    
    // set allowed range
    percentEditFormatter.setMinimum(0D);
    percentEditFormatter.setMaximum(100D);
    
    // create JFormattedTextField
    JFormattedTextField field = new JFormattedTextField(
        new DefaultFormatterFactory(
            new NumberFormatter(percentDisplayFormat),
            new NumberFormatter(percentDisplayFormat),
            percentEditFormatter));
    

提交回复
热议问题