Как правильно установить NumberFomatterFactory в JFormattedTextField?

Я использую следующий код для установки NumberFomatterFactory в JFormattedTextField:

    try{
    JFormattedTextField ccyTxt = new JFormattedTextField();
    DecimalFormat ccyTxtFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
    ccyTxtFormat.setMaximumIntegerDigits((int) 13);
    ccyTxtFormat.setMaximumFractionDigits((int) 5);
    ccyTxtFormat.setMinimumIntegerDigits(0);
    ccyTxtFormat.setMinimumFractionDigits(0);
    NumberFormatter ccyTxtFormatter = new NumberFormatter(ccyTxtFormat);
    ccyTxtFormatter.setAllowsInvalid(true);
    DefaultFormatterFactory ccyTxtDecimalFormatterFactory = new DefaultFormatterFactory(ccyTxtFormatter);
    ccyTxt.setFormatterFactory(ccyTxtDecimalFormatterFactory);
    } catch(Exception ex) {
    ex.printStackTrace();
    }

Но, получив исключение следующим образом:

java.lang.IllegalArgumentException: Cannot format given Object as a Number
        at java.text.DecimalFormat.format(DecimalFormat.java:487)
        at java.text.Format.format(Format.java:140)

Как правильно установить NumberFomatterFactory в JFormattedTextField?

1 ответ

Я не могу воспроизвести исключение, о котором вы сообщаете; не понятно почему ловишь Exception совсем. Полный пример, приведенный ниже, может помочь вам изучить проблему изолированно. Особенно,

  • Добавление второго компонента позволит вам увидеть эффект изменения фокуса.

  • использование setColumns() указать начальный размер.

образ

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

/**
 * @see http://stackru.com/a/37807744/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new GridLayout(0, 1));

        JFormattedTextField ccyTxt = new JFormattedTextField();
        DecimalFormat ccyTxtFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
        ccyTxtFormat.setMaximumIntegerDigits((int) 13);
        ccyTxtFormat.setMaximumFractionDigits((int) 5);
        ccyTxtFormat.setMinimumIntegerDigits(0);
        ccyTxtFormat.setMinimumFractionDigits(0);
        NumberFormatter ccyTxtFormatter = new NumberFormatter(ccyTxtFormat);
        ccyTxtFormatter.setAllowsInvalid(true);
        DefaultFormatterFactory CcyTxtDecimalFormatterFactory = new DefaultFormatterFactory(ccyTxtFormatter);
        ccyTxt.setFormatterFactory(CcyTxtDecimalFormatterFactory);
        ccyTxt.setColumns(12);

        f.add(ccyTxt);
        f.add(new JButton("Button"));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}
Другие вопросы по тегам