Валюта Formatter не является дружественным к пользователю / интуитивно понятным. Случайно увеличивает поле ввода

1

У меня есть JTextField I, отформатированный с помощью NumberFormatter. Он отлично работает, пока я не попытаюсь добавить нуль, тогда он увеличит поле до примерно 10000 х старого ввода. это не самая большая сделка в мире, просто немного запутанная попытка исправить ввод как пользователь.

Исправлена

Как указано ниже, удаление setMaximumuFraction()/setMinimumFraction() а также setOverwriteMode() заставил его работать, как хотелось бы.

private void setValues(){
    name = new JFormattedTextField();
    format = NumberFormat.getCurrencyInstance(Locale.US);
    format.setMinimumFractionDigits(2);
    format.setMaximumFractionDigits(2);
    formatter = new NumberFormatter(format);
    formatter.setMinimum(0.0);
    formatter.setMaximum(10000000.0);
    formatter.setAllowsInvalid(false);

    formatter.setOverwriteMode(true);
    price = new JFormattedTextField(formatter);
    price.setValue(0.0);
}

Что мой текущий код, я объявляю переменные с

private JFormattedTextField name, price;
private NumberFormat format;
private NumberFormatter formatter;

Возможно, потому, что я установил setMinimumFractionDigits() в 2 или что нет.

Есть идеи?

РЕДАКТИРОВАТЬ

Вот пример рабочего кода. Просто нужно скомпилировать его самостоятельно:

import java.awt.EventQueue;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.NumberFormatter;



public class testClass extends JPanel{
    private JFormattedTextField name, price;
    private int option;
    private NumberFormat format;
    private NumberFormatter formatter;
    public testClass(){
        initComponents();
        startPanel();
    }

    private void initComponents(){
        name = new JFormattedTextField();
        format = NumberFormat.getCurrencyInstance(Locale.US);
        format.setMinimumFractionDigits(2);
        format.setMaximumFractionDigits(2);
        formatter = new NumberFormatter(format);
        formatter.setMinimum(0.0);
        formatter.setMaximum(10000000.0);
        formatter.setAllowsInvalid(false);

        formatter.setOverwriteMode(true);
        price = new JFormattedTextField(formatter);
        price.setValue(0.0);
    }

    private void startPanel(){
        Object[] message = {
          "Item Name", name,
          "Item Price", price,    
        };
        option = JOptionPane.showConfirmDialog(this, message, "New Customer Information", JOptionPane.OK_CANCEL_OPTION);

    }


     public static void main (String[] args){
        try {
            for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {

                new testClass().setVisible(true);
            }
        });
    }
}
Теги:
number-formatting
jformattedtextfield

1 ответ

1
Лучший ответ

Я думаю, что это можно устранить, если не установить режим перезаписи форматирования в значение true. Также эти ребята не должны быть нужны:

format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);

Поскольку формат валюты Locale.US должен уже позаботиться об этом.


Изменение: это минимальная примерная программа, которую я использовал для проверки кода:

import java.text.NumberFormat;
import java.util.Locale;

import javax.swing.*;
import javax.swing.text.NumberFormatter;

public class TestList {
   static JFormattedTextField price;
   static NumberFormat format;
   static NumberFormatter formatter;

   public static void main(String[] args) {
      setValues();
      JPanel panel = new JPanel();
      panel.add(new JLabel("price:"));
      panel.add(price);

      JOptionPane.showMessageDialog(null, panel);
   }

   private static void setValues(){
      format = NumberFormat.getCurrencyInstance(Locale.US);
//      format.setMinimumFractionDigits(2);
//      format.setMaximumFractionDigits(2);
      formatter = new NumberFormatter(format);
      formatter.setMinimum(0.0);
      formatter.setMaximum(10000000.0);
      formatter.setAllowsInvalid(false);

      // formatter.setOverwriteMode(true);
      price = new JFormattedTextField(formatter);
      price.setColumns(10);
      price.setValue(0.0);
  }
}

Обратите внимание, что я удалил поле имени, поскольку оно совершенно не имеет отношения к вашей проблеме и сделало все статическим, чтобы оно могло запускаться из простого статического основного метода.

  • 0
    Я попробую это сейчас РЕДАКТИРОВАТЬ Ну, спасибо, это работает сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню