0

数値データを含む多くの JFormattedTextdields があります。DecimalFormat、InternationalFormatter、DocumentListener を使用し、CaretPositionListener も試しました。

私が直面する唯一の問題は、数値入力が大きくなり、グループ化文字が間に入るときのキャレットの位置です。

focusGained と onFocusLost でそれぞれの jformattedtextfields の DecimalFormat の setGroupingUsed() を動的に設定するにはどうすればよいですか。

任意のアイデアや提案....

更新コードと問題 : 「12345」を入力しようとすると、「1234」を追加するとカンマが「1,234」と表示されます。これにより、4 の後ではなく 3 と 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 でSOLUTIONとして実装したものです。値の入力中にグループ化文字を処理するためのより良いアプローチがあるので、キャレット位置だけが適切なままになります:

    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());
}
4

1 に答える 1

0

ありがとう、

必要なものすべてを管理するカスタム テキスト フィールドを作成することで解決しました。改善のための提案。コードは問題の上に追加されています。

于 2011-12-23T10:27:47.383 に答える