Как правильно установить 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);
}
}