JSpinnerの数値を0.5単位で切り捨てる
Total: 66
, Today: 2
, Yesterday: 3
Posted by aterai at
Last-modified:
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
倍することで実行している