Я только что создал демо с JSlider
и использую базовый Synth LAF, и я могу подтвердить, что установка этих свойств, кажется, не имеет никакого эффекта, что странно и очень раздражает.
Я посмотрел на SynthSliderUI
и вижу, что protected boolean paintValue
устанавливается в private void updateStyle(JSlider c)
, поэтому, если вы хотите создать собственное расширение для этого класса, установите значение paintValue
в false, а затем установите Пользовательский интерфейс вашего ползунка к новому пользовательскому интерфейсу с setUI()
, вы можете стать ближе. Либо так, либо полностью переопределите методы рисования, копируя код из оригинала, но удаляя часть, которая рисует значение большого пальца.
Теперь, SynthSliderUI
сам по себе является частным пакетом, но в любом случае это не проблема, так как вы используете предоставляемый клиентом LAF. Если пользовательский класс пользовательского интерфейса слайдера является открытым и не является финальным, вы можете создать взломанную версию, как я описал выше, и применить ее к своему слайдеру.
Если он окончательный, то вы можете использовать отражение, чтобы изменить это поле 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);
}
});
}
}