【问题标题】:How to make JavaFX Slider to move in discrete steps?如何使 JavaFX Slider 以离散的步骤移动?
【发布时间】:2016-12-05 12:28:14
【问题描述】:

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

我知道我可以使用snapToTicks,但在拉取"knob" 时,它仍然可以表示non-integer 值。我想摆脱它。它会弄乱与之链接的其他组件。

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

【问题讨论】:

    标签: java javafx integer slider javafx-8


    【解决方案1】:

    您可以简单地将侦听器添加到SlidervalueProperty,然后您可以设置新Number 值的integer value

    slider.valueProperty().addListener((obs, oldval, newVal) -> 
        slider.setValue(newVal.intValue()));
    

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

    slider.valueProperty().addListener((obs, oldval, newVal) ->
        slider.setValue(Math.round(newVal.doubleValue())));
    

    【讨论】:

    • 这是个好主意,我只是不喜欢四舍五入(原因见我对 SkyWalker 的评论)。不过,我仍然可能会使用它。
    • 您还可以使用整数舍入,例如((int) Math.round(newVal.doubleValue()))。两种方法都不允许在整数值之间使用“旋钮”。
    • 这听起来更好,但我仍然想知道是否有更合法的方式。
    • 我们需要的时候赞美MVC在哪里,JavaFX?来自 Swing,这确实是一个丑陋的解决方案。
    • hmm ...在监听器中更改属性时总是感觉很脏(即使我们在 fx 中似乎比在好的 ol' swing 中更频繁地侥幸逃脱)。我也猜想(没有尝试)用户体验有点出乎意料,这是永远不会发生的。您(OP)是否尝试在依赖控件中进行条件绑定,仅当滑块的adjustingProperty 为false 时才取值?
    【解决方案2】:

    在 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" 
            />
    

    或者在 Java 中:

    Slider slider = new Slider(1, 4, 1);
    slider.setBlockIncrement(1);
    slider.setMajorTickUnit(1);
    slider.setMinorTickCount(0);
    slider.setShowTickLabels(true);
    slider.setSnapToTicks(true);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多