12.7 创建滑动条

12.7 创建滑动条

JSlider的用法和JProgressBar的用法非常相似,这一点可以从它们共享同一个Model类看出来。使用JSlider可以创建一个滑动条,这个滑动条同样有最小值、最大值和当前值等属性。

JSliderJProgressBar的主要区别

  • JSlider不是采用填充颜色的方式来表示该组件的当前值,而是采用滑块的位置来表示该组件的当前值
  • JSlider允许用户手动改变滑动条的当前值。
  • JSlider允许为滑动条指定刻度值,这系列的刻度值既可以是连续的数字,也可以是自定义的刻度值,甚至可以是图标。

使用JSlider创建滑动条的步骤

创建JSlider对象

使用JSlider的构造器创建一个JSlider对象,JSlider有多个重载的构造器,但这些构造器总共可以接收如下4个参数。

  • orientation:指定该滑动条的摆放方向,默认是水平摆放。可以接收SwingConstants.VERTICALSwingConstants.HORIZONTAL两个值
  • min:指定该滑动条的最小值,该属性值默认为0。
  • max:指定该滑动条的最大值,该属性值默认是为100。
  • value:指定该滑动条的当前值,该属性值默认是为50。
方法 描述
JSlider() Creates a horizontal slider with the range 0 to 100 and an initial value of 50.
JSlider(int orientation) Creates a slider using the specified orientation with the range 0 to 100 and an initial value of 50.
JSlider(int min, int max) Creates a horizontal slider using the specified min and max with an initial value equal to the average of the min plus max.
JSlider(int min, int max, int value) Creates a horizontal slider using the specified min, max and value.
JSlider(int orientation, int min, int max, int value) Creates a slider with the specified orientation and the specified minimum, maximum, and initial values.
JSlider(BoundedRangeModel brm) Creates a horizontal slider using the specified BoundedRangeModel.

设置滑动条的外观

调用JSlider的如下方法来设置滑动条的外观样式

方法 描述
void setExtent(int extent) 设置滑动条上的保留区,用户拖动滑块时不能超过保留区。例如,最大值为100的滑动条,如果设置保留区为20,则滑块最大只能拖动到80
void setInverted(boolean b) 设置是否需要反转滑动条,滑动条的滑轨上刻度值默认从小到大、从左到右排列。如果该方法设置为true,则排列方向会反转过来。
void setLabelTable(Dictionary labels) 为该滑动条指定刻度标签。该方法的参数是Dictionary类型,Dictionary是一个古老的、抽象集合类,其子类是Hashtable。传入的Hashtable集合对象的key-value对为{Integer value,java.Swing.JComponent label}格式,刻度标签可以是任何组件。
void setMajorTickSpacing(int n) 设置主刻度标记的间隔
void setMinorTickSpacing(int n) 设置次刻度标记的间隔。
void setPaintLabels(boolean b) 设置是否在滑块上绘制刻度标签。如果没有为该滑动条指定刻度标签,则默认绘制将刻度值的数值作为标签。
void setPaintTicks(boolean b) 设置是否在滑块上绘制刻度标记
void setPaintTrack(boolean b) 设置是否为滑块绘制滑轨。
void setSnapToTicks(boolean b) 设置滑块是否必须停在滑道的有刻度处。如果设置为true,则滑块只能停在有刻度处;如果用户没有将滑块拖到有刻度处,则系统自动将滑块定位到最近的刻度处

JSlider对象添加事件监听器

如果程序需要在用户拖动滑块时做岀相应处理,则应为该JSlider对象添加事件监听器。JSlider提供了addChangeListener方法来添加事件监听器,该监听器负责监听滑动值的变化

方法 描述
void addChangeListener(ChangeListener l) Adds a ChangeListener to the

添加到其他容器中

JSlider对象添加到其他容器中显示出来。

程序 创建滑动条

下面程序示范了如何使用JSlider来创建滑动条

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.Dictionary;
import java.util.Hashtable;

