Java SDK beta 的最新发行版向 JFC/Swing 组件集添加了两个强大的新组件其中一个是 JSpinner 它使用户能够方便地选择日期数字或拾取列表中的选项(另一个是 JFormattedTextField 用于支持格式化的输入) 开始启动 JSpinner 使您可创建一个排序的值列表该表在选择框中每次显示一个选项如图 所示用户通过点击上移和下移箭头进行选择 图 JSpinner 示例
用户使用组件或键盘上的上移和下移箭头进行选择他们也可输入自己的选择然而与 JComboBox 不同 JSpinner 不提供下拉列表选择所以各个选择以及它们的顺序应有一定的意义 要使用类可简单地创建一个供选择的元素集合(在 List 或数组中)从列表中创建一个 SpinnerModel 并为模型创建一个 JSpinner 清单 简单的 JSpinner 用法 根据您所用的输入类型有以下几个可用于创建组件数据模型的帮助类 SpinnerDateModel 用于接受日期输入该类支持通过将 Calendar 类中的常数设置为不同的值来更改日期;例如 CalendarWEEK_OF_MONTH 每次将日期更改一周 SpinnerListModel 用于接受来自值列表的输入 SpinnerNumberModel 用于接受已设定好步长的一定范围内的数字( int 或 double )的输入 每个 SpinnerModel 执行取决于用于输入值的编辑器此编辑器必须是一个 JComponent ;系统定义的编辑器子类 JSpinnerDefaultEditor 其中一个可用于每个模型 JSpinnerDateEditor 用于 SpinnerDateModel 允许您定制输入日期格式 JSpinnerListEditor 用于 SpinnerListModel 支持 typeahead 来对值进行定位 JSpinnerNumberEditor 用于 SpinnerNumberModel 允许您定制十进制格式的模式 所有这些类(及更多类)之间的关系如图 所示 图 JSpinner UML 关系示意图
String[] months = new DateFormatSymbols()getMonths(); SpinnerModel model = new SpinnerListModel(months); JSpinner spinner = new JSpinner(model);
JSpinner 组件象其它 Swing 组件一样工作如果您有兴趣查出用户更改选择的时间请连一个侦听器对于 JSpinner 侦听器是一个 ChangeListener 您可直接将其连到 JSpinner 或其 SpinnerModel 上虽然您可将侦听器连到两者中的任意一个当值发生更改时 ChangeEvent 的源总是 SpinnerModel 清单 JSpinner 事件侦听 ChangeListener listener = new ChangeListener() { public void stateChanged(ChangeEvent e) { SpinnerModel source = (SpinnerModel)egetSource(); Systemoutprintln(The value is: + sourcegetValue()); } }; modeladdChangeListener(listener);
让我们来看一下使用全部三种不同的 spinner 模型的示例(清单 )列表模型使用从 DateFormatSymbols 类取出的月份名称集日期模型示例更改编辑器的输入格式(beta 发行版中好象存在一处错误当编辑器更改时不重新格式化字段)当使用该字段旁边的箭头时每次也可将日期移动一周数字模型示例让用户选取从 到 之间的一个数字当使用箭头时每次跳 个数请注意用户可输入任意数字而并不仅限于 的倍数 对于所有组件来说当每个 spinner 值确实发生更改时所连的侦听器将显示同一改变如果使用光标键更改月日或年您会注意到直到按下回车键这些值才发生更改 清单 JSpinner 完整示例 import javaxswing*; import javaxswingevent*; import javatext*; import javaawt*; import javautil*; public class Spinner { public static void main (String args[]) throws Exception { JFrame frame = new JFrame(Spinner); framesetDefaultCloseOperation(); String[] months = new DateFormatSymbols()getMonths(); SpinnerModel model = new SpinnerListModel(months); JSpinner spinner = new JSpinner(model); framegetContentPane()add(spinner BorderLayoutNORTH); SpinnerDateModel model = new SpinnerDateModel(); modelsetCalendarField(CalendarWEEK_OF_MONTH); JSpinner spinner = new JSpinner(model); JSpinnerDateEditor editor = new JSpinnerDateEditor( spinner MMMMM dd yyyy); spinnersetEditor(editor); framegetContentPane()add(spinner BorderLayoutSOUTH); SpinnerNumberModel model = new SpinnerNumberModel( ); JSpinner spinner = new JSpinner(model); framegetContentPane()add(spinner BorderLayoutCENTER); ChangeListener listener = new ChangeListener() { public void stateChanged(ChangeEvent e) { SpinnerModel source = (SpinnerModel)egetSource(); Systemoutprintln(The value is: + sourcegetValue()); } }; modeladdChangeListener(listener); modeladdChangeListener(listener); modeladdChangeListener(listener); framepack(); frameshow(); } } |