Pregunta

Cada vez que hago clic en un JSlider que se posiciona una majorTick en la dirección del clic en vez de saltar al punto en realidad hago clic. (Si deslizador está en el punto 47 y haga clic en 5 que va a saltar a 37 en vez de 5). ¿Hay alguna manera de cambiar esto durante el uso de JSliders, o tengo que utilizar otra estructura de datos?

¿Fue útil?

Solución

Por extraño que esto pueda parecer, en realidad es la apariencia que controla este comportamiento. Echar un vistazo a BasicSliderUI, el método que se debe redefinir es scrollDueToClickInTrack(int) .

Con el fin de establecer el valor de la JSlider al valor más cercano a donde el usuario hace clic en la pista, que había necesidad de hacer alguna traducción pantalones de fantasía entre las coordenadas del ratón de getMousePosition() a un valor válido pista , teniendo en cuenta la posición de la Component, es la orientación, el tamaño y la distancia entre las garrapatas etc. . Por suerte, valueForXPosition(int xPos) nos da dos funciones útiles para hacer esto: valueForYPosition(int yPos) y <=> :

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);
    }
});

Otros consejos

Esta pregunta es un poco viejo, pero me acaba de ejecutar a través de este problema por mí 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);
    }
};

Este comportamiento se deriva de OS. ¿Está seguro de que desea volver a definir y confundir a los usuarios? No lo creo. ;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top