JSlider
基本的なSynthLAFを使用してデモを作成しましたが、これらのプロパティを設定してもまったく効果がないように見えることを確認できます。これは奇妙で、非常に面倒です。
を確認したところ、が設定されているSynthSliderUI
ことがわかります。このクラスでカスタム拡張機能を作成し、の値をfalseに設定してから、スライダーのUIをで新しいUIに設定すると、近づく可能性があります。それか、paintメソッドを完全にオーバーライドして、元のコードからコードをコピーし、thumb値をペイントする部分を削除します。protected boolean paintValue
private void updateStyle(JSlider c)
paintValue
setUI()
現在、SynthSliderUI
それ自体はパッケージプライベートですが、クライアント提供のLAFを使用しているため、とにかくそれは実際には問題ではありません。カスタムスライダーUIクラスがパブリックで非ファイナルの場合は、上記のようにハッキングされたバージョンを作成して、スライダーに適用できます。
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);
}
});
}
}