6

JSliderに少し問題があり、解決できませんでした。状況を少し説明するために、私はJSliderを0から20まで、0.1ステップで実行する必要があります。0から200までのJSliderを作成し、スライダーの下のラベルを再定義して、整数値の代わりに現在のパーセンテージを表示することで、問題を解決しました。

しかし、最後の問題が1つあります。それは、スライダーのつまみの上に値を表示するカスタムL&F(明らかに、クライアントからのものであるため、変更できません)を使用していることです。ただし、この値は標準的な方法で整数として表示されます。私が把握できたことから、この表示は、ソースコードSlider.paintValueでわかるように、プロパティに関連しています。javax.swing.plaf.synth.SynthSliderUIしかし、私はそれを劇的に取り除くことができませんでした。

私が今試したこと:

UIManager.getLookAndFeelDefaults().put("Slider.paintValue", false);
UIManager.put("Slider.paintValue", false);

これら2つのいずれも何も変更しませんでした。

私をこれから抜け出すことができるSwingの第一人者はこのあたりにいますか?

4

2 に答える 2

4

呼び出しUIManager.put("Slider.paintValue", false)の前に呼び出すことinitComponents()は私のために働いた。

于 2012-03-19T20:08:51.277 に答える
4

JSlider基本的なSynthLAFを使用してデモを作成しましたが、これらのプロパティを設定してもまったく効果がないように見えることを確認できます。これは奇妙で、非常に面倒です。

を確認したところ、が設定されているSynthSliderUIことがわかります。このクラスでカスタム拡張機能を作成し、の値をfalseに設定してから、スライダーのUIをで新しいUIに設定すると、近づく可能性があります。それか、paintメソッドを完全にオーバーライドして、元のコードからコードをコピーし、thumb値をペイントする部分を削除します。protected boolean paintValueprivate void updateStyle(JSlider c)paintValuesetUI()

現在、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);
            }
        });
    }

}
于 2010-12-17T14:54:33.870 に答える