質問
私はJSLiderに少し問題があり、解決できなかった。状況を少し説明するには、0から20までのJSLiderを0.1ステップまで実行する必要があります。 JSLiderを0から200まで作成することで問題から抜け出し、スライダーの下のラベルを再定義して、整数値の代わりにCorrentパーセンテージを表示しました。
しかし、最後の問題が1つあります。カスタムL&F(クライアントからのように、明らかに変更できないことを使用しています)を使用しています。ただし、この値は標準的な方法で、整数として表示されます。私が把握できたことから、このディスプレイはに関連しています Slider.paintValue
私が見ることができるように、プロパティ javax.swing.plaf.synth.SynthSliderUI
ソースコード。しかし、私はそれを劇的に削除することができませんでした。
私が今試したこと:
UIManager.getLookAndFeelDefaults().put("Slider.paintValue", false);
UIManager.put("Slider.paintValue", false);
これら2つは何も変更しませんでした。
この辺りに私を抜け出すことができるスイングの第一人者はいますか?
解決
デモを作成しました JSlider
基本的なシンセLAFを使用して、これらのプロパティの設定がまったく効果がないように見えることを確認できます。これは奇妙で、非常に迷惑です。
私は見ました SynthSliderUI
そして、私は見ることができます protected boolean paintValue
設定されています private void updateStyle(JSlider c)
, 、したがって、このクラスをカスタム拡張機能にする場合は、 paintValue
falseに、次にスライダーのUIを新しいUIに設定します setUI()
, 、あなたは近づくかもしれません。それは、ペイント方法を完全に上書きし、元のコードをコピーしますが、親指値を塗装する部分を削除します。
今、 SynthSliderUI
それ自体はパッケージプライベートですが、クライアントが提供するLAFを使用しているため、それは実際には問題ではありません。カスタムスライダーのUIクラスが公開されており、非ファイナルである場合は、上記のようにハッキングされたバージョンを作成し、スライダーに適用できます。
最終的な場合は、反射を使用してそれを変更できる場合があります 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()
私のために働いた。