Как бы странно это не выглядело, на самом деле это поведение выглядит и чувствует, что контролирует это поведение. Взгляните на BasicSliderUI
, метод, который вам нужно переопределить, это scrollDueToClickInTrack(int)
.
Чтобы установить значение JSlider
равным ближайшему значению, по которому пользователь щелкнул по дорожке, вам нужно будет выполнить несколько фигурных переходов между координатами мыши от getMousePosition()
до действительного значения дорожки с учетом положения Component
, его ориентации, размера и расстояния между галочками и т. д. . К счастью, BasicSliderUI
дает нам две удобные функции для этого: valueForXPosition(int xPos)
и valueForYPosition(int yPos)
:
JSlider slider = new JSlider(JSlider.HORIZONTAL);
slider.setUI(new MetalSliderUI() {
protected void scrollDueToClickInTrack(int direction) {
// this is the default behaviour, let's comment that out
//scrollByBlock(direction);
int value = slider.getValue();
if (slider.getOrientation() == JSlider.HORIZONTAL) {
value = this.valueForXPosition(slider.getMousePosition().x);
} else if (slider.getOrientation() == JSlider.VERTICAL) {
value = this.valueForYPosition(slider.getMousePosition().y);
}
slider.setValue(value);
}
});