Удалить значение, отображающееся на большом пальце в jslider

StackOverflow https://stackoverflow.com/questions/4460840

  •  10-10-2019
  •  | 
  •  

Вопрос

У меня есть небольшая проблема с моим jslider, которую я не смог решить. Чтобы немного объяснить ситуацию, я должен сделать JSLIDER, пройдя от 0 до 20 до 0,1 шага. Я обманул свой выход из проблем, создав JSLIDER с 0 до 200 и переопределил этикетки под ползунка, чтобы отобразить корректные проценты вместо целочисленных значений.

Но у меня есть одна последняя проблема: я использую пользовательский 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, а затем установить пользователь setUI(), вы можете подойти ближе. Либо это, либо полностью переопределяйте методы краски, копируя код из исходного, но удаляя часть, которая рисует значение большого пальца.

В настоящее время, SynthSliderUI Сам сам по себе является пакетным, но в любом случае это не проблема, так как вы используете LAF, предоставляемый клиентом. Если их класс пользовательского пользовательского интерфейса является общедоступным и не является финалом, вы можете сделать взломанную версию, как я описал выше, и применить ее к своему слайдеру.

Если это окончательно, то вы сможете использовать отражение, чтобы изменить это paintValue Поле как последнее средство (может быть, перед тем, как покрасить свой слайдер). Следующий взлом работает для меня (выберите размышленный звонок, который устанавливает поле ложно, чтобы увидеть, как нарисовано значение большого пальца):

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() работал на меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top