首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JSlider中删除显示在拇指上方的值

在JSlider中删除显示在拇指上方的值
EN

Stack Overflow用户
提问于 2010-12-16 20:41:02
回答 2查看 2.6K关注 0票数 6

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

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

我现在尝试的是:

代码语言:javascript
复制
UIManager.getLookAndFeelDefaults().put("Slider.paintValue", false);
UIManager.put("Slider.paintValue", false);

这两个人都没有改变任何事情。

这附近有没有摇摆大师能帮我脱身?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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值):

代码语言:javascript
复制
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);
            }
        });
    }

}
票数 4
EN

Stack Overflow用户

发布于 2012-03-20 04:08:51

在调用initComponents()之前调用UIManager.put("Slider.paintValue", false)对我来说很管用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4460840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档