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所示。