与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());
}
});
答案 0 :(得分:0)
此问题的主要困难是我们无法直接访问轨道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
。因此,我们可以简单地跟踪单击轨道后是否已经更改了值,如果没有 - 手动更改它。