У меня есть много JFormattedTextdields с числовыми данными в нем. Я использовал DecimalFormat, InternationalFormatter, DocumentListener, а также пробовал использовать CaretPositionListener.
Единственная проблема, с которой я сталкиваюсь, это позиция каретки, когда ввод числа увеличивается и между ними появляется группирующий символ.
Как я могу динамически установить setGroupingUsed () для DecimalFormat соответствующих текстовых полей jformatted на focusGained и onFocusLost.
Любые идеи или предложения ....
КОД ОБНОВЛЕНИЯ И ПРОБЛЕМА:
Когда я пытаюсь ввести «12345», при добавлении «1234» появляется запятая «1234». Это приводит к появлению между 3 и 4, а не после 4. Код форматирования, который я использую:
DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMinimumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
final InternationalFormatter formatter = new InternationalFormatter(numberFormat);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.00);
formatter.setMaximum(999999999.99);
return formatter;
Это то, что я реализовал как РЕШЕНИЕ в пользовательском JFormattedTextField. Есть ли у вас лучший подход к обработке символа группировки при вводе значения, поэтому правильная позиция каретки остается правильной:
public void focusGained(FocusEvent e) {
if (numberFormat.isGroupingUsed()) {
Object o = this.getValue();
numberFormat.setGroupingUsed(false);
formatter.setFormat(numberFormat);
this.setFormatterFactory(new AbstractFormatterFactoryImpl());
this.setValue(o);
this.setText(o.toString());
}
}
public void focusLost(FocusEvent e) {
try {
this.commitEdit();
} catch (ParseException ex) {
//Logger.getLogger(NumberFormattedTextField.class.getName()).log(Level.SEVERE, null, ex);
}
Object o = this.getValue();
//System.out.println("focusLost : getValue = " + o);
numberFormat.setGroupingUsed(true);
formatter.setFormat(numberFormat);
this.setFormatterFactory(new AbstractFormatterFactoryImpl());
this.setValue(o);
this.setText(o.toString());
//System.out.println("focusLost : Text Set = " + o.toString());
}