如何设置滑块以固定位置?

Posted

技术标签:

【中文标题】如何设置滑块以固定位置?【英文标题】:How to set a slider to fix to positions? 【发布时间】:2016-06-19 08:17:08 【问题描述】:

我有一个滑块,我要求它固定到整数 1-23。因此,如果用户将其从 1 移动,他们最终会得到 1-23 的任何数字,这与双精度值不同。这个滑块的作用是当一个时钟,你拖动它会出现不同的时间。

我的第一次尝试:

private final int MIN_CHANGE = 1;
....

timeSlider.setMax(23);

....

timeSlider.valueProperty().addListener((obs, oldValue, newValue) -> 
    if (!timeSlider.isValueChanging()) 
        if (Math.abs(newValue.intValue()) > MIN_CHANGE) 
            timeSlider.setValue(newValue.intValue());
        
    
);

这或多或少有效,但仅适用于单击,不适用于拖动。

如果 getValue 是双精度值,如何在拖动时将滑块固定为 1-23 等整数?

我面临的另一个问题是拖动 pm/am 时变化并不突然。

timeSlider.valueChangingProperty().addListener((obs, wasChanging, isChanging) -> 
    if (isChanging) 
        if(timeSlider.getValue() < 12.99) 
            labelTest.textProperty().bind(Bindings.format("%.0f:00am", timeSlider.valueProperty()));
         else 
            labelTest.textProperty().bind(Bindings.format("%.0f:00pm", timeSlider.valueProperty()));
        
    
);

【问题讨论】:

我想你在找Slider#blockIncrementProperty() @ItachiUchiha 正是我想要的!谢谢你。上午/下午更新呢?拖动时如何让它更新,而不仅仅是点击?现在我可以从头拖到尾,除非我在 13 点之后单击任何值,否则上午/下午不会改变。 除非我点击 13 之后的任何值,否则上午/下午不会改变。我不明白这个。你能解释一下你最后发生了什么吗? 我的意思是我可以将滑块从 0 拖动到 15 并且绑定将保持在 am,除非我单击 13 之后的任何值,只有当绑定更改为 pm 时。我只是通过在valueProperty() 而不是valueChangingProperty() 中执行此操作来解决此问题 【参考方案1】:

尝试将snapToTicks 设置为 true 并将主要刻度间距设置为 23:

timeSlider.setSnapToTicks(true);
timeSlider.setMajorTickUnit(23.0);
timeSlider.setBlockIncrement(23.0);
timeSlider.setMinorTickCount(0.0); // Disable minor ticks

【讨论】:

【参考方案2】:

为了使其与数字对齐,我使用了 FXML 场景构建器中提供的 blockIncrement、majorTickUnit 和 snapToTicks,感谢 ItachiUchiha。

作为参考,我使用了以下设置

min="1.0"
max="23.0" 
blockIncrement="1.0" 
majorTickUnit="1.0" 
minorTickCount="0" 
showTickMarks="true" 
snapToTicks="true"

最后,为了解决 am/pm 不更新的问题,我将 am/pm 绑定的方法更改为以下

timeSlider.valueProperty().addListener((obs, oldValue, newValue) -> 
    if (timeSlider.isValueChanging()) 
        if (newValue.intValue() < 12) 
            labelTest.textProperty().bind(Bindings.format("%.0f:00am", timeSlider.valueProperty()));
         else 
            labelTest.textProperty().bind(Bindings.format("%.0f:00pm", timeSlider.valueProperty()));
        
    
);

【讨论】:

以上是关于如何设置滑块以固定位置?的主要内容,如果未能解决你的问题,请参考以下文章

固定位置:滚动

使用带有位置的背景滑块时,菜单上的悬停消失:固定和 z-index

UISlider 固定位置以保存值?

如何在 UI 底部的固定位置设置按钮?

悬停时的jquery图像预览-如何设置固定位置?

如何将图像设置在中心位置固定[重复]