数値データを含む多くの 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());
}