Swing/RoundDownToHalfSpinner のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/RoundDownToHalfSpinner へ行く。
- 1 (2025-02-10 (月) 03:14:36)
- category: swing folder: RoundDownToHalfSpinner title: JSpinnerの数値を0.5単位で切り捨てる tags: [JSpinner, JFormattedTextField] author: aterai pubdate: 2025-02-10T03:12:04+09:00 description: JSpinnerに表示する数値を0.5単位で切り捨て、または四捨五入するよう設定します。 image: https://drive.google.com/uc?id=1NUCQ7kUpaVRdhJC4OGlXAQwU0x-FdRnZ
Summary
JSpinnerに表示する数値を0.5単位で切り捨て、または四捨五入するよう設定します。
Screenshot

Advertisement
Source Code Examples
private static DefaultFormatter makeDownFormatter() {
return new DefaultFormatter() {
@Override public Object stringToValue(String text) {
return roundToDown(new BigDecimal(text)).doubleValue();
}
@Override public String valueToString(Object value) {
return roundToDown(BigDecimal.valueOf((Double) value)).toString();
}
};
}
private static BigDecimal roundToDown(BigDecimal value) {
return value.multiply(BigDecimal.valueOf(2))
.setScale(0, RoundingMode.DOWN)
.multiply(BigDecimal.valueOf(.5));
}
View in GitHub: Java, KotlinExplanation
Default, stepSize: 0.5
- デフォルトの
SpinnerNumberModel
にステップサイズを0.5
として使用 - 矢印ボタンで
JSpinner
の数値を変更すると0.5
単位で増減するが、たとえば直接8.85
を入力しても0.5
単位の端数処理などは適用されない
- デフォルトの
Override SpinnerNumberModel
SpinnerNumberModel#setValue(...)
メソッドをオーバーライドして値を0.5
単位で切り捨て- コンストラクタで初回の現在値を設定する場合は
SpinnerNumberModel#setValue(...)
が使用されないので、super(roundDownToHalf(value), min, max, step);
のように切り捨てを実行している
class RoundToHalfSpinnerModel extends SpinnerNumberModel {
protected RoundToHalfSpinnerModel(
double value, double min, double max, double step) {
super(roundDownToHalf(value), min, max, step);
}
@Override public void setValue(Object value) {
if (value instanceof Double) {
Double v = roundDownToHalf((Double) value);
if (!v.equals(getValue())) {
super.setValue(v);
fireStateChanged();
}
} else {
throw new IllegalArgumentException("illegal value");
}
}
private static double roundDownToHalf(Double value) {
return BigDecimal.valueOf(value)
.multiply(BigDecimal.valueOf(2))
.setScale(0, RoundingMode.DOWN)
.multiply(BigDecimal.valueOf(.5))
.doubleValue();
}
}
Round down to half Formatter
JSpinner.DefaultEditor
からJFormattedTextField
を取得して、0.5
単位で切り捨てを実行するDefaultFormatterFactory
を設定0.5
単位の切り捨ては、BigDecimal
の値を2
倍したあとBigDecimal#setScale(0, RoundingMode.DOWN)
で小数点以下を切り捨てし、0.5
倍することで実行している
Round to half Formatter
JSpinner.DefaultEditor
からJFormattedTextField
を取得して、0.5
単位で四捨五入をを実行するDefaultFormatterFactory
を設定0.5
単位の四捨五入は、BigDecimal
の値を2
倍したあとBigDecimal#setScale(0, RoundingMode.HALF_UP)
で小数点以下を四捨五入し、0.5
倍することで実行している