Domanda

Ho un piccolo problema con la mia JSlider, che non sono stato in grado di risolvere. Per spiegare la situazione un po ', devo fare un JSlider che va da 0 a 20, con 0,1 punti. Ho ingannato il mio modo per uscire da problemi con la creazione di un JSlider da 0 a 200, e ridefinito le etichette sotto il dispositivo di scorrimento per visualizzare le percentuali corrent invece dei valori interi.

Ma ho un ultimo problema: sto usando un custom L & F (che non posso cambiare, ovviamente, in quanto è dal client), che visualizza il valore sopra la casella di scorrimento. Tuttavia, viene visualizzato il valore ... nel suo modo standard, come un intero. Da quello che ho potuto cogliere, questo display è legato alla proprietà Slider.paintValue, come posso vedere nel codice sorgente javax.swing.plaf.synth.SynthSliderUI. Tuttavia, sono stato drammaticamente in grado di rimuoverlo.

Quello che ho provato per ora:

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

Nessuno di questi due cambiato nulla.

C'è un guru swing qui intorno che potesse tirarmi fuori da questo?

È stato utile?

Soluzione

Ho appena creato una demo con un JSlider e utilizzando la base Synth LAF, e posso confermare che l'impostazione di quelle proprietà sembra non avere alcun effetto a tutti, il che è strano, e molto fastidioso troppo.

Ho guardato SynthSliderUI e posso vedere la protected boolean paintValue essere impostato in private void updateStyle(JSlider c), quindi se si dovesse fare un'estensione personalizzata questa classe, impostare il valore di paintValue false, e quindi impostare interfaccia utente del dispositivo di scorrimento per la nuova interfaccia utente con setUI(), si potrebbe avvicinarsi. O che, o completamente sovrascrivere i metodi di vernice, copiare il codice fuori dalla originale, ma rimuovendo la parte che dipinge il valore del pollice.

Ora, SynthSliderUI stesso è il pacchetto-privato, ma che non è realmente il problema in ogni caso dal momento che si sta utilizzando un client LAF-fornito. Se il loro costume cursore Class UI è pubblica e non definitivo, è possibile effettuare una versione modificata, come ho descritto sopra, e applicarlo al vostro dispositivo di scorrimento.

Se è finale, allora si potrebbe essere in grado di utilizzare la reflection per cambiare quel campo paintValue come ultima risorsa (forse solo prima di dipingere il vostro cursore). I seguenti lavori hack per me (prendere la chiamata riflessione che imposta il campo falso per vedere il valore del pollice da verniciare):

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

}

Altri suggerimenti

La chiamata UIManager.put("Slider.paintValue", false) prima della chiamata a initComponents() lavorato per me.

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