Java 删除JSlider中thumb上显示的值

Java 删除JSlider中thumb上显示的值,java,swing,jslider,Java,Swing,Jslider,我的JSlider有一个小问题,我还没有解决。为了稍微解释一下这种情况,我必须做一个JSlider,从0到20,经过0.1个步骤。我通过创建一个从0到200的JSlider来解决问题,并在滑块下重新定义标签,以显示相应的百分比而不是整数值 但我还有最后一个问题:我使用的是自定义L&F(很明显,我无法更改,因为它来自客户端),它在滑块上显示值。但是,此值以标准方式显示为整数。从我所掌握的情况来看,这个显示与Slider.paintValue属性有关,正如我在javax.swing.plaf.syn

我的JSlider有一个小问题,我还没有解决。为了稍微解释一下这种情况,我必须做一个JSlider,从0到20,经过0.1个步骤。我通过创建一个从0到200的JSlider来解决问题,并在滑块下重新定义标签,以显示相应的百分比而不是整数值

但我还有最后一个问题:我使用的是自定义L&F(很明显,我无法更改,因为它来自客户端),它在滑块上显示值。但是,此值以标准方式显示为整数。从我所掌握的情况来看,这个显示与
Slider.paintValue
属性有关,正如我在
javax.swing.plaf.synth.SynthSliderUI
源代码中看到的那样。然而,我一直无法删除它

我现在尝试的是:

UIManager.getLookAndFeelDefaults().put("Slider.paintValue", false);
UIManager.put("Slider.paintValue", false);
这两个人都没有改变什么


这里有没有一位Swing大师可以帮我摆脱困境?

我刚刚用一个
JSlider
创建了一个演示,并使用基本的Synth LAF,我可以确认设置这些属性似乎没有任何效果,这很奇怪,也很烦人

我已经查看了
SynthSliderUI
,我可以看到在
private void updateStyle(JSlider c)
中设置了
protected boolean paintValue
,因此,如果要对此类进行自定义扩展,请将
paintValue
的值设置为false,然后使用
setUI()
将滑块的UI设置为新的UI,你可能会更靠近。或者完全重写绘制方法,将代码从原始代码中复制出来,但删除绘制thumb值的部分

现在,
SynthSliderUI
本身是包私有的,但这并不是真正的问题,因为您使用的是客户机提供的LAF。如果他们的自定义SliderUI类是公共的和非最终的,您可以制作一个黑客版本,如我上面所述,并将其应用于您的slider

如果是final,那么您可以使用反射来更改
paintValue
字段,作为最后的手段(可能就在绘制滑块之前)。下面的hack对我很有用(去掉反射调用,该调用将字段设置为false,以查看正在绘制的thumb值):

导入java.awt.BorderLayout;
导入java.lang.reflect.Field;
导入javax.swing.JFrame;
导入javax.swing.JSlider;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
公共类幻灯片{
公共静态void main(字符串[]args)引发异常{
setLookAndFeel(“javax.swing.plaf.synth.SynthLookAndFeel”);
Class slideruicclass=Class.forName(“javax.swing.plaf.synth.SynthSliderUI”);
最终字段paintValue=sliderUIClass.getDeclaredField(“paintValue”);
paintValue.setAccessible(true);
SwingUtilities.invokeAndWait(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setLayout(新的BorderLayout());
JSlider滑块=新JSlider(3,6,4);
试一试{
paintValue.set(slider.getUI(),false);
}捕获(例外e){
抛出新的运行时异常(e);
}
f、 添加(滑块、边框布局、中心);
f、 包装();
f、 setVisible(真);
}
});
}

}
在调用
initComponents()
之前调用
UIManager.put(“Slider.paintValue”,false)
对我有效。

嗯,我真的不能这样做,因为这是商业代码。此外,我唯一要做的就是创建一个JSlider,然后尝试设置它。SSCCE在这里并不适用。天哪,为什么我不能想到用反射来做这件事呢?我认为你的解决方案可能有效。一旦我有时间测试它,我会告诉你,然后标记问题的答案:)伙计,你真的在这件事上救了我的命。很抱歉不能在这个问题上悬赏,我真的很想给你多一点代表性。在这里回答了很多问题后,这是我第一次问的问题之一,我很高兴。再次感谢!没问题。:)在这种情况下,反省往往会起到解救作用,这真是太可怕了!
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);
            }
        });
    }

}