public class JSliderTest {
JFrame mainWin = new JFrame("滑动条示范");
Box sliderBox = new Box(BoxLayout.Y_AXIS);
JTextField showVal = new JTextField();
ChangeListener listener;

public void init() {
// 定义一个监听器,用于监听所有滑动条
listener = event -> {
// 取出滑动条的值,并在文本中显示出来
JSlider source = (JSlider) event.getSource();
showVal.setText("当前滑动条的值为:" + source.getValue());
};
// -----------添加一个普通滑动条-----------
JSlider slider = new JSlider();
addSlider(slider, "普通滑动条");
// -----------添加保留区为30的滑动条-----------
slider = new JSlider();
slider.setExtent(30);
addSlider(slider, "保留区为30");
// ---添加带主、次刻度的滑动条,并设置其最大值,最小值---
slider = new JSlider(30, 200);
// 设置绘制刻度
slider.setPaintTicks(true);
// 设置主、次刻度的间距
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "有刻度");
// -----------添加滑块必须停在刻度处滑动条-----------
slider = new JSlider();
// 设置滑块必须停在刻度处
slider.setSnapToTicks(true);
// 设置绘制刻度
slider.setPaintTicks(true);
// 设置主、次刻度的间距
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "滑块停在刻度处");
// -----------添加没有滑轨的滑动条-----------
slider = new JSlider();
// 设置绘制刻度
slider.setPaintTicks(true);
// 设置主、次刻度的间距
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
// 设置不绘制滑轨
slider.setPaintTrack(false);
addSlider(slider, "无滑轨");
// -----------添加方向反转的滑动条-----------
slider = new JSlider();
// 设置绘制刻度
slider.setPaintTicks(true);
// 设置主、次刻度的间距
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
// 设置方向反转
slider.setInverted(true);
addSlider(slider, "方向反转");
// --------添加绘制默认刻度标签的滑动条--------
slider = new JSlider();
// 设置绘制刻度
slider.setPaintTicks(true);
// 设置主、次刻度的间距
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
// 设置绘制刻度标签,默认绘制数值刻度标签
slider.setPaintLabels(true);
addSlider(slider, "数值刻度标签");
// ------添加绘制Label类型的刻度标签的滑动条------
slider = new JSlider();
// 设置绘制刻度
slider.setPaintTicks(true);
// 设置主、次刻度的间距
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
// 设置绘制刻度标签
slider.setPaintLabels(true);
Dictionary<Integer, Component> labelTable = new Hashtable<>();
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"));
// 指定刻度标签,标签是JLabel
slider.setLabelTable(labelTable);
addSlider(slider, "JLable标签");
// ------添加绘制Label类型的刻度标签的滑动条------
slider = new JSlider();
// 设置绘制刻度
slider.setPaintTicks(true);
// 设置主、次刻度的间距
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
// 设置绘制刻度标签
slider.setPaintLabels(true);
labelTable = new Hashtable<Integer, Component>();
labelTable.put(0, new JLabel(new ImageIcon("ico/0.GIF")));
labelTable.put(20, new JLabel(new ImageIcon("ico/2.GIF")));
labelTable.put(40, new JLabel(new ImageIcon("ico/4.GIF")));
labelTable.put(60, new JLabel(new ImageIcon("ico/6.GIF")));
labelTable.put(80, new JLabel(new ImageIcon("ico/8.GIF")));
// 指定刻度标签,标签是ImageIcon
slider.setLabelTable(labelTable);
addSlider(slider, "Icon标签");
mainWin.add(sliderBox, BorderLayout.CENTER);
mainWin.add(showVal, BorderLayout.SOUTH);
mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWin.pack();
mainWin.setVisible(true);
}

// 定义一个方法,用于将滑动条添加到容器中
public void addSlider(JSlider slider, String description) {
slider.addChangeListener(listener);
Box box = new Box(BoxLayout.X_AXIS);
box.add(new JLabel(description + ":"));
box.add(slider);
sliderBox.add(box);
}

public static void main(String[] args) {
new JSliderTest().init();
}
}

上面程序向窗口中添加了多个滑动条,程序通过粗体字代码来控制不同滑动条的不同外观。运行上面程序,会看到如图12.31所示的各种滑动条的效果。
这里有一张图片
JSlider也使用BoundedRangeModel作为保存其状态数据的Model对象,程序可以直接修改Model对象来改变滑动条的状态,但大部分时候程序无须使用该Model对象。JSlider也提供了addChangeListener方法来为滑动条添加监听器,无须像JProgressBar那样监听它所对应的Model对象。