题
我的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()
为我工作。