12.8 使用JSpinner和SpinnerModel刨建微调控制器
12.8 使用JSpinner和SpinnerModel刨建微调控制器
JSpinner组件是一个带有两个小箭头的文本框,这个文本框只能接收满足要求的数据,用户既可以通过两个小箭头调整该微调控制器的值,也可以直接在文本框内输入内容作为该微调控制器的值。当用户在该文本框内输入时,如果输入的内容不满足要求,系统将会拒绝用户输入。典型的JSpinner组件如图12.32所示。
JSpinner组件常常需要和SpinnerModel结合使用,其中JSpinner组件控制该组件的外观表现,而SpinnerModel则控制该组件内部的状态数据。
JSpinner组件的值
JSpinner组件的值可以是数值、日期和List中的值,Swing为这三种类型的值提供了SpinnerNumberModel、SpinnerDateModel和SpinnerListModel三个SpinnerModel实现类;
自定义SpinnerModel实现类
除此之外,JSpinner组件的值还可以是任意序列,只要这个序列可以通过previous()方法和next()方法获取值即可。在这种情况下,用户必须自行提供SpinnerModel实现类。
使用JSpinner组件非常简单,JSpinner提供了如下两个构造器。
| 构造器 | 描述 |
|---|---|
JSpinner() |
创建一个默认的微调控制器。创建的默认微调控制器只接收整数值,初始值是0,最大值和最小值没有任何限制制。每单击向下箭头或者向上箭头一次,该组件里的值分别减1或加1。 |
JSpinner(SpinnerModel model) |
使用指定的SpinnerModel来创建微调控制器。 |
Swing提供的三个SpinnerModel的功能
使用JSpinner关键在于使用它对应的三个SpinnerModel,下面依次介绍这三个SpinnerModel:
SpinnerNumberModel:这是最简单的SpinnerModel,创建该SpinnerModel时可以指定4个参数:最大值、最小值、初始值、步长,其中步长控制单击上、下箭头时相邻两个值之间的差。这4个参数既可以是整数,也可以是浮点数。SpinnerDateModel:创建该SpinnerModel时可以指定4个参数:起始时间、结束时间、初始时间和时间差,其中时间差控制单击上、下箭头时相邻两个时间之间的差值。SpinnerListModel:创建该SpinnerModel只需要传入一个List或者一个数组作为序列值即可。该List的集合元素和数组元素可以是任意类型的对象,但由于JSpinner组件的文本框只能显示字符串,所以JSpinner显示每个对象的toString()方法的返回值。
从图12.32中可以看出,JSpinner创建的微调控制器和ComboBox有点像(由Swing的JComboBox提供,ComboBox既允许通过下拉列表框进行选择,也允许直接输入)
JSpinner和JComboBox的区别
Combobox可以产生一个下拉列表框供用户选择,而JSpinner组件只能通过上、下箭头逐项选择。
使用ComboBox通常必须明确指定下拉列表框中毎一项的值,但使用JSpinner则只需给定一个范围,并指定步长即可;当然,使用JSpinner也可以明确给出每项的值(就是对应使用SpinnerListModel)
为了控制JSpinner中值的显示格式,JSpinner还提供了一个setEditor()方法。Swing提供了如下3个特殊的Editor来控制值的显示格式:
JSpinner.DateEditor:控制JSpinner中日期值的显示格式。JSpinner.ListEditor:控制JSpinner中List项的显示格式JSpinner.NumberEditor:控制JSpinner中数值的显示格式
程序 使用JSpinner
下面程序示范了几种使用JSpinner的情形
1 | import java.awt.*; |
上面程序创建了6个JSpinner对象,并将它们添加到窗口中显示出来
- 第一个
JSpinner组件是一个默认的微调控制器,其初始值是0,步长是1,只能接收整数值。 - 第二个
JSpinner通过SpinnerNumberModel来创建,指定了JSpinner的最小值为-1.1、最大值为4.3、初始值为34、步长为0.1,所以用户单击该微调控制器的上、下箭头时,微调控制器的值之间的差值是0.1,并只能处于-1.1~4.3之间 - 第三个
JSpinner通过SpinnerListModel来创建的,创建SpinnerListModel对象时指定字符串数组作为多个序列值,所以当用户单击该微调控制器的上、下箭头时,微调控制器的值总是在该字符串数组之间选择。 - 第四个
JSpinner也是通过SpinnerListmodel来创建的,虽然传给SpinnerListModel对象的构造参数是集合元素为ImageIcon的List对象,但JSpinner只能显示字符串内容,所以它会把每个Imagelcon对象的toString方法返回值当成微调控制器的多个序列值。 - 第五个
JSpinner通过SpinnerDateModel来创建,而且指定了最小时间、最大时间和初始时间,所以用户单击该微调控制器的上、下箭头时,微调控制器里的时间只能处于指定时间范围之间。这里需要注意的是,SpinnerDateModel的第4个参数没有太大的作用,它不能控制两个相邻时间之间的差。当用户在JSpinner组件内选中该时间的指定时间域时,例如年份,则两个相邻时间的时间差就是1年。 - 第六个
JSpinner使用SPinner.DateEditor来控制时间微调控制器里日期、时间的显示格式,创建JSpinner.DateEditor对象时需要传入一个日期时间格式字符串(dateFormatPattern),该参数用于控制日期、时间的显示格式,关于这个格式字符串的定义方式可以参考SimpleDateFormat类的介绍。本例程序中使用”公元yyyy年MM月dd日HH时”作为格式字符串。
运行上面程序,会看到如图12.33所示的窗口。

程序中还提供了一个“确定”按钮,当单击该按钮时,系统会把每个微调控制器的值通过对应的JLabel标签显示出来,如图12.33所示。