Swing-JSlider用法-入门

JSlider是Swing中的滑块控件,在交互过程中用户可拖动它来实现数值的调整。它具有3个基本参数,分别为:最小值、最大值和初始值,如果不指定数值,则默认值分别为:0,100,50。滑块的值发生改变时,会产生ChangeEvent事件,因此必须事先为其绑定ChangeListener监听器,并在响应函数中使用getValue方法跟踪其最新值。滑块可以具有多种式样,首先是标尺。使用setMajorTickSpacing方法设置大格子的间距,setMinorTickSpacing设置小格子的间距,效果类似于直尺中的厘米刻度与毫米刻度。使用setPaintTicks(bool agr)设置是否显示标尺。使用setSnapToTicks设置滑块强制对应到标尺,开启后,点击滑块时它会跳到最近的下一刻度上。使用setInverted可以设置标尺方向反转。使用setPaintLabels可强制显示标尺刻度的标签。可使用setLabelTable为标尺设置各刻度对应的JLabel,其参数为一个Hashtable<Integer, Component>(),储存了刻度值与JLabel的对应表。当然,你也可以为所有JLabel添加图标。

常用方法如下:

示例代码如下:

import java.awt.*;
import java.util.Dictionary;
import java.util.Hashtable;
import javax.swing.*;
import javax.swing.event.*;

public class JSliderDemo extends JFrame {

    /**
     * source code from 《java核心技术 卷1 基础知识》 P340
     */

    int DEFAULT_WIDTH = 350;
    int DEFAULT_HEIGHT = 450;
    private JPanel sliderPanel;
    private JTextField textField;
    private ChangeListener changeListener;// 监听器

    public JSliderDemo() {
        setTitle("JSliderDemo");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        // 构造一个监听器,响应事件
        changeListener = new ChangeListener() {
            public void stateChanged(ChangeEvent event) {
                System.out.println("stateChanged called");
                // update textField when the slider value changes
                if (event.getSource() instanceof JSlider) {
                    JSlider source = (JSlider) event.getSource();
                    textField.setText("" + source.getValue());
                    System.out.println(source.getValue());
                }
            }
        };

        // 添加sliderPanel,它包含个JSlider
        sliderPanel = new JPanel();
        sliderPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

        // add textField that displays the slider value
        textField = new JTextField();
        add(sliderPanel, BorderLayout.CENTER);
        add(textField, BorderLayout.SOUTH);

        // add Plain slider
        JSlider slider = new JSlider();
        addSlider(slider, "Plain");

        // add Ticks slider
        slider = new JSlider();
        slider.setPaintTicks(true);// 显示标尺
        slider.setMajorTickSpacing(20); // 20一大格
        slider.setMinorTickSpacing(5);// 5一小格
        addSlider(slider, "Ticks");

        // add SnapToTicks slider
        slider = new JSlider();
        slider.setPaintTicks(true);// 显示标尺
        slider.setSnapToTicks(true);//强制对齐到标尺
        slider.setMajorTickSpacing(20);// 20一大格
        slider.setMinorTickSpacing(5);// 5一小格
        addSlider(slider, "SnapToTicks");

        // add NoTrack slider
        slider = new JSlider();
        slider.setPaintTicks(true);// 显示标尺
        slider.setMajorTickSpacing(20);// 20一大格
        slider.setMinorTickSpacing(5);// 5一小格
        slider.setPaintTrack(false);//不显示数轴
        addSlider(slider, "NoTrack");

        // add InvertedSlider
        slider = new JSlider();
        slider.setPaintTicks(true);// 显示标尺
        slider.setMajorTickSpacing(20);// 20一大格
        slider.setMinorTickSpacing(5);// 5一小格
        slider.setInverted(true);//反转slider方向
        addSlider(slider, "InvertedSlider");

        // add Slider with labels
        slider = new JSlider();
        slider.setPaintTicks(true);// 显示标尺
        slider.setPaintLabels(true);//添加数字标签
        slider.setMajorTickSpacing(20);// 20一大格
        slider.setMinorTickSpacing(5);// 5一小格
        addSlider(slider, "Labels");

        // add Slider with alphabetic labels
        slider = new JSlider();
        slider.setPaintTicks(true);// 显示标尺
        slider.setPaintLabels(true);
        slider.setMajorTickSpacing(20);// 20一大格
        slider.setMinorTickSpacing(5);// 5一小格

        Dictionary<Integer, Component> labelTable = new Hashtable<Integer, Component>();
        labelTable.put(0, new JLabel("A"));
        labelTable.put(20, new JLabel("B"));
        labelTable.put(40, new JLabel("C"));
        labelTable.put(60, new JLabel("D"));
        labelTable.put(80, new JLabel("E"));
        labelTable.put(100, new JLabel("F"));

        slider.setLabelTable(labelTable);
        addSlider(slider, "CustomLabels");

        // add IconsSlider
        slider = new JSlider();
        slider.setPaintTicks(true);// 显示标尺
        slider.setPaintLabels(true);
        slider.setSnapToTicks(true);
        slider.setMajorTickSpacing(20);// 20一大格
        slider.setMinorTickSpacing(20);// 20一小格

        labelTable = new Hashtable<Integer, Component>();
        labelTable.put(0, new JLabel(new ImageIcon("nine.gif")));
        labelTable.put(20, new JLabel(new ImageIcon("ten.gif")));
        labelTable.put(40, new JLabel(new ImageIcon("jack.gif")));
        labelTable.put(60, new JLabel(new ImageIcon("queen.gif")));
        labelTable.put(80, new JLabel(new ImageIcon("king.gif")));
        labelTable.put(100, new JLabel(new ImageIcon("ace.gif")));

        slider.setLabelTable(labelTable);
        addSlider(slider, "IconLabels");

    }

    /*
     * 添加一个slider,并绑定监听器
     */
    private void addSlider(JSlider slider, String description) {
        slider.addChangeListener(changeListener);
        JPanel panel = new JPanel();
        panel.add(slider);
        panel.add(new JLabel(description));
        sliderPanel.add(panel);
        System.out.println("addSlider called");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 创建窗体并指定标题
        JSliderDemo frame = new JSliderDemo();
        // 关闭窗体后退出程序
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 自动适配所有控件大小
        // frame.pack();
        // 设置窗体位置在屏幕中央
        frame.setLocationRelativeTo(null);
        // 显示窗体
        frame.setVisible(true);
    }

}

posted on 2015-07-12 22:02  pzy4447  阅读(5111)  评论(1编辑  收藏  举报