JSpinnerの数値を0.5単位で切り捨てる
Total: 201
, Today: 1
, Yesterday: 0
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
倍することで実行している- スウェディッシュ・ラウンディング - Wikipedia
private static BigDecimal roundToUp(BigDecimal value) { return value.multiply(BigDecimal.valueOf(2)) .setScale(0, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(.5)); }
Reference
- JSpinnerの上下限値をBigDecimalで比較する
- JColorChooserのRGB色選択パネル内に表示される16進数カラーコードにAlpha値を追加する
- スウェディッシュ・ラウンディング - Wikipedia