Frage

habe ich ein kleines Problem mit meinen JSlider, dass ich zu lösen nicht in der Lage gewesen. geht von 0 bis 20, bis 0,1 Schritte, um die Situation etwas zu erklären, muß ich einen JSlider tun. Ich betrog meinen Weg aus den Problemen, die durch einen JSlider 0-200 erstellen und neu definiert, die Etiketten unter dem Schieberegler anstelle den Integer-Werte, die corrent Prozentsatz angezeigt werden soll.

Aber ich habe noch ein letztes Problem: Ich verwende ein benutzerdefinierten L & F (die ich nicht, natürlich ändern kann, wie es von dem Client ist), dass zeigt den Wert über den Schieberegler. Jedoch wird dieser Wert angezeigt ... in seiner Standard Art und Weise, als eine ganze Zahl. Von dem, was ich habe begreifen kann, wird diese Anzeige auf das Slider.paintValue Eigentum, wie ich in javax.swing.plaf.synth.SynthSliderUI Quellcode sehen kann. Allerdings habe ich dramatisch nicht in der Lage gewesen, es zu entfernen.

Was ich jetzt versucht:

UIManager.getLookAndFeelDefaults().put("Slider.paintValue", false);
UIManager.put("Slider.paintValue", false);

Keiner der beiden veränderten alles.

Sie haben einen Swing-Guru hier, die mich herauskommen könnte?

War es hilfreich?

Lösung

Ich habe gerade eine Demo mit einem JSlider und mit dem Grunde Synth LAF, und ich kann bestätigen, dass diese Eigenschaften Einstellung erscheint überhaupt keine Wirkung zu haben, die ungerade ist, und auch sehr ärgerlich.

Ich habe bei SynthSliderUI sehe und ich kann den protected boolean paintValue sein Set in private void updateStyle(JSlider c) sehen, wenn Sie also diese Klasse eine benutzerdefinierte Erweiterung machen waren, den Wert von paintValue auf false, und dann Schieber UI auf den neuen UI-Set mit setUI(), könnten Sie näher. Entweder das, oder vollständig die Farbe Methoden überschreiben, kopieren Code aus dem Original, aber das Entfernen der Teil, dass Farben der Daumen Wert.

Nun SynthSliderUI selbst ist Paket-private, aber das ist nicht wirklich das Problem sowieso, da Sie einen Client bereitgestellte LAF verwenden. Wenn ihre benutzerdefinierten Slider UI-Klasse ist öffentlich und nicht-final, können Sie eine gehackte Version machen, wie ich oben beschrieben, und es auf Ihren Schieberegler.

Wenn der Vorgang abgeschlossen wird, dann könnten Sie in der Lage sein, Reflexion zu verwenden, das paintValue Feld als letztes Mittel zu ändern (vielleicht kurz vor Ihrem Schieber Malerei). Die folgende Hack funktioniert für mich (nehmen Sie die Reflexion Anruf, dass setzt das Feld auf false den Daumen Wert, um zu sehen, gemalt):

import java.awt.BorderLayout;
import java.lang.reflect.Field;

import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SliderDemo {

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel("javax.swing.plaf.synth.SynthLookAndFeel");

        Class<?> sliderUIClass = Class.forName("javax.swing.plaf.synth.SynthSliderUI");
        final Field paintValue = sliderUIClass.getDeclaredField("paintValue");
        paintValue.setAccessible(true);

        SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setLayout(new BorderLayout());

                JSlider slider = new JSlider(3, 6, 4);
                try {
                    paintValue.set(slider.getUI(), false);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                f.add(slider, BorderLayout.CENTER);

                f.pack();
                f.setVisible(true);
            }
        });
    }

}

Andere Tipps

Beim UIManager.put("Slider.paintValue", false) vor dem Aufruf von initComponents() für mich gearbeitet.

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