如何设置滑块以固定位置?
How to set a slider to fix to positions?
我有一个滑块,我要求它固定为整数 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()));
}
}
});
尝试将 snapToTicks
设置为 true 并将主要刻度间距设置为 23:
timeSlider.setSnapToTicks(true);
timeSlider.setMajorTickUnit(23.0);
timeSlider.setBlockIncrement(23.0);
timeSlider.setMinorTickCount(0.0); // Disable minor ticks
为了使其与数字对齐,我使用了 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()));
}
}
});
我有一个滑块,我要求它固定为整数 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()));
}
}
});
尝试将 snapToTicks
设置为 true 并将主要刻度间距设置为 23:
timeSlider.setSnapToTicks(true);
timeSlider.setMajorTickUnit(23.0);
timeSlider.setBlockIncrement(23.0);
timeSlider.setMinorTickCount(0.0); // Disable minor ticks
为了使其与数字对齐,我使用了 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()));
}
}
});