2.01 や -3.456 などの非整数値をサポートする JSpinners を作成したいので、getValue() は Double を返します。
これだけでなく、次の式 (大きさの 10%) のようなものを使用して、ステップ サイズを動的にする必要があります。
stepSize = 0.1 * pow(10, round( log(currentValue) ));
出来ますか?または、私は尋ねる必要があります、それは面倒な価値がありますか?
アップデート:
Vishal の回答を採用して、素敵なダブル スピナーを作成するために次のクラスを作成しました。これまでのところ、それらは私のプログラムで非常にうまく機能することが示されていますが、後で AdaptiveDoubleSpinners と AdaptiveIntegerSpinners を作成できるように、適応ステップ サイズを別の親クラスに抽象化します。
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class DoubleSpinner extends JSpinner {
private static final long serialVersionUID = 1L;
private static final double STEP_RATIO = 0.1;
private SpinnerNumberModel model;
public DoubleSpinner() {
super();
// Model setup
model = new SpinnerNumberModel(0.0, -1000.0, 1000.0, 0.1);
this.setModel(model);
// Step recalculation
this.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Double value = getDouble();
// Steps are sensitive to the current magnitude of the value
long magnitude = Math.round(Math.log10(value));
double stepSize = STEP_RATIO * Math.pow(10, magnitude);
model.setStepSize(stepSize);
}
});
}
/**
* Returns the current value as a Double
*/
public Double getDouble() {
return (Double)getValue();
}
}