IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Java technology  >

Merlin 的魔力: Swing 的新 Spinner 组件

允许用户从带有 JSpinner 的拾取列表中快速选择日期、数字和选项

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

John Zukowski (jaz@zukowski.net), 总裁

2001 年 7 月 01 日

欢迎阅读 Merlin 的魔力,一个半月刊的短篇系列,目的是为使用 Java 2 标准版,版本 1.4 编程提供帮助。在随后的几个月中,作者 John Zukowski 将提供一些技巧和诀窍来利用此发行版中许多新功能。在这个部分中,John 描述了 Swing 的新 JSpinner 组件,它允许您从拾取列表中选择日期、数字和选项。

Java 2 SDK,1.4 beta 的最新发行版向 JFC/Swing 组件集添加了两个强大的新组件。其中一个是 JSpinner ,它使用户能够方便地选择日期、数字或拾取列表中的选项。(另一个是 JFormattedTextField ,用于支持格式化的输入。)

开始启动

JSpinner 使您可创建一个排序的值列表,该表在选择框中每次显示一个选项,如图 1 所示。用户通过点击上移和下移箭头进行选择。


图 1. JSpinner 示例
图 1. JSpinner 示例

用户使用组件或键盘上的上移和下移箭头进行选择。他们也可输入自己的选择。然而,与 JComboBox 不同, JSpinner 不提供下拉列表选择,所以各个选择以及它们的顺序应有一定的意义。

要使用类,可简单地创建一个供选择的元素集合(在 List 或数组中),从列表中创建一个 SpinnerModel ,并为模型创建一个 JSpinner

清单 1. 简单的 JSpinner 用法

 String[] months = new DateFormatSymbols().getMonths();
  SpinnerModel model = new SpinnerListModel(months);
  JSpinner spinner = new JSpinner(model);

根据您所用的输入类型,有以下几个可用于创建组件数据模型的帮助类:

  • SpinnerDateModel :用于接受日期输入。该类支持通过将 Calendar 类中的常数设置为不同的值来更改日期;例如, Calendar.WEEK_OF_MONTH 每次将日期更改一周。

  • SpinnerListModel :用于接受来自值列表的输入。

  • SpinnerNumberModel :用于接受已设定好步长的一定范围内的数字( intdouble )的输入。

每个 SpinnerModel 执行取决于用于输入值的编辑器。此编辑器必须是一个 JComponent ;系统定义的编辑器子类 JSpinner.DefaultEditor 。其中一个可用于每个模型:

  • JSpinner.DateEditor :用于 SpinnerDateModel 。允许您定制输入日期格式。

  • JSpinner.ListEditor :用于 SpinnerListModel 。支持 type-ahead 来对值进行定位。

  • JSpinner.NumberEditor :用于 SpinnerNumberModel 。允许您定制十进制格式的模式。

所有这些类(及更多类)之间的关系如图 2 所示。


图 2. JSpinner UML 关系示意图
图 2. JSpinner UML 关系示意图




回页首


事件处理

JSpinner 组件象其它 Swing 组件一样工作。如果您有兴趣查出用户更改选择的时间,请连一个侦听器。对于 JSpinner ,侦听器是一个 ChangeListener ,您可直接将其连到 JSpinner 或其 SpinnerModel 上。虽然您可将侦听器连到两者中的任意一个,当值发生更改时, ChangeEvent 的源总是 SpinnerModel

清单 2. JSpinner 事件侦听

 ChangeListener listener = new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
      SpinnerModel source = (SpinnerModel)e.getSource();
      System.out.println("The value is: " + source.getValue());
    }
  };
  model.addChangeListener(listener);







回页首


一个完整的示例

让我们来看一下使用全部三种不同的 spinner 模型的示例(清单 3)。列表模型使用从 DateFormatSymbols 类取出的月份名称集。日期模型示例更改编辑器的输入格式。(beta 发行版中好象存在一处错误,当编辑器更改时不重新格式化字段。)当使用该字段旁边的箭头时,每次也可将日期移动一周。数字模型示例让用户选取从 0 到 100 之间的一个数字,当使用箭头时每次跳 5 个数。请注意:用户可输入任意数字,而并不仅限于 5 的倍数。

对于所有组件来说,当每个 spinner 值确实发生更改时,所连的侦听器将显示同一改变。如果使用光标键更改月、日或年,您会注意到直到按下回车键这些值才发生更改。

清单 3. JSpinner 完整示例

import javax.swing.*;
import javax.swing.event.*;
import java.text.*;
import java.awt.*;
import java.util.*;
public class Spinner {
  public static void main (String args[]) throws Exception {
    JFrame frame = new JFrame("Spinner");
    frame.setDefaultCloseOperation(3);
    String[] months = new DateFormatSymbols().getMonths();
    SpinnerModel model = new SpinnerListModel(months);
    JSpinner spinner = new JSpinner(model);
    frame.getContentPane().add(spinner, BorderLayout.NORTH);
    SpinnerDateModel model2 = new SpinnerDateModel();
    model2.setCalendarField(Calendar.WEEK_OF_MONTH);
    JSpinner spinner2 = new JSpinner(model2);
    JSpinner.DateEditor editor2 = new JSpinner.DateEditor(
      spinner2, "MMMMM dd, yyyy");
    spinner2.setEditor(editor2);
    frame.getContentPane().add(spinner2, BorderLayout.SOUTH);
    SpinnerNumberModel model3 = new SpinnerNumberModel(50, 0, 100, 5);
    JSpinner spinner3 = new JSpinner(model3);
    frame.getContentPane().add(spinner3, BorderLayout.CENTER);
    ChangeListener listener = new ChangeListener() {
      public void stateChanged(ChangeEvent e) {
        SpinnerModel source = (SpinnerModel)e.getSource();
        System.out.println("The value is: " + source.getValue());
      }
    };
    model.addChangeListener(listener);
    model2.addChangeListener(listener);
    model3.addChangeListener(listener);
    frame.pack();
    frame.show();
  }
}



参考资料



关于作者

Author photo

John Zukowski 为 JZ Ventures, Inc. 做战略性 Java 咨询。他最近的著作有 Apress 的 Java Collections 和 Definitive Guide to Swing for Java 2 (第 2 版)。可通过 jaz@zukowski.net 与 John 联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款