JavaFX滑块:如何仅按增量拖动滑块?

3
我正在尝试实现滑块,使用户只能按给定的增量拖动。我尝试使用滑块API的不同方式,但没有得到预期的结果。以下是我尝试过的快速演示。我希望仅以10为增量拖动滑块,而不是中间值。snapToTicks正是我所需的,但只有在完成拖动后才会生效。我正在尝试在达到下一个期望的块增量之前不移动滑块。

有人可以告诉我如何实现这一点吗?以下是拖动时的屏幕截图。

enter image description here

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class SliderDemo extends Application {

    public static void main(String... args){
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {

        Label label = new Label();
        label.setStyle("-fx-font-size:30px");

        Slider slider = new Slider(5,240,5);
        slider.setBlockIncrement(10);
        slider.setMajorTickUnit(10);
        slider.setMinorTickCount(0);
        slider.setShowTickLabels(true);
        slider.setShowTickMarks(true);
        slider.setSnapToTicks(true);

        slider.valueProperty().addListener((obs,old,val)->label.setText((int)Math.round(val.doubleValue())+""));
        VBox root = new VBox(slider,label);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(20));
        root.setSpacing(20);

        Scene scene = new Scene(root,600,200);
        stage.setScene(scene);
        stage.show();
    }
}
1个回答

4

解决方案是直接在监听器内部设置滑块的值。监听器不会再次调用。

final ChangeListener<Number> numberChangeListener = (obs, old, val) -> {
    final double roundedValue = Math.floor(val.doubleValue() / 10.0) * 10.0;
    slider.valueProperty().set(roundedValue);
    label.setText(Double.toString(roundedValue));
};

slider.valueProperty().addListener(numberChangeListener);

如果您使用Math.floor()而不是 round,您会得到一个更直观的结果。

谢谢@Westranger,稍微修改了一下你的代码,现在它已经按照预期工作了。 :) - Sai Dandem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接