如何设置滑块固定到位置?

时间:2016-03-05 15:02:53

标签: java javafx slider

我有一个滑块,我需要它来修复int数字1-23。因此,如果用户将其从1移动,则它们将以1-23的任何数字结束,这与双值不同。此滑块的目的是作为时钟,拖动它并显示不同的时间。

我的第一次尝试:

private final int MIN_CHANGE = 1;
....

timeSlider.setMax(23);

....

timeSlider.valueProperty().addListener((obs, oldValue, newValue) -> {
    if (!timeSlider.isValueChanging()) {
        if (Math.abs(newValue.intValue()) > MIN_CHANGE) {
            timeSlider.setValue(newValue.intValue());
        }
    }
});

这或多或少有效,但仅适用于点击,而不适用于拖动。

如果getValue为double,我怎么能在拖动时获得一个滑块来修复像1-23这样的整数?

我面临的另一个问题是拖动pm / am更改并非突然。

timeSlider.valueChangingProperty().addListener((obs, wasChanging, isChanging) -> {
    if (isChanging) {
        if(timeSlider.getValue() < 12.99) {
            labelTest.textProperty().bind(Bindings.format("%.0f:00am", timeSlider.valueProperty()));
        } else {
            labelTest.textProperty().bind(Bindings.format("%.0f:00pm", timeSlider.valueProperty()));
        }
    }
});

2 个答案:

答案 0 :(得分:0)

将设置snapToTicks设置为true,将主要刻度线间距设置为23:

timeSlider.setSnapToTicks(true);
timeSlider.setMajorTickUnit(23.0);
timeSlider.setBlockIncrement(23.0);
timeSlider.setMinorTickCount(0.0); // Disable minor ticks

答案 1 :(得分:0)

为了使它与数字对齐,我使用了FXML场景构建器中提供的blockIncrement,majorTickUnit和snapToTicks,直到现在我都没有注意到,感谢ItachiUchiha。

作为参考,我使用了以下设置

min="1.0"
max="23.0" 
blockIncrement="1.0" 
majorTickUnit="1.0" 
minorTickCount="0" 
showTickMarks="true" 
snapToTicks="true"

最后,要解决我的问题,上午/下午没有更新,我将am / pm绑定的方法更改为以下

timeSlider.valueProperty().addListener((obs, oldValue, newValue) -> {
    if (timeSlider.isValueChanging()) {
        if (newValue.intValue() < 12) {
            labelTest.textProperty().bind(Bindings.format("%.0f:00am", timeSlider.valueProperty()));
        } else {
            labelTest.textProperty().bind(Bindings.format("%.0f:00pm", timeSlider.valueProperty()));
        }
    }
});