Основная сложность этой проблемы заключается в том, что у нас нет прямого доступа к логике трека OnMouseClick ( SliderBehavior.trackPress ).Это может быть решено путем создания пользовательского слайдера с пользовательскими SliderSkin
и SliderBehavior
, но это звучит как перебор.
Он не работает как есть в вашем фрагменте кода, потому что когда вы нажимаете на дорожку, логика, лежащая в основе этого действия, заключается в установке ручки на ближайший тик (еще раз, посмотрите на SliderBehavior.trackPress )
Для решения этой проблемы может быть использован следующий подход ( Примечание, Java 8 ):
private boolean valueChanged;
....
public void setupSlider() {
Slider betSlider = new Slider(0, 100, 10);
int blockIncrementStep = 10;
betSlider.setMinorTickCount(0);
betSlider.setMajorTickUnit(10);
betSlider.setBlockIncrement(blockIncrementStep);
betSlider.setSnapToTicks(true);
betSlider.setShowTickMarks(true);
container.getChildren().add(betSlider);
betSlider.valueProperty().addListener((ov, oldValue, newValue) -> {
if (!valueChanged) {
valueChanged = true;
if (newValue.intValue() > oldValue.intValue()) {
betSlider.setValue(oldValue.intValue() + blockIncrementStep);
} else {
betSlider.setValue(oldValue.intValue() - blockIncrementStep);
}
}
});
betSlider.setOnMouseClicked(event -> valueChanged = false);
}
Каждый раз betSlider.setValue
методвызывается - betSlider.valueProperty().changed
метод также запущен.И только когда больше нет изменений setOnMouseClicked
срабатывает.Следовательно, мы можем просто отслеживать, изменилось ли значение уже после щелчка на треке, а если нет - изменить его вручную.