技术开发 频道

Swing 的新 Spinner 组件

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

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

  清单 3. JSpinner 完整示例

1 import javax.swing.*;
2 import javax.swing.event.*;
3 import java.text.*;
4 import java.awt.*;
5 import java.util.*;
6 public class Spinner {
7   public static void main (String args[]) throws Exception {
8     JFrame frame = new JFrame("Spinner");
9     frame.setDefaultCloseOperation(3);
10     String[] months = new DateFormatSymbols().getMonths();
11     SpinnerModel model = new SpinnerListModel(months);
12     JSpinner spinner = new JSpinner(model);
13     frame.getContentPane().add(spinner, BorderLayout.NORTH);
14     SpinnerDateModel model2 = new SpinnerDateModel();
15     model2.setCalendarField(Calendar.WEEK_OF_MONTH);
16     JSpinner spinner2 = new JSpinner(model2);
17     JSpinner.DateEditor editor2 = new JSpinner.DateEditor(
18       spinner2, "MMMMM dd, yyyy");
19     spinner2.setEditor(editor2);
20     frame.getContentPane().add(spinner2, BorderLayout.SOUTH);
21     SpinnerNumberModel model3 = new SpinnerNumberModel(50, 0, 100, 5);
22     JSpinner spinner3 = new JSpinner(model3);
23     frame.getContentPane().add(spinner3, BorderLayout.CENTER);
24     ChangeListener listener = new ChangeListener() {
25       public void stateChanged(ChangeEvent e) {
26         SpinnerModel source = (SpinnerModel)e.getSource();
27         System.out.println("The value is: " + source.getValue());
28       }
29     };
30     model.addChangeListener(listener);
31     model2.addChangeListener(listener);
32     model3.addChangeListener(listener);
33     frame.pack();
34     frame.show();
35   }
36 }
37
0
相关文章