如何使用滑块

原文: https://docs.oracle.com/javase/tutorial/uiswing/components/slider.html

JSlider 组件旨在让用户轻松输入由最小值和最大值限定的数值。如果空间有限,微调器可能是滑块的替代品。

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

A snapshot of SliderDemo, which uses a slider


Try this:

  1. 单击“启动”按钮以使用 Java™Web Start下载 JDK 7 或更高版本)运行 SliderDemo。或者,要自己编译并运行示例,请参考示例索引Launches the SliderDemo application

  2. 使用滑块调整动画速度。

  3. 将滑块推到 0 可停止动画。

下面是 SliderDemo.java 文件中的代码,该文件在上一个示例中创建了滑块。

  1. static final int FPS_MIN = 0;
  2. static final int FPS_MAX = 30;
  3. static final int FPS_INIT = 15; //initial frames per second
  4. . . .
  5. JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL,
  6. FPS_MIN, FPS_MAX, FPS_INIT);
  7. framesPerSecond.addChangeListener(this);
  8. //Turn on labels at major tick marks.
  9. framesPerSecond.setMajorTickSpacing(10);
  10. framesPerSecond.setMinorTickSpacing(1);
  11. framesPerSecond.setPaintTicks(true);
  12. framesPerSecond.setPaintLabels(true);

默认情况下,主刻度线和次刻度线的间距为零。要查看刻度线,必须将主刻度线或次刻度线(或两者)的间距显式设置为非零值,并调用setPaintTicks(true)方法。但是,您还需要标记符号。要在主要刻度标记位置显示标准数字标签,请设置主刻度线间距,然后调用setPaintLabels(true)方法。示例程序以这种方式为其滑块提供标签。但您不仅限于使用这些标签。 在滑块上自定义标签向您展示如何自定义滑块标签。此外,滑块功能允许您为JSlider组件设置字体。

  1. Font font = new Font("Serif", Font.ITALIC, 15);
  2. framesPerSecond.setFont(font);

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

  1. public void stateChanged(ChangeEvent e) {
  2. JSlider source = (JSlider)e.getSource();
  3. if (!source.getValueIsAdjusting()) {
  4. int fps = (int)source.getValue();
  5. if (fps == 0) {
  6. if (!frozen) stopAnimation();
  7. } else {
  8. delay = 1000 / fps;
  9. timer.setDelay(delay);
  10. timer.setInitialDelay(delay * 10);
  11. if (frozen) startAnimation();
  12. }
  13. }
  14. }

请注意,仅当getValueIsAdjusting方法返回false时,stateChanged方法才会更改动画速度。当用户移动滑块旋钮时,会触发许多更改事件。该程序仅对用户操作的最终结果感兴趣。

下面的演示是 SliderDemo 的修改版本,它使用带有自定义标签的滑块:

A snapshot of SliderDemo2, which uses a slider with custom labels

该程序的源代码可在 SliderDemo2.java 中找到。单击“启动”按钮以使用 Java™Web Start下载 JDK 7 或更高版本)运行 SliderDemo2。或者,要自己编译并运行示例,请参考示例索引

Launches the SliderDemo2 application

以下代码创建滑块并自定义其标签:

  1. //Create the slider
  2. JSlider framesPerSecond = new JSlider(JSlider.VERTICAL,
  3. FPS_MIN, FPS_MAX, FPS_INIT);
  4. framesPerSecond.addChangeListener(this);
  5. framesPerSecond.setMajorTickSpacing(10);
  6. framesPerSecond.setPaintTicks(true);
  7. //Create the label table
  8. Hashtable labelTable = new Hashtable();
  9. labelTable.put( new Integer( 0 ), new JLabel("Stop") );
  10. labelTable.put( new Integer( FPS_MAX/10 ), new JLabel("Slow") );
  11. labelTable.put( new Integer( FPS_MAX ), new JLabel("Fast") );
  12. framesPerSecond.setLabelTable( labelTable );
  13. framesPerSecond.setPaintLabels(true);

使用setLabelTable方法指定的哈希表中的每个键值对都给出一个标签的位置和值。哈希表键必须是Integer类型,并且必须具有滑块范围内的值才能放置标签。与每个键关联的哈希表值必须是Component对象。此演示仅使用带有文本的JLabel实例。一个有趣的修改是使用带有图标或按钮的JLabel实例将旋钮移动到标签的位置。

使用JSlider类的createStandardLabels方法创建一组以特定间隔定位的数字标签。您还可以修改createStandardLabels方法返回的表以进行自定义。

下表列出了常用的JSlider构造器和方法。有关常用继承方法的表,请参见 JComponent 类

使用滑块的 API 分为以下几类:

构造器 目的
JSlider() 创建一个水平滑块,范围为 0 到 100,初始值为 50。
JSlider(int min,int max)

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

方法 目的
void setValue(int)

int getValue() | 设置或获取滑块的当前值。 set 方法还可以定位滑块的旋钮。 | | 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) Hashtable createStandardLabels(int,int) | 创建一组标准数字标签。第一个int参数指定增量,第二个int参数指定起始点。如果未指定,则将起点设置为滑块的最小数量。 | | setFont(java.awt.Font) | 设置滑块标签的字体。 |

方法 目的
void addChangeListener(ChangeListener) 使用滑块注册更改监听器。
boolean getValueIsAdjusting() 确定用于移动滑块旋钮的用户手势是否完整。
类,接口或方法 目的
BoundedRangeModel 滑块数据模型所需的接口。
DefaultBoundedRangeModel BoundedRangeModel接口的实现。
void setModel()

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

此表显示了使用JSlider的示例以及描述这些示例的示例。

在哪里描述 笔记
SliderDemo 这个部分 显示带有主要刻度标记的滑块。
SliderDemo2 这个部分 显示带有自定义标签的垂直滑块。
Converter 使用型号如何使用面板 一种测量转换应用程序,具有两个共享数据并具有自定义BoundedRangeModel的滑块。

如果您使用 JavaFX 进行编程,请参阅 Slider