2016-06-14 2 views
1

Я использую следующий код для установки 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?

+3

1) Пожалуйста, узнать общую Java номенклатурой (именования - например, 'EachWordUpperCaseClass' 'firstWordLowerCaseMethod(),' firstWordLowerCaseAttribute' если оно не является 'UPPER_CASE_CONSTANT') и использовать его последовательно. 2) Используйте логическую и согласованную форму отступающих кодовых строк и блоков. Отступы предназначены для того, чтобы поток кода стал проще следовать! 3) Чтобы получить более эффективную помощь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

ответ

2

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

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

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

image

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://stackoverflow.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); 
    } 
}