Java SDK beta 的最新發行版向 JFC/Swing 組件集添加了兩個強大的新組件其中一個是 JSpinner 它使用戶能夠方便地選擇日期數字或拾取列表中的選項(另一個是 JFormattedTextField 用於支持格式化的輸入)
開始啟動
JSpinner 使您可創建一個排序的值列表該表在選擇框中每次顯示一個選項如圖 所示用戶通過點擊上移和下移箭頭進行選擇
圖 JSpinner 示例
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112319181777.jpg)
用戶使用組件或鍵盤上的上移和下移箭頭進行選擇他們也可輸入自己的選擇然而與 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 關系示意圖
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112319181763.jpg)
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();
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26611.html