如何使用滑块
JSlider组件旨在让用户轻松 Importing 以最小值和最大值为边界的数值。如果空间有限,则可以使用spinner代替滑块。
下图显示了使用滑块控制动画速度的应用程序:
Try this:
-
单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 SliderDemo。另外,要自己编译和运行示例,请查阅example index。
-
使用滑块调整动画速度。
-
将滑块推到 0 以停止动画。
以下是在上一个示例中创建滑块的SliderDemo.java文件中的代码。
static final int FPS_MIN = 0;
static final int FPS_MAX = 30;
static final int FPS_INIT = 15; //initial frames per second
. . .
JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL,
FPS_MIN, FPS_MAX, FPS_INIT);
framesPerSecond.addChangeListener(this);
//Turn on labels at major tick marks.
framesPerSecond.setMajorTickSpacing(10);
framesPerSecond.setMinorTickSpacing(1);
framesPerSecond.setPaintTicks(true);
framesPerSecond.setPaintLabels(true);
默认情况下,主要和次要刻度线的间距为零。要查看刻度线,必须将主要或次要刻度线(或两者)的间距显式设置为非零值,然后调用setPaintTicks(true)
方法。但是,您还需要刻度标记。若要在主要刻度线位置显示标准数字标签,请设置主要刻度线间距,然后调用setPaintLabels(true)
方法。示例程序以这种方式为其滑块提供标签。但是,您不必仅使用这些标签。 自定义滑块上的标签向您展示如何自定义滑块标签。另外,滑块功能允许您设置JSlider
组件的字体。
Font font = new Font("Serif", Font.ITALIC, 15);
framesPerSecond.setFont(font);
移动滑块的旋钮时,将调用滑块ChangeListener
的stateChanged
方法。有关变更侦听器的信息,请参阅如何编写变更监听器。以下是对滑块值更改做出反应的更改侦听器代码:
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
int fps = (int)source.getValue();
if (fps == 0) {
if (!frozen) stopAnimation();
} else {
delay = 1000 / fps;
timer.setDelay(delay);
timer.setInitialDelay(delay * 10);
if (frozen) startAnimation();
}
}
}
请注意,只有getValueIsAdjusting
方法返回false
时,stateChanged
方法才会更改动画速度。用户移动滑块时会触发许多更改事件。该程序仅对用户操作的final结果感兴趣。
自定义滑块上的标签
下面的演示是 SliderDemo 的修改版本,该版本使用带有自定义标签的滑块:
该程序的源可以在SliderDemo2.java中找到。单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 SliderDemo2.另外,要自己编译和运行示例,请参考example index。
以下代码创建滑块并自定义其标签:
//Create the slider
JSlider framesPerSecond = new JSlider(JSlider.VERTICAL,
FPS_MIN, FPS_MAX, FPS_INIT);
framesPerSecond.addChangeListener(this);
framesPerSecond.setMajorTickSpacing(10);
framesPerSecond.setPaintTicks(true);
//Create the label table
Hashtable labelTable = new Hashtable();
labelTable.put( new Integer( 0 ), new JLabel("Stop") );
labelTable.put( new Integer( FPS_MAX/10 ), new JLabel("Slow") );
labelTable.put( new Integer( FPS_MAX ), new JLabel("Fast") );
framesPerSecond.setLabelTable( labelTable );
framesPerSecond.setPaintLabels(true);
用setLabelTable
方法指定的哈希表中的每个键值对都给出一个标签的位置和值。哈希表键必须为Integer
类型,并且其值必须在放置标签的滑块范围内。与每个键关联的哈希表值必须是Component
对象。该演示使用JLabel
个实例仅包含文本。一个有趣的修改是使用带有图标或按钮的JLabel
实例,以将旋钮移至标签的位置。
使用JSlider
类的createStandardLabels
方法来创建一组以特定间隔放置的数字标签。您也可以修改createStandardLabels
方法返回的表以对其进行自定义。
Slider API
下表列出了常用的JSlider
构造函数和方法。有关常用继承方法的表,请参见JComponent 类。
使用滑块的 API 分为以下几类:
Constructor | Purpose |
---|---|
JSlider() | 创建一个水平滑块,范围为 0 到 100,初始值为 50. |
JSlider(int 最小值,int 最大值) | |
JSlider(int 最小值,int 最大值,int 值) | 使用指定的最小值和最大值创建水平滑块。第三个int 参数(如果存在)指定滑块的初始值。 |
JSlider(int orientation) JSlider(int 方向,int 最小值,int 最大值,int 值) | 创建具有指定方向的滑块,该滑块必须为JSlider.HORIZONTAL 或JSlider.VERTICAL 。最后三个int 参数(如果存在)分别指定滑块的最小值,最大值和初始值。 |
JSlider(BoundedRangeModel) | 使用指定的模型创建水平滑块,该水平滑块 管理 滑块的最小值,最大值和当前值及其关系。 |
Method | Purpose |
---|---|
void setValue(int) | |
int getValue() | 设置或获取滑块的当前值。设置方法还可以定位滑块的旋钮。 |
void setOrientation(int) int getOrientation() | 设置或获取滑块的方向。可能的值为JSlider.HORIZONTAL 或JSlider.VERTICAL 。 |
void setInverted(boolean) boolean getInverted() | 设置或获取最大值显示在水平滑块的左侧还是垂直滑块的底部,从而反转滑块的范围。 |
void setMinimum(int) int getMinimum() void setMaximum(int) int getMaximum() | 设置或获取滑块的最小值或最大值。这些方法一起设置或获取滑块的范围。 |
void setMajorTickSpacing(int) int getMajorTickSpacing() void setMinorTickSpacing(int) int getMinorTickSpacing() | 设置或获取主要和次要刻度之间的范围。您必须致电setPaintTicks(true) 才能显示刻度线。 |
void setPaintTicks(boolean) boolean getPaintTicks() | 设置或获取是否在滑块上绘制刻度线。 |
void setPaintLabels(boolean) boolean getPaintLabels() | 设置或获取是否在滑块上绘制标签。您可以为自定义标签提供setLabelTable ,也可以通过将主刻度间距设置为非零值来获取自动标签。 |
void setLabelTable(Dictionary) Dictionary getLabelTable() | 设置或获取滑块的标签。您必须致电setPaintLabels(true) 才能显示标签。 |
Hashtable createStandardLabels(int) 哈希表 createStandardLabels(int,int) | 创建一组标准的数字标签。第一个int 参数指定增量,第二个int 参数指定起点。如果未指定,则起点设置为滑块的最小数目。 |
setFont(java.awt.Font) | 设置滑块标签的字体。 |
Method | Purpose |
---|---|
void addChangeListener(ChangeListener) | 向滑块注册一个更改侦听器。 |
boolean getValueIsAdjusting() | 确定用户移动滑块的手势是否完成。 |
类,interface或方法 | Purpose |
---|---|
BoundedRangeModel | 滑块的数据模型所需的interface。 |
DefaultBoundedRangeModel | BoundedRangeModel interface的实现。 |
void setModel() | |
getModel() (在 JSlider 中) | 设置或获取滑块使用的数据模型。您还可以通过使用带有BoundedRangeModel 类型的单个参数的构造函数来设置模型。 |
使用滑块的示例
下表显示了使用JSlider
的示例,并在其中描述了这些示例。
Example | Where Described | Notes |
---|---|---|
SliderDemo | This section | 在主要刻度线处显示带有标签的滑块。 |
SliderDemo2 | This section | 显示带有自定义标签的垂直滑块。 |
Converter | Using Models, 如何使用面板 | 一个测量转换应用程序,具有两个共享数据并具有自定义BoundedRangeModel 的滑块。 |
如果您使用 JavaFX 编程,请参见Slider。