gpt4 book ai didi

java - 删除在 JSlider 中显示在拇指上的值

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:31 25 4
gpt4 key购买 nike

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

但我还有最后一个问题:我正在使用自定义 L&F(显然,我无法更改,因为它来自客户端),它在 slider 拇指上显示值。但是,此值显示为……以其标准方式显示为整数。据我所知,此显示与 Slider.paintValue 属性相关,正如我在 javax.swing.plaf.synth.SynthSliderUI 源代码中所见代码。但是,我一直无法删除它。

我现在尝试过的:

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

这两个都没有改变任何东西。

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

最佳答案

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

我查看了 SynthSliderUI,我可以看到 protected boolean paintValue 被设置在 private void updateStyle(JSlider c) 中,所以如果您要对此类进行自定义扩展,将 paintValue 的值设置为 false,然后使用 setUI() 将 slider 的 UI 设置为新的 UI,您可能会得到更近。要么,要么完全覆盖绘制方法,从原始代码中复制代码,但删除绘制拇指值的部分。

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

如果它是最终的,那么您可以使用反射来更改 paintValue 字段作为最后的手段(可能就在绘制 slider 之前)。以下 hack 对我有用(取出将字段设置为 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);
}
});
}

}

关于java - 删除在 JSlider 中显示在拇指上的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4460840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com