我的JSlider有点问题,我无法解决。为了稍微解释情况,我必须做一个从0到20到0.1步的JSlider。我通过创建一个从0到200的JSlider来欺骗问题,并重新定义了滑块下的标签以显示相关百分比而不是整数值。

但是我有一个最后的问题:我正在使用自定义L&F(显然,我无法更改客户),它显示了滑块拇指上的值。但是,该值以标准方式显示为整数。从我能够掌握的内容来看,此显示与 Slider.paintValue 我可以看到的财产 javax.swing.plaf.synth.SynthSliderUI 源代码。但是,我非常无法将其删除。

我现在尝试了什么:

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

这两个没有任何改变。

周围有一个秋千上的大师可以让我摆脱困境吗?

有帮助吗?

解决方案

我刚刚创建了一个演示 JSlider 并使用基本的合成器LAF,我可以确认设置这些属性似乎根本没有效果,这也很奇怪,而且非常烦人。

我看了看 SynthSliderUI 我可以看到 protected boolean paintValue 被安置 private void updateStyle(JSlider c), ,因此,如果您要进行自定义扩展名此类,请设置 paintValue false,然后将您的滑块的UI设置为新的UI setUI(), ,您可能会越来越近。要么要么完全覆盖油漆方法,要从原始的代码中复制代码,但要删除绘制拇指值的部分。

现在, SynthSliderUI 本身是包装私有化的,但这并不是真正的问题,因为您使用了客户提供的LAF。如果他们的自定义滑块UI类是公共和非结构的,则可以如上所述制作一个黑客版本,并将其应用于您的滑块。

如果是最终的,那么您也许可以使用反思来改变 paintValue 作为最后的手段(也许是在绘画滑块之前)。以下黑客对我有用(取出将字段设置为false的反射调用,以查看被绘制的拇指值):

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

}

其他提示

打电话 UIManager.put("Slider.paintValue", false) 在打电话之前 initComponents() 为我工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top