Domanda

Ogni volta che si fa clic su un JSlider ottiene posizionato uno majorTick nella direzione del click invece di saltare al punto ho effettivamente clic. (Se cursore è al punto 47 e clicco 5 che salterà a 37 invece di 5). C'è un modo per cambiare questo durante l'utilizzo JSliders, o devo usare un altro datastructure?

È stato utile?

Soluzione

Per quanto bizzarro possa sembrare, in realtà è l'aspetto grafico che controlla questo comportamento. Date un'occhiata a BasicSliderUI, il metodo che è necessario sovrascrivere è scrollDueToClickInTrack(int) .

Per impostare il valore della JSlider al valore più vicino al punto in cui l'utente fa clic sul tracciato, avresti bisogno di fare un po 'di fantasia traduzione pantaloni tra le coordinate del mouse da getMousePosition() ad un valore pista valida , tenendo conto della posizione del Component, è l'orientamento, la dimensione e la distanza tra le zecche etc . Per fortuna, valueForXPosition(int xPos) ci dà due funzioni a portata di mano per farlo: valueForYPosition(int yPos) e <=> :

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

Altri suggerimenti

Questa domanda è una specie di vecchio, ma ho appena eseguito attraverso questo problema io stesso. Questa è la mia soluzione:

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

Questo comportamento è derivato dal sistema operativo. Sei sicuro di voler ridefinire e confondere gli utenti? Non ci penso. ;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top