Frage

Immer wenn ich einen JSlider klicken sie einen Hauptstrich in Richtung des Klick statt Springen auf die Stelle positioniert werden tatsächlich klicken ich. (Wenn Schieber am Punkt 47 und I 5 klicken, es wird auf 37 springen anstatt 5). Gibt es eine Möglichkeit, diese bei der Verwendung von JSliders zu ändern, oder muss ich eine andere Datenstruktur benutzen?

War es hilfreich?

Lösung

So bizarr dies scheinen mag, es ist eigentlich das Look and Feel, die dieses Verhalten steuert. Werfen Sie einen Blick auf BasicSliderUI, die Methode, die Sie außer Kraft setzen müssen, ist scrollDueToClickInTrack(int) .

Um den Wert des JSlider zum nächsten Wert zu setzen, wo der Benutzer auf der Spur geklickt, dann würden Sie müssen einige fancy pants Übersetzung zwischen der Maus von getMousePosition() auf einen gültige Spur Wert Koordinaten zu tun, unter Berücksichtigung die Position der Component, ist es Orientierung, Größe und Abstand zwischen Ticks etc . Glücklicherweise BasicSliderUI gibt uns zwei praktische Funktionen zur Verfügung: valueForXPosition(int xPos) und 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);
    }
});

Andere Tipps

Diese Frage ist etwas alt, aber ich lief gerade über dieses Problem selbst. Dies ist meine Lösung:

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

Dieses Verhalten wird von O abgeleitet. Sind Sie sicher, dass Sie es neu definieren möchten und Benutzer zu verwirren? Ich glaube nicht. ;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top