Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX微调器工作不正确。Spinner.valueProperty().addListener更改了两次_Java_Javafx_Javafx 8_Spinner - Fatal编程技术网

JavaFX微调器工作不正确。Spinner.valueProperty().addListener更改了两次

JavaFX微调器工作不正确。Spinner.valueProperty().addListener更改了两次,java,javafx,javafx-8,spinner,Java,Javafx,Javafx 8,Spinner,我不明白为什么,如果微调器调用ChangeListener两次。我怎样才能做到只打一次电话 Controller.java public class Controller { @FXML Spinner<Double> spinner; @FXML public void initialize(){ spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));

我不明白为什么,如果微调器调用ChangeListener两次。我怎样才能做到只打一次电话

Controller.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);
    }}
Out:

Old Value 60.0 New Value 780.0
Old Value 780.0 New Value 350.0

这是因为
工厂

spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));
微调器的最大值为350。输入780:该值将更改为此值,然后由于最大值,它将更改回350


更新:

默认情况下,按下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();
});

注意:

Old Value 60.0 New Value 780.0
Old Value 780.0 New Value 350.0
也可以从
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();
});

当它被调用两次时,您输入什么值?大于350?是的,例如,我输入了780是的,但是我如何才能只使一个调用方法public void changed()?另一个选项是在编辑器上设置
TextFormatter
,并否决(或修改)超出范围的更改。@James\u D是的,这绝对正确。我只是不想创建tl;答:)
spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 350, 60, 1));