Pregunta

Tengo un pequeño problema con mi JSlider, que no he sido capaz de resolver. Para explicar un poco la situación, tengo que hacer un JSlider va de 0 a 20, a través de pasos de 0,1. Me engañé a mi manera de salir de problemas mediante la creación de un JSlider de 0 a 200, y redefinió las etiquetas bajo el control deslizante para mostrar los porcentajes Corrent en lugar de los valores enteros.

Pero tengo un último problema: Estoy usando una costumbre L & F (que no puedo cambiar, obviamente, ya que es desde el cliente), que muestra el valor sobre el deslizador. Sin embargo, se muestra este valor ... en su forma estándar, como un entero. Por lo que he podido entender, esta pantalla está relacionada con la propiedad Slider.paintValue, que he podido ver en el código fuente javax.swing.plaf.synth.SynthSliderUI. Sin embargo, he estado dramáticamente incapaz de eliminarlo.

Lo que he tratado por ahora:

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

Ninguno de los dos ha cambiado nada.

¿Hay un gurú swing por aquí que podría sacarme de esto?

¿Fue útil?

Solución

acabo de crear una demo con un JSlider y utilizando el sintetizador básica LAF, y puedo confirmar que el establecimiento de esas propiedades no parece tener ningún efecto en absoluto, lo cual es extraño, y muy molesto también.

He mirado SynthSliderUI y puedo ver la protected boolean paintValue siendo set en private void updateStyle(JSlider c), por lo que si usted fuera a hacer una extensión personalizada esta clase, establece el valor de paintValue a falso, y luego configurar la interfaz de usuario de su control deslizante hacia la nueva interfaz de usuario con setUI(), que podría estar más cerca. O eso, o anular por completo los métodos de pintura, copiando el código de la original, pero la eliminación de la parte que el valor pinturas pulgar.

Ahora, sí es SynthSliderUI paquete-privada, pero eso no es realmente el problema de todos modos ya está utilizando un LAF provista por el cliente. Si su costumbre deslizador clase de interfaz de usuario es público y no definitiva, se puede hacer una versión hackeada como he descrito anteriormente, y aplicarlo a su deslizador.

Si es final, entonces usted podría ser capaz de utilizar la reflexión para cambiar ese campo paintValue como último recurso (tal vez justo antes de la pintura de su control deslizante). Las siguientes obras de hackers para mí (sacar la llamada de reflexión que establece el campo según falsa para ver el valor del pulgar siendo pintado):

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

}

Otros consejos

Llamando UIManager.put("Slider.paintValue", false) antes de la llamada a initComponents() trabajado para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top