java - que - Pregunta de JSlider: posición después del clic izquierdo
scrollbar java swing (3)
Este comportamiento se deriva del sistema operativo. ¿Seguro que quieres redefinirlo y confundir a los usuarios? No lo creo. ;)
Cada vez que hago clic en un JSlider, se coloca un Tick principal en la dirección del clic en lugar de saltar al punto en el que hago clic. (Si el control deslizante está en el punto 47 y hago clic en 5, saltará a 37 en lugar de 5). ¿Hay alguna manera de cambiar esto al usar JSliders, o tengo que usar otra estructura de datos?
Por extraño que parezca, en realidad es el Look and Feel el que controla este comportamiento. Eche un vistazo a BasicSliderUI
, el método que debe sobrescribir es scrollDueToClickInTrack(int)
.
Para establecer el valor de JSlider
al valor más cercano al lugar donde el usuario hizo clic en la pista, necesitaría hacer una elegante conversión entre las coordenadas del mouse de getMousePosition()
a un valor de pista válido, teniendo en cuenta el posición del Component
, su orientación, tamaño y distancia entre los tics, etc. Afortunadamente, BasicSliderUI
nos brinda dos funciones útiles para hacer esto: valueForXPosition(int xPos)
y 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);
}
});
Esta pregunta es un poco antigua, pero me encontré con este problema yo mismo. Esta es mi solución:
JSlider slider = new JSlider(/* your options here if desired */) {
{
MouseListener[] listeners = getMouseListeners();
for (MouseListener l : listeners)
removeMouseListener(l); // remove UI-installed TrackListener
final BasicSliderUI ui = (BasicSliderUI) getUI();
BasicSliderUI.TrackListener tl = ui.new TrackListener() {
// this is where we jump to absolute value of click
@Override public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
int value = ui.valueForXPosition(p.x);
setValue(value);
}
// disable check that will invoke scrollDueToClickInTrack
@Override public boolean shouldScroll(int dir) {
return false;
}
};
addMouseListener(tl);
}
};