Шаг слайдера Javafx с 10 на клик - PullRequest
0 голосов
/ 07 мая 2018

Как и JSlider в javafx, как мы можем увеличивать с определенным значением, как я хочу, чтобы моя ручка-слайдер двигалась на +10 при каждом щелчке правой кнопкой мыши по ползунку (в любом месте на дорожке) и -10 при щелчке левой кнопкой мыши по ползунку (в любой точке дорожки). Я использую следующий код, но не получаю результат

Slider betSlider = new Slider(0, 1000, 100);
betSlider.setMinorTickCount(0);
betSlider.setMajorTickUnit(10);
betSlider.setBlockIncrement(10);
betSlider.setSnapToTicks(true);

container.getChildren().add(betSlider);
betSlider.valueProperty().addListener(new ChangeListener<Number>() {
    public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
        betSlider.setValue(new_val.intValue());
    }
});

1 Ответ

0 голосов
/ 09 мая 2018

Основная сложность этой проблемы заключается в том, что у нас нет прямого доступа к логике трека 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 срабатывает.Следовательно, мы можем просто отслеживать, изменилось ли значение уже после щелчка на треке, а если нет - изменить его вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...