更改滑块的数值

Change Numeric Value of a Slider

我正在编写一个带有两个滑块的程序,这些滑块的值显示在各自的标签(counter1 和 counter2)中。 Slider2 绑定到 slider1,但也可以独立移动。移动 slider1(结果是 slider2)后,我希望能够按下一个按钮来做两件事:

  1. 锁定slider1的值
  2. 更改 counter2 的值,使其从零开始计数,无论 slider2 在哪里(即 - 即使滑块可能位于 -10,counter2 显示为零。那么 -9 将是 1,-8 将是2 等)

这是我目前拥有的相关代码:

public CreateSliders() {

    Slider slider1 = new Slider();
    slider1.setMin(-30);
    slider1.setMax(30);
    slider1.setMinWidth(300);
    slider1.setValue(0);
    slider1.setShowTickLabels(true);
    slider1.setShowTickMarks(true);
    slider1.setMajorTickUnit(10);
    slider1.setMinorTickCount(1);
    slider1.setBlockIncrement(1);

    Label counter1 = new Label(Double.toString(slider1.getValue()));

    Button btn1 = new Button("Lock");

    HBox counter1Hbox = new HBox(counter1, btn1);
    counter1Hbox.setAlignment(Pos.CENTER);

    btn1.setOnAction(new EventHandler<ActionEvent>() {
        public void handle (ActionEvent event) {
            counter2.setText("0.0");                
        }
    });

    Slider slider2 = new Slider();
    slider2.setMin(-30);
    slider2.setMax(30);
    slider2.setMinWidth(300);
    slider2.setValue(0);
    slider2.setShowTickLabels(true);
    slider2.setShowTickMarks(true);
    slider2.setMajorTickUnit(10);
    slider2.setMinorTickCount(1);
    slider2.setBlockIncrement(1);

    Label counter2 = new Label(Double.toString(slider2.getValue()));

    HBox counter2Hbox = new HBox(counter2);
    counter2Hbox.setAlignment(Pos.CENTER);

    slider1.valueProperty().addListener(new ChangeListener<Number>() {
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            counter1.setText(String.format("%.0f", newValue));
            slider2.valueProperty().set(slider2.valueProperty().get() + newValue.doubleValue() - oldValue.doubleValue());
        }
    });

    slider2.valueProperty().addListener(new ChangeListener<Number>() {
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            counter2.setText(String.format("%.0f", newValue));
        }
    });
}

要锁定滑块位置,您可以使用:

ToggleButton btnLock = new ToggleButton("Lock");
btnLock.selectedProperty().addListener((ov, b, b1) -> 
   {
      slider1.setMouseTransparent(b1));
      //or
      slider.setDisable(b1));
   });

//or
slider1.disableProperty().bind(btnLock.selectedProperty());

对于第 2 点:

private double lastSliderPosition;

public void createSliders(){
        //initialize sliders 

        ToggleButton btnLock = new ToggleButton("Lock");
        btnLock.selectedProperty().addListener((ov, b, b1) -> {
            slider1.setDisable(b1);

            if (b1) {
                slider2.valueProperty().unbind();
            } else {
                slider2.valueProperty().bind(slider1.valueProperty());
            }
        });

        slider2.valueProperty().bind(slider1.valueProperty());

        slider2.valueProperty().addListener((ov, t, t1) -> {
            if (!slider2.isValueChanging()) {
                lastSliderValue = (double) t1;
            }

            if (btnLock.isSelected()) {
                counter2.setText(String.format("%.0f", t.doubleValue() - lastSliderValue));
            } else {
                counter2.setText(String.format("%.0f", t1));
            }
        });
}