如何使用滑块

JSlider组件旨在让用户轻松 Importing 以最小值和最大值为边界的数值。如果空间有限,则可以使用spinner代替滑块。

下图显示了使用滑块控制动画速度的应用程序:

SliderDemo 的快照,它使用滑块

Try this:

以下是在上一个示例中创建滑块的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);

移动滑块的旋钮时,将调用滑块ChangeListenerstateChanged方法。有关变更侦听器的信息,请参阅如何编写变更监听器。以下是对滑块值更改做出反应的更改侦听器代码:

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 的快照,它使用带有自定义标签的滑块

该程序的源可以在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 分为以下几类:

创建滑块

ConstructorPurpose
JSlider()创建一个水平滑块,范围为 0 到 100,初始值为 50.
JSlider(int 最小值,int 最大值)

JSlider(int 最小值,int 最大值,int 值)
使用指定的最小值和最大值创建水平滑块。第三个int参数(如果存在)指定滑块的初始值。
JSlider(int orientation)
JSlider(int 方向,int 最小值,int 最大值,int 值)
创建具有指定方向的滑块,该滑块必须为JSlider.HORIZONTALJSlider.VERTICAL。最后三个int参数(如果存在)分别指定滑块的最小值,最大值和初始值。
JSlider(BoundedRangeModel)使用指定的模型创建水平滑块,该水平滑块 管理 滑块的最小值,最大值和当前值及其关系。

微调滑块的外观

MethodPurpose
void setValue(int)

int getValue()
设置或获取滑块的当前值。设置方法还可以定位滑块的旋钮。
void setOrientation(int)
int getOrientation()
设置或获取滑块的方向。可能的值为JSlider.HORIZONTALJSlider.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)设置滑块标签的字体。

观看滑块操作

MethodPurpose
void addChangeListener(ChangeListener)向滑块注册一个更改侦听器。
boolean getValueIsAdjusting()确定用户移动滑块的手势是否完成。

直接使用数据模型

类,interface或方法Purpose
BoundedRangeModel滑块的数据模型所需的interface。
DefaultBoundedRangeModelBoundedRangeModelinterface的实现。
void setModel()

getModel()
(在JSlider中)
设置或获取滑块使用的数据模型。您还可以通过使用带有BoundedRangeModel类型的单个参数的构造函数来设置模型。

使用滑块的示例

下表显示了使用JSlider的示例,并在其中描述了这些示例。

ExampleWhere DescribedNotes
SliderDemoThis section在主要刻度线处显示带有标签的滑块。
SliderDemo2This section显示带有自定义标签的垂直滑块。
ConverterUsing Models, 如何使用面板一个测量转换应用程序,具有两个共享数据并具有自定义BoundedRangeModel的滑块。

如果您使用 JavaFX 编程,请参见Slider