Java: JFormattedTextField меняет setGroupingUsed() на focusLost и focusGained

У меня есть много JFormattedTextdields с числовыми данными в нем. Я использовал DecimalFormat, InternationalFormatter, DocumentListener, а также пробовал с помощью CaretPositionListener.

Единственная проблема, с которой я сталкиваюсь, это позиция каретки, когда ввод числа увеличивается и между ними появляется группирующий символ.

Как я могу динамически установить setGroupingUsed() для DecimalFormat соответствующих jformattedtextfields на focusGained & onFocusLost.

Любые идеи или предложения....

КОД ОБНОВЛЕНИЯ И ПРОБЛЕМА: Когда я пытаюсь ввести "12345", при добавлении "1234" появляется запятая "1,234". Это приводит к появлению между 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());
}

1 ответ

Решение

Спасибо,

Я решил создать собственное текстовое поле, которое управляет всем, что мне нужно. Любое предложение по улучшению. Код добавлен выше в вопросе.

Другие вопросы по тегам