2

可能な値が 10 (最小)、30、60、および 100 (最大) の 4 つのみの JSlider を作成したいと考えています。これらの値のみに「スナップ」できるものを作成することは可能ですか? もしそうなら、例を挙げていただけますか?ありがとう!

4

2 に答える 2

4

次の例は、探していることを実行する最も簡単な方法です。JSlider サブクラスの getValue() を単純にオーバーライドしてドメイン固有の値を返すことはできないことに注意してください。これは、基礎となる JSlider/BasicSliderUI 実装にとって問題があるためです。この例では、カスタム getDomainValue() を定義して、スライダーの目盛り位置に基づいてドメイン固有の値 (10、30、60、または 100) を返します。

package example.stackoverflow;

import java.util.Hashtable;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class SteppingSliderExample
{
    public static class SteppingSlider extends JSlider
    {
        private static final long serialVersionUID = -1195270044097152629L;
        private static final Integer[] VALUES = { 10, 30, 60, 100 };
        private static final Hashtable<Integer, JLabel> LABELS = new Hashtable<>();
        static
        {
            for(int i = 0; i < VALUES.length; ++i)
            {
                LABELS.put(i, new JLabel(VALUES[i].toString()));
            }
        }

        public SteppingSlider()
        {
            super(0, VALUES.length - 1, 0);
            setLabelTable(LABELS);      
            setPaintTicks(true);
            setPaintLabels(true);
            setSnapToTicks(true);
            setMajorTickSpacing(1);
        }

        public int getDomainValue()
        {
            return VALUES[getValue()];
        }
    }

    public static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SteppingSlider");
        frame.setSize(500, 120);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final SteppingSlider steppingSlider = new SteppingSlider();
        final String labelPrefix = "Slider value: ";
        final JLabel output = new JLabel(labelPrefix + steppingSlider.getDomainValue());
        steppingSlider.addChangeListener(new ChangeListener()
        {           
            @Override
            public void stateChanged(ChangeEvent evt)
            {
                output.setText(labelPrefix + steppingSlider.getDomainValue());
            }
        });
        frame.getContentPane().setLayout(
                new BoxLayout(frame.getContentPane(), 
                        BoxLayout.Y_AXIS));     
        frame.getContentPane().add(steppingSlider);
        frame.getContentPane().add(output);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
于 2013-07-30T03:20:46.723 に答える
-1

getValue() をオーバーライドし、[1,2,3,4] (オリジナル) を [10,30,60,100] にマップする JSlider のサブクラスを作成します。私の頭に浮かぶ最も簡単な解決策。

于 2013-07-30T00:52:25.700 に答える