Question

J'ai un petit problème avec mon JSlider, que je ne l'ai pas été en mesure de résoudre. Pour expliquer la situation un peu, je dois faire un JSlider allant de 0 à 20, par pas de 0,1. Je dupé ma façon de sortir des problèmes en créant un JSlider de 0 à 200, et redéfinis les étiquettes sous le curseur pour afficher les pourcentages CORRENT au lieu des valeurs entières.

Mais j'ai un dernier problème: J'utilise un L & F personnalisée (que je ne peux pas changer, évidemment, car il est du client), qui affiche la valeur sur le pouce du curseur. Cependant, cette valeur est affichée ... à sa manière standard, comme un entier. D'après ce que j'ai pu saisir, cet affichage est lié à la propriété Slider.paintValue, comme je peux voir dans le code source de javax.swing.plaf.synth.SynthSliderUI. Cependant, je suis incapable de façon spectaculaire l'enlever.

Ce que j'ai essayé pour l'instant:

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

Aucun de ces deux rien changé.

Y at-il un gourou Swing ici qui pourrait me sortir de cette situation?

Était-ce utile?

La solution

Je viens de créer une démo avec un JSlider et en utilisant le synthé LAF de base, et je peux confirmer que la définition de ces propriétés semble avoir aucun effet du tout, ce qui est trop étrange, et très ennuyeux.

J'ai regardé SynthSliderUI et je peux voir le protected boolean paintValue être mis en private void updateStyle(JSlider c), donc si vous deviez faire une extension personnalisée de cette classe, définissez la valeur de paintValue false, puis définissez l'interface utilisateur de votre curseur vers la nouvelle interface utilisateur avec setUI(), vous pourriez se rapprocher. Ou alors, complètement outrepasser les méthodes de peinture, le code de la copie de l'original mais en supprimant la partie que les peintures, la valeur du pouce.

Maintenant, SynthSliderUI est lui-même paquet-privé, mais ce n'est pas vraiment la question de toute façon puisque vous utilisez un client de LAF fourni. Si leur coutume curseur classe UI est publique et non-finale, vous pouvez faire une version piratée comme je l'ai décrit ci-dessus, et l'appliquer à votre curseur.

Si ce dernier est, alors vous pourriez être en mesure d'utiliser la réflexion pour changer ce champ de paintValue en dernier recours (peut-être juste avant la peinture de votre curseur). Les travaux hack pour moi (Repoussez l'appel de réflexion qui définit le champ à false pour voir la valeur du pouce étant peint):

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

}

Autres conseils

Appel UIManager.put("Slider.paintValue", false) avant l'appel à initComponents() travaillé pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top