5

タイトルで説明したように、単純な JSlider を作成し、最小値と最大値、およびマイナー ティック間隔を正常に設定してから、「setSnapToTicks」を true に設定しました。その部分に問題はありません。ユーザーがマウスを離すと、私のノブは最も近い目盛りで移動します。これは簡単ではありません。

しかし、マウスを離さずにこの効果を得たいと思っています。ノブは、目盛り間の値に注意を払わずに目盛りごとに移動する必要があります。目盛り値でのみ「ジャンプ」したいのです。多くの検索を行ったところ、答えが見つかりませんでした。検索しているステップの種類を設定するはずの「setExtent」について聞いたところですが、デバッグ後に機能しませんでした。JSlider の簡単な宣言は次のとおりです。

sliderFlightLevel = new JSlider();
sliderFlightLevel.setValue(100);
sliderFlightLevel.setMinorTickSpacing(100);
sliderFlightLevel.setMinimum(100);
sliderFlightLevel.setMaximum(50000);
GridBagConstraints gbcSliderFlightLevel = new GridBagConstraints();
gbcSliderFlightLevel.gridwidth = 3;
gbcSliderFlightLevel.insets = new Insets(0, 10, 5, 10);
gbcSliderFlightLevel.fill = GridBagConstraints.HORIZONTAL;
gbcSliderFlightLevel.gridx = 0;
gbcSliderFlightLevel.gridy = 1;
mainPanel.add(sliderFlightLevel, gbcSliderFlightLevel);

読んでくれてありがとう、私はいくつかの助けを得ることを願っています:)

4

1 に答える 1

1

この動作は、コンポーネント ( ) の UI デリゲートによって制御されると思いますSliderUI。別のルック アンド フィールを試すか、使用しているルック アンド フィールを構成してみてください。

コンポーネントに別の UI デリゲートをインストールすることもできます。

スイング コンポーネントの動作をカスタマイズするこの実際の例を参照してください。

編集

私はその仕事をする醜いハックを思いつきました。BasicSliderUIこのコードは、 (ほとんどのルック アンド フィールで使用される)クラスの実装の詳細に完全に依存しています。

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JSlider;
import javax.swing.plaf.metal.MetalSliderUI;

public class MetalSnapSliderUI extends MetalSliderUI {

    private MouseMotionListener myMouseMotionListener = new MouseMotionListener() {

        public void mouseDragged(MouseEvent e) {
            trackListener.mouseDragged(e);
            calculateThumbLocation();
            slider.repaint();
        }

        public void mouseMoved(MouseEvent e) {
            trackListener.mouseMoved(e);
        }

    };

    @Override
    protected void installListeners(JSlider slider) {
        super.installListeners(slider);
        slider.removeMouseMotionListener(trackListener);
        slider.addMouseMotionListener(myMouseMotionListener);
    }

    @Override
    protected void uninstallListeners(JSlider slider) {
        super.uninstallListeners(slider);
        slider.removeMouseMotionListener(myMouseMotionListener);
    }

}

この UI を JSlider にインストールする必要があります。

    JSlider s = new JSlider();
    s.setUI(new MetalSnapSliderUI());
于 2013-03-08T11:29:28.383 に答える