熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Swing指南:Spinner Model Controls(組圖)

2013-11-23 18:58:40  來源: Java核心技術 

  JSpinner工作起來好像是在JList或者JComboBox中間放了一個JFormattedTextField在JList或者JComboBox中用戶可以提前設定好要輸入的值JSpinner也提供這樣的一種機制這個控件的另一個部分是JFormattedTextField如何顯示和輸入不由那些小的控制格控制比如JList相反可以通過JFormattedTextField來輸入或通過邊上的兩個小箭頭來浏覽不同的可用的值
  
  圖示顯示了Spinner伴隨不同的輸入類型是什麼樣子圖示的頂端的JSpinner是一個用來顯示法語星期通過SpinnerListModel中間的是一個通過SpinnerDateModel顯示日期的JSpinner底部的是使用SpinnerNumberModel的JSpinner每一個都是通過各自神秘的方式在本文的後面我們將要學習
  
 
  圖示JSpinner實例

  
  要創建和操縱JSpinner許多類都將被調用最重要的是JSpinner自己最重要的兩個准素集包括SpinnerModel接口包括可選擇的集合中的選項還有JSpinnerDefaultEditor的實現用來捕獲所有選擇慶幸的是許多其它調用的類都是在後台工作的比如一旦你給SpinnerNumberModel提供了數字的范圍並且用這個類來協助Spinner你的工作實際上是完成了
  
  創建JSpinner控件
  
  JSpinner類包括兩個構造函數來初始化控件
  
  public JSpinner()
  JSpinner spinner = new JSpinner();
  public JSpinner(SpinnerModel model)
  SpinnerModel model = new SpinnerListModel(args);
  JSpinner spinner = new JSpinner(model);
  
  開始的時候可以沒有數據模型後面可以使用它來跟蹤JSpinner的方法另一個方法在創建這個控件的時候使用完整的模型實現SpinnerModel接口它裡面有三個具體的子類可以使用SpinnerDateModelSpinnerListModel和SpinnerNumberModel伴隨著他們的抽象父類AbstractSpinnerModel如果不指名模型那麼SpinnerNumberModel將默認使用而顯示和編輯的控件是JFormattedTextField編輯的基本功能是通過一系列JSpinner的內部類實現的DateEditorListEditor和NumberFormat還有父類中DefaultEditor的支持
  
  JSpinner屬性
  
  除了創建JSpinner對象之外你還可以通過表一中的九個屬性中的一個來進行配置
  
  
