Javafx Slider在轨道点击时增加10

时间:2018-05-07 07:57:20

标签: java javafx slider

与javafx中的JSlider一样,我们如何使用特定值增加,就像我希望我的滑块旋钮在每次右键单击滑块(轨道上的任何位置)上移动+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 :(得分:0)

此问题的主要困难是我们无法直接访问轨道OnMouseClick逻辑(SliderBehavior.trackPress)。 这可以通过使用自定义SliderSkinSliderBehavior创建自定义滑块来解决,但这听起来像是一种矫枉过正。

它在你的代码片段中无法正常工作,因为当你点击轨道时,此操作背后的逻辑是将旋钮放到最近的刻度线上(再次看看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。因此,我们可以简单地跟踪单击轨道后是否已经更改了值,如果没有 - 手动更改它。

相关问题