我不明白为什么,如果Spinner 调用 ChangeListener 两次。我怎样才能做到只打一次电话?
控制器.java
public class Controller {
@FXML
Spinner<Double> spinner;
@FXML
public void initialize(){
spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));
spinner.valueProperty().addListener(new ChangeListener<Double>() {
@Override
public void changed(ObservableValue<? extends Double> observable, Double oldValue, Double newValue) {
System.out.println("Old Value" + oldValue + "New Value" + newValue);
}
});
}}
主程序
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}}
出去:
Old Value 60.0 New Value 780.0
Old Value 780.0 New Value 350.0
这是因为SpinnerValueFactory
:
spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));
的最大值Spinner
为 350。您输入 780:该值正在更改为此值,然后因为最大值更改回 350。
更新:
默认情况下,Spinner
当Enter按下键时,将提交编辑器中的值。
例如,为了避免自动绑定,您可以尝试覆盖默认提交逻辑:
spinner.getEditor().setOnAction(e -> {
String text = spinner.getEditor().getText();
SpinnerValueFactory<Double> valueFactory = spinner.getValueFactory();
if (valueFactory != null) {
StringConverter<Double> converter = valueFactory.getConverter();
if (converter != null) {
try{
Double value = converter.fromString(text);
if (value >= minValue && value <= maxValue)
valueFactory.setValue(value);
else
valueFactory.setValue(Math.max(Math.min(maxValue, value), minValue));
// This ensures that if the value us e.g. 350, then 450 entered, the text
// is updated to 350 again (rather than ramaining 450)
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
} catch(NumberFormatException nfe){
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
}
}
}
e.consume();
});
值定义为:
double maxValue = 350;
double minValue = 0;
spinner.setValueFactory(
new SpinnerValueFactory.DoubleSpinnerValueFactory(minValue, maxValue, 60, 1));
笔记:
最小值和最大值也可以从SpinnerValueFactory
- 不幸的是不是以完全干净的方式检索,而是通过一些转换:
spinner.getEditor().setOnAction(e -> {
SpinnerValueFactory.DoubleSpinnerValueFactory valueFactory = (SpinnerValueFactory.DoubleSpinnerValueFactory) spinner.getValueFactory();
if (valueFactory != null) {
StringConverter<Double> converter = valueFactory.getConverter();
if (converter != null) {
try {
valueFactory.setValue(Math.max(Math.min(valueFactory.getMax(),
converter.fromString(spinner.getEditor().getText())), valueFactory.getMin()));
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
} catch(NumberFormatException nfe){
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
}
}
}
e.consume();
});
但在这种情况下,没有必要存储最小值和最大值,它们是从工厂本身获得的:
spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 350, 60, 1));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句