valore Rimuovere la visualizzazione di oltre il pollice in JSlider
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?
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.