我的JSlider出了点小问题,我还没能解决。为了稍微解释一下这种情况,我必须执行一个从0到20的JSlider,历经0.1个步骤。我通过创建一个从0到200的JSlider来解决问题,并重新定义了滑块下的标签,以显示当前百分比而不是整数值。
但我还有最后一个问题:我正在使用一个自定义的L&F (显然,我不能更改它,因为它来自客户端),它将值显示在滑块拇指上。但是,该值以整数形式以其标准方式进行displayed...in。根据我所掌握的,这个显示与Slider.paintValue属性有关,正如我在javax.swing.plaf.synth.SynthSliderUI源代码中看到的那样。然而,我一直无法将其删除。
我现在尝试的是:
UIManager.getLookAndFeelDefaults().put("Slider.paintValue", false);
UIManager.put("Slider.paintValue", false);这两个人都没有改变任何事情。
这附近有没有摇摆大师能帮我脱身?
发布于 2010-12-17 22:54:34
我刚刚用JSlider和基本的Synth LAF创建了一个演示,我可以确认设置这些属性似乎完全没有效果,这很奇怪,也非常恼人。
我看过SynthSliderUI,我可以看到protected boolean paintValue是在private void updateStyle(JSlider c)中设置的,所以如果您要在这个类中创建一个自定义扩展,将paintValue的值设置为false,然后使用setUI()将滑块的UI设置为新的UI,您可能会更接近。或者完全覆盖paint方法,从原始代码中复制代码,但删除绘制Thumb值的部分。
现在,SynthSliderUI本身是包私有的,但这并不是真正的问题,因为您使用的是客户端提供的LAF。如果他们的自定义滑块UI类是公共的和非最终的,你可以像我上面描述的那样制作一个经过修改的版本,并将其应用到你的滑块上。
如果是最终结果,那么您可以使用反射来更改paintValue字段,作为最后的手段(可能就在绘制滑块之前)。下面的方法适用于我(去掉将字段设置为false的反射调用,以查看绘制的Thumb值):
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);
}
});
}
}发布于 2012-03-20 04:08:51
在调用initComponents()之前调用UIManager.put("Slider.paintValue", false)对我来说很管用。
https://stackoverflow.com/questions/4460840
复制相似问题