Java: JFormattedTextField меняет setGroupingUsed () на focusLost и focusGained - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть много 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());
}

1 Ответ

0 голосов
/ 23 декабря 2011

Спасибо,

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

...