可能在JSlider中捕捉到某些值?

时间:2013-07-29 23:55:36

标签: java swing jslider

我想创建一个只有四个可能值的JSlider:10(min),30,60和100(max)。是否有可能创建一个只能“捕捉”到这些值?如果是这样,你能举个例子吗?谢谢!

2 个答案:

答案 0 :(得分: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();
            }
        });
    }
}

答案 1 :(得分:-1)

写一个JSlider的子类来覆盖getValue()和map,例如[1,2,3,4](原件)至[10,30,60,100]。我想到的最简单的解决方案。