Table JSpinner 屬性
   

  value屬性中的值允許你更改當前控件的設置nextValue和perviousValue可以使你以不同的方向察看模型中的入口
  
  使用ChangeListener來監聽JSpinner events
  
  JSpinner直接支持一種事件監聽changeListener在別的地方當commitEdit()方法被調用這個事件將被觸發告訴你spinner的值發生改變為了證明列表聯系到一個自定義的ChangeListener與圖示的程序相關聯
  
  列表 JSpinner with ChangeListener
  import javaawt*;
  import javaxswing*;
  import javaxswingevent*;
  import javatext*;
  import javautil*;
  public class SpinnerSample {
  public static void main (String args[]) {
  Runnable runner = new Runnable() {
  public void run() {
  JFrame frame = new JFrame(JSpinner Sample);
  framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
  DateFormatSymbols symbols =
  new DateFormatSymbols(LocaleFRENCH);
  ChangeListener listener = new ChangeListener() {
  public void stateChanged(ChangeEvent e) {
  Systemoutprintln(Source: + egetSource());
  }
  };
  String days[] = symbolsgetWeekdays();
  SpinnerModel model = new SpinnerListModel(days);
  JSpinner spinner = new JSpinner(model);
  spinneraddChangeListener(listener);
  JLabel label = new JLabel(French Days/List);
  JPanel panel = new JPanel(new BorderLayout());
  paneladd(label BorderLayoutWEST);
  paneladd(spinner BorderLayoutCENTER);
  frameadd(panel BorderLayoutNORTH);
  SpinnerModel model = new SpinnerDateModel();
  JSpinner spinner = new JSpinner(model);
  spinneraddChangeListener(listener);
  JLabel label = new JLabel(Dates/Date);
  JPanel panel = new JPanel(new BorderLayout());
  paneladd(label BorderLayoutWEST);
  paneladd(spinner BorderLayoutCENTER);
  frameadd(panel BorderLayoutCENTER);
  SpinnerModel model = new SpinnerNumberModel();
  JSpinner spinner = new JSpinner(model);
  spinneraddChangeListener(listener);
  JLabel label = new JLabel(Numbers);
  JPanel panel = new JPanel(new BorderLayout());
  paneladd(label BorderLayoutWEST);
  paneladd(spinner BorderLayoutCENTER);
  frameadd(panel BorderLayoutSOUTH);
  framesetSize( );
  framesetVisible (true);
  }
  };
  EventQueueinvokeLater(runner);
  }
  
  運行這個程序可以示范listener的用法(當然你也會發現更多關於ChangeListener的有意義的方法)
  
  定制JSpinner的外觀
  
  同所有的Swing控件JSpinner在不同的系統定義lookandfeel類型下擁有不同的外觀如示圖這個控件期初看起來像一個textfield不同點是繪制了兩個箭頭
  
 
  示圖 JSpinner under different lookandfeel types
  

  集合中的個UIResource屬性在表格中列舉有限的方法繪制text field和箭頭
  
  Table JSpinner UIResource 元素
   
  SpinnerModel 接口
  
  到目前我們已經看到了如何同一個主JSpinner類連接SpinnerModel接口是控件的數據模型SpinnerModel的定義如下
  
  public interface SpinnerModel {
  // Properties
  public Object getValue();
  public void setValue(Object);
  public Object getNextValue();
  public Object getPreviousValue();
  // Listeners
  public void addChangeListener(ChangeListener);
  public void removeChangeListener(ChangeListener);
  }
  
  SpinnerModel中的六個方法直接繪制了JSpinner而JSpinner的方法間接調用模塊中的方法在監聽的狀況下事件將聯系到監聽器
  
  AbstractSpinnerModel類
  
  AbstractSpinnerModel類基本要實現的是SpinnerModel接口它提供了管理和通知的監聽列表子類必須實現接口中的四個方法SpinnerModel中的三個具體實現如下SpinnerDateModelSpinnerListModel和SpinnerNumberModel
  
  SpinnerDateModel類
  
  從名字可以推斷出SpinnerDateModel提供了數據的選擇這個類有兩個構造函數一個默認選擇所有的數據另一個要求你給出范圍
  
  public SpinnerDateModel()SpinnerModel model = new SpinnerDateModel();JSpinner spinner = new JSpinner(model);public SpinnerDateModel(Date value Comparable start Comparable end  int calendarField)Calendar cal = CalendargetInstance();Date now = calgetTime();caladd(CalendarYEAR );Date startDate = calgetTime();caladd(CalendarYEAR );Date endDate = calgetTime();SpinnerModel model =  new SpinnerDateModel(now startDate endDate CalendarYEAR);JSpinner spinner = new JSpinner(model);
  
  如果不指名任何參數就沒有開始和結束點下面的例子展示了使用參數來表示年的范圍最後一個成員變量應該是Calendar類中的一個定值
  ·    CalendarAM_PM
  ·    CalendarDAY_OF_MONTH
  ·    CalendarDAY_OF_WEEK
  ·    CalendarDAY_OF_WEEK_IN_MONTH
  ·    CalendarDAY_OF_YEAR
  ·    CalendarERA
  ·    CalendarHOUR
  ·    CalendarHOUR_OF_DAY
  ·    CalendarMILLISECOND
  ·    CalendarMINUTE
  ·    CalendarMONTH
  ·    CalendarSECOND
  ·    CalendarWEEK_OF_MONTH
  ·    CalendarWEEK_OF_YEAR
  ·    CalendarYEAR
  
  注意SpinnerDateModel不包含任何Calendar類中的時間域所以不能通過SpinnerDateModel在JSpinner中翻轉
  
  表格列出了SpinnerModel中的三個屬性四個關於SpinnerDateModel
  
  
Table SpinnerDateModel 屬性
   

  典型地唯一的新屬性中你將要用來獲得最終的日期盡管所有的結果都被包裹在getValue()中以適當的數據類型如果在構造函數中提供了數據的表示范圍那麼previous和next的值將是null在邊界條件下
  
  SpinnerListModel
  
  SpinnerListModel提供了從一個入口列表中選擇或者至少是字符串表述這個類有三個構造函數
  
  public SpinnerListModel()SpinnerModel model = new SpinnerListModel();
  JSpinner spinner = new JSpinner(model);
  public SpinnerListModel(List<?> values)List<String> list = args;
  SpinnerModel model = new SpinnerListModel(list);
  JSpinner spinner = new JSpinner(model);
  public SpinnerListModel(Object[] values)SpinnerModel model = new SpinnerListModel(args);
  JSpinner spinner = new JSpinner(model);
  
  當沒有參數提供時這個模型包括一個元素字符串emptyList版保留一個對list的引用而不是list的拷貝如果改變了list那麼模型中的list也將改變數組版本的創建了一個私有的內部類並且實例化一個list對於list和數組版本初始選擇的是第一個元素否則將拋出一個IllegalArgumentException異常
  
  如表格顯示屬性中增添的是set和get list
  
  
Table SpinnerListModel 屬性
   educitycn/img_///gif >

  SpinnerNumberModel類
  
  SpinnerNumberModel提供了從一個開區間或閉區間選擇數字的模式數字可以使Number類的所有子類包括Integer和Double他有四個構造函數
  
  public SpinnerNumberModel()SpinnerModel model = new SpinnerNumberModel();
  JSpinner spinner = new JSpinner(model);
  public SpinnerNumberModel(double value double minimum double maximum
  double stepSize)SpinnerModel model = new SpinnerNumberModel( );
  JSpinner spinner = new JSpinner(model);
  public SpinnerNumberModel(int value int minimum int maximum int stepSize)SpinnerModel model = new SpinnerNumberModel( );
  JSpinner spinner = new JSpinner(model);
  public SpinnerNumberModel(Number value Comparable minimum Comparable maximum
  Number stepSize)Number value = new Integer();
  Number min = new Integer();Number max = new Integer();
  Number step = new Integer();SpinnerModel model = new SpinnerNumberModel(value min max step);
  JSpinner spinner = new JSpinner(model);
  
  如果最大或最小值為null則為開區間對於沒有參數的初始值為步進為步進是整形的如果你設為那麼將不會完成
  
  表格展示了SpinnerNumberModel的屬性
  
  
Table SpinnerNumberModel 屬性
   educitycn/img_///gif >

  自定義模型
  
  一般來說可用的JSpinner模型已經足夠了所以沒有必要創建他的子類了但是並不是所有場合都能滿足比如你可能希望使用一個包裝了SpinnerListModel的模型代替停止在第一個或最後一個元素他包裝了另一個結束在列表中給出了具體實現
  
  Listing RolloverSpinnerListModel 類
  
  import javaxswing*;
  import javautil*;
  public class RolloverSpinnerListModel extends SpinnerListModel {
  public RolloverSpinnerListModel(List values) {
  super(values);
  }
  public RolloverSpinnerListModel(Object[] values) {
  super(values);
  }
  public Object getNextValue() {
  Object returnValue = supergetNextValue();
  if (returnValue == null) {
  returnValue = getList()get();
  }
  return returnValue;
  }
  public Object getPreviousValue() {
  Object returnValue = supergetPreviousValue();
  if (returnValue == null) {
  List list = getList();
  returnValue = listget(listsize() );
  }
  return returnValue;
  }}
  
  JSpinner編輯器
  
  對於JSpinner每個可用的模型一個次要的支持類JSpinner的一個內部類然而這個模塊可以控制控件是否可選JSpinner編輯器允許你控制如何顯示和編輯每個可選的值
  
  JSpinnerDefaultEditor類
  
  JSpinner的setEditor()方法允許你將任何Jcomponent作為JSpinner的編輯器當然你可以那樣做更典型的是你將用JSpinnerDefaultEditor的子類作運行以JformattedTextField作為簡單的編輯器工作將提供所有你需要的基本功能它包括一個基本的構造函數
  
  public JSpinnerDefaultEditor(JSpinner spinner)JSpinner spinner = new JSpinner();
  JComponent editor = JSpinnerDefaultEditor(spinner);
  spinnersetEditor(editor);
  
  在表格中可以看到有兩個屬性
  
  
Table JSpinnerDefaultEditor properties
   educitycn/img_///gif >

  在不知道使用的是哪個模型工作的情況下在這個級別的你可以做的是改變JformattedTextField中的文字顯示更典型的是你將改變模型編輯器的某些自定義方面
  
  JSpinnerDateEditor類
  
  DateEditor允許你定制不同的日期顯示方式使用javatext包中SimpleDateFormat類察看Javadoc了解更多的關於SimpleDateFormat的可用格式模式如果你不喜歡默認的地顯示方式可以通過給構造函數的第二個參數傳遞一個新參數來改變顯示模式
  
  public JSpinnerDateEditor(JSpinner spinner)SpinnerModel model = new SpinnerDateModel();
  JSpinner spinner = new JSpinner(model);JComponent editor = JSpinnerDateEditor(spinner);
  spinnersetEditor(editor);
  public JSpinnerDateEditor(JSpinner spinner String dateFormatPattern)SpinnerModel model = new SpinnerDateModel();
  JSpinner spinner = new JSpinner(model);
  JComponent editor = JSpinnerDateEditor(spinner MMMM yyyy);
  spinnersetEditor(editor);
  
  默認情況格式是M/d/yy h:mm a或者// : PM 代表年的聖誕節的某個時間後面的例子將要顯示 December
  
  編輯器的兩個屬性在表格
  
  
Table JSpinnerDateEditor屬性
   educitycn/img_///gif >

  JSpinnerListEditor類
  
  當使用SpinnerListModel類工作時ListEditor不支持任何特殊格式而是提供了前置類型支持既然模塊的所有入口都知道了編輯器將嘗試匹配用戶輸入的字符這裡只有一個構造函數但是你可能幾乎用不到
  
  public JSpinnerListEditor(JSpinner spinner)
  
  在表格中將看到ListEditor只有一個屬性
  
 educitycn/img_///gif >

  JSpinnerNumberEditor類
  
  NumberEditor和DateEditor的工作方式很相似允許你輸入定制的顯示模式代替SimpleDateFormat工作NumberEditor可以協助javatext包中的DecimalFormat類就像DateEditor一樣他又兩個構造函數
  
  public JSpinnerNumberEditor(JSpinner spinner)SpinnerModel model = new SpinnerNumberModel( );JSpinner spinner = new JSpinner(model);JComponent editor = JSpinnerNumberEditor(spinner);spinnersetEditor(editor);public JSpinnerNumberEditor(JSpinner spinner String decimalFormatPattern)SpinnerModel model = new SpinnerNumberModel( );JSpinner spinner = new JSpinner(model);JComponent editor = JSpinnerNumberEditor(spinner ######);spinnersetEditor(editor);
  
  第二個構造函數使用默認的字符串格式如果數字太大將使用逗號如果結果是一個完整的數將不會用十進制顯示
  
  表格顯示editor的兩個屬性
  
  
Table JSpinnerNumberEditor 屬性
   educitycn/img_///gif >

  總結
  
  在這篇文章中你學習到了Swing中的JSpinner控件當你要控制某些選擇在一定的范圍中時JSpinner可以讓你通過翻滾來選擇需要的值你學習到了如何提供這些要選擇的值通過使用SpinnerDateModel和DateEditorSpinnerListModel和ListEditorSpinnerNumberModel和NumberEditor來設置日期
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26070.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.