如何让JavaFX Slider以离散的步骤移动?

Mr *_*ner 13 java integer javafx slider javafx-8

我正在GUI使用JavaFx,我需要只允许integers选择的滑块.

我知道我可以使用snapToTicks,但在拉动时"knob",它仍然可以代表一个non-integer值.我想摆脱它.它弄乱了与之相关的其他组件.

基本上,我想要类似的东西Swing's JSlider,但有JavaFx.可能吗?我一直在寻找,但我找不到任何东西.

DVa*_*rga 16

您只需一个监听器添加到valuePropertySlider,然后你可以设置的整数值的新的Number价值:

slider.valueProperty().addListener((obs, oldval, newVal) -> 
    slider.setValue(newVal.intValue()));
Run Code Online (Sandbox Code Playgroud)

或者您也可以使用整数舍入Math.round:

slider.valueProperty().addListener((obs, oldval, newVal) ->
    slider.setValue(Math.round(newVal.doubleValue())));
Run Code Online (Sandbox Code Playgroud)

  • 嗯......在监听器中更改属性时总是感觉很脏(即使我们似乎在 fx 中比在好的 ol'swing 中更频繁地摆脱它)。此外,我猜(没有尝试)UX 感觉有点出乎意料,这是永远不应该发生的。您(OP)是否尝试在依赖控件中进行条件绑定,仅当滑块的 adjustProperty 为 false 时才取值? (2认同)

Art*_*sse 11

在 FXML 中:

<Slider fx:id="availableReproSelector" 
        blockIncrement="1.0" 
        cache="true" 
        majorTickUnit="1.0" 
        max="4.0" 
        min="1.0" 
        minorTickCount="0" 
        showTickLabels="true" 
        showTickMarks="true" 
        snapToTicks="true" 
        value="1.0" 
        />
Run Code Online (Sandbox Code Playgroud)

或者在 Java 中:

Slider slider = new Slider(1, 4, 1);
slider.setBlockIncrement(1);
slider.setMajorTickUnit(1);
slider.setMinorTickCount(0);
slider.setShowTickLabels(true);
slider.setSnapToTicks(true);
Run Code Online (Sandbox Code Playgroud)

这里的关键是对齐刻度选项与刻度单位的正确组合。此设置导致以下滑块只能用于选择范围从 1 到 4 的值:

只能选择 1 到 4 之间的 int 值