JavaFX Slider:如何仅按增量拖动拇指
JavaFX Slider : How to drag the thumb only by increments
我正在尝试实现 Slider,以便用户只能按给定的增量进行拖动。我通过使用 Slider API 尝试了不同的方式,但没有得到想要的结果。下面是我尝试过的快速演示。我希望仅以 10 的增量拖动拇指,而不是使用中间值。 snapToTicks 正在做我需要的,但只是在完成拖动之后。我试图在达到下一个所需的块增量之前不移动拇指。
任何人都可以让我知道我怎样才能做到这一点。下面是拖动时的截图。
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();
}
}
解决方法是直接在侦听器内部设置滑块的值。监听器不会再被调用
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()
而不是圆形,您会得到更直观的拇指行为。
我正在尝试实现 Slider,以便用户只能按给定的增量进行拖动。我通过使用 Slider API 尝试了不同的方式,但没有得到想要的结果。下面是我尝试过的快速演示。我希望仅以 10 的增量拖动拇指,而不是使用中间值。 snapToTicks 正在做我需要的,但只是在完成拖动之后。我试图在达到下一个所需的块增量之前不移动拇指。
任何人都可以让我知道我怎样才能做到这一点。下面是拖动时的截图。
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();
}
}
解决方法是直接在侦听器内部设置滑块的值。监听器不会再被调用
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()
而不是圆形,您会得到更直观的拇指行为。