亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swing指南:Spinner Model Controls(組圖)

2019-11-18 11:57:07
字體:
來源:轉載
供稿:網友

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


  圖示1.JSpinner實例

  
  要創建和操縱JSpinner,許多類都將被調用,最重要的是JSpinner自己。最重要的兩個準素集包括SpinnerModel接口,包括可選擇的集合中的選項,還有,JSpinner.DefaultEditor的實現,用來捕捉所有選擇。慶幸的是,許多其它調用的類都是在后臺工作的,比如,一旦你給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接口,它里面有三個具體的子類可以使用:SpinnerDateModel,SpinnerListModel和SpinnerNumberModel,伴隨著他們的抽象父類AbstractSpinnerModel。假如不指名模型,那么SpinnerNumberModel將默認使用。而顯示和編輯的控件是JFormattedTextField,編輯的基本功能是通過一系列JSpinner的內部類實現的:DateEditor,ListEditor和NumberFormat,還有父類中DefaultEditor的支持。
  
  JSpinner屬性
  
  除了創建JSpinner對象之外,你還可以通過表一中的九個屬性中的一個來進行配置。
  
  
Table 1. JSpinner 屬性
   Swing指南:Spinner Model Controls(組圖)(圖二)

  value屬性中的值答應你更改當前控件的設置,nextValue和perviousValue可以使你以不同的方向察看模型中的入口。
  
  使用ChangeListener來監聽JSpinner events
  
  JSpinner直接支持一種事件監聽:changeListener。在別的地方,當commitEdit()方法被調用,這個事件將被觸發,告訴你spinner的值發生改變。為了證實,列表1聯系到一個自定義的ChangeListener,與圖示1的程序相關聯。
  
  列表 1. JSpinner with ChangeListener
  import java.awt.*;
  import javax.swing.*;
  import javax.swing.event.*;
  import java.text.*;
  import java.util.*;
  public class SpinnerSample {
  public static void main (String args[]) {
  Runnable runner = new Runnable() {
  public void run() {
  JFrame frame = new JFrame("JSpinner Sample");
  frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  DateFormatSymbols symbols =
  new DateFormatSymbols(Locale.FRENCH);
  ChangeListener listener = new ChangeListener() {
  public void stateChanged(ChangeEvent e) {
  System.out.  }
  };
  String days[] = symbols.getWeekdays();
  SpinnerModel model1 = new SpinnerListModel(days);
  JSpinner spinner1 = new JSpinner(model1);
  spinner1.addChangeListener(listener);
  JLabel label1 = new JLabel("French Days/List");
  JPanel panel1 = new JPanel(new BorderLayout());
  panel1.add(label1, BorderLayout.WEST);
  panel1.add(spinner1, BorderLayout.CENTER);
  frame.add(panel1, BorderLayout.NORTH);
  SpinnerModel model2 = new SpinnerDateModel();
  JSpinner spinner2 = new JSpinner(model2);
  spinner2.addChangeListener(listener);
  JLabel label2 = new JLabel("Dates/Date");
  JPanel panel2 = new JPanel(new BorderLayout());
  panel2.add(label2, BorderLayout.WEST);
  panel2.add(spinner2, BorderLayout.CENTER);
  frame.add(panel2, BorderLayout.CENTER);
  SpinnerModel model3 = new SpinnerNumberModel();
  JSpinner spinner3 = new JSpinner(model3);
  spinner3.addChangeListener(listener);
  JLabel label3 = new JLabel("Numbers");
  JPanel panel3 = new JPanel(new BorderLayout());
  panel3.add(label3, BorderLayout.WEST);
  panel3.add(spinner3, BorderLayout.CENTER);
  frame.add(panel3, BorderLayout.SOUTH);
  frame.setSize(200, 90);
  frame.setVisible (true);
  }
  };
  EventQueue.invokeLater(runner);
  }
  
  運行這個程序可以示范listener的用法(當然,你也會發現更多關于ChangeListener的有意義的方法)。
  
  定制JSpinner的外觀
  
  同所有的Swing控件,JSpinner在不同的系統定義look-and-feel類型下,擁有不同的外觀,如示圖2。這個控件期初看起來像一個textfield,不同點是繪制了兩個箭頭。
  
 Swing指南:Spinner Model Controls(組圖)(圖三)
  示圖 2. JSpinner under different look-and-feel types
  

  集合中的11個UIResource屬性在表格2中列舉,有限的方法繪制text field和箭頭。
  
  Table 2. JSpinner UIResource 元素
   Swing指南:Spinner Model Controls(組圖)(圖四)
  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中的三個具體實現如下:SpinnerDateModel,SpinnerListModel和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 = Calendar.getInstance();Date now = cal.getTime();cal.add(Calendar.YEAR, -50);Date startDate = cal.getTime();cal.add(Calendar.YEAR, 100);Date endDate = cal.getTime();SpinnerModel model =  new SpinnerDateModel(now, startDate, endDate, Calendar.YEAR);JSpinner spinner = new JSpinner(model);
  
  假如不指名任何參數,就沒有開始和結束點。下面的例子展示了使用參數來表示100年的范圍。最后一個成員變量應該是Calendar類中的一個定值:
  ·    Calendar.AM_PM
  ·    Calendar.DAY_OF_MONTH
  ·    Calendar.DAY_OF_WEEK
  ·    Calendar.DAY_OF_WEEK_IN_MONTH
  ·    Calendar.DAY_OF_YEAR
  ·    Calendar.ERA
  ·    Calendar.HOUR
  ·    Calendar.HOUR_OF_DAY
  ·    Calendar.MILLISECOND
  ·    Calendar.MINUTE
  ·    Calendar.MONTH
  ·    Calendar.SECOND
  ·    Calendar.WEEK_OF_MONTH
  ·    Calendar.WEEK_OF_YEAR
  ·    Calendar.YEAR
  
  注重:SpinnerDateModel不包含任何Calendar類中的時間域,所以不能通過SpinnerDateModel在JSpinner中翻轉。
  
  表格3列出了SpinnerModel中的三個屬性,四個關于SpinnerDateModel。
  
  
Table 3. SpinnerDateModel 屬性
   Swing指南:Spinner Model Controls(組圖)(圖五)

  典型地,唯一的新屬性中你將要用來獲得最終的日期,盡管所有的結果都被包裹在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);
  
  當沒有參數提供時,這個模型包括一個元素:字符串empty。List版保留一個對list的引用。而不是list的拷貝。假如改變了list,那么模型中的list也將改變。數組版本的創建了一個私有的內部類,并且實例化一個list。對于list和數組版本,初始選擇的是第一個元素,否則將拋出一個IllegalArgumentException異常。
  
  如表格4顯示,屬性中增添的是set和get list。
  
  
Table 4. SpinnerListModel 屬性
   Swing指南:Spinner Model Controls(組圖)(圖六)

  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(50, 0, 100, .25);
  JSpinner spinner = new JSpinner(model);
  public SpinnerNumberModel(int value, int minimum, int maximum, int stepSize)SpinnerModel model = new SpinnerNumberModel(50, 0, 100, 1);
  JSpinner spinner = new JSpinner(model);
  public SpinnerNumberModel(Number value, Comparable minimum, Comparable maximum,
  Number stepSize)Number value = new Integer(50);
  Number min = new Integer(0);Number max = new Integer(100);
  Number step = new Integer(1);SpinnerModel model = new SpinnerNumberModel(value, min, max, step);
  JSpinner spinner = new JSpinner(model);
  
  假如最大或最小值為null,則為開區間。對于沒有參數的,初始值為1,步進為1。步進是整形的,假如你設為.333,那么將不會完成。
  
  表格5展示了SpinnerNumberModel的屬性:
  
  
Table 5. SpinnerNumberModel 屬性
   Swing指南:Spinner Model Controls(組圖)(圖七)

  自定義模型
  
  一般來說,可用的JSpinner模型已經足夠了,所以沒有必要創建他的子類了。但是,并不是所有場合都能滿足。比如,你可能希望使用一個包裝了SpinnerListModel的模型,代替停止在第一個或最后一個元素,他包裝了另一個結束。在列表2中給出了具體實現:
  
  Listing 2. RolloverSpinnerListModel 類
  
  import javax.swing.*;
  import java.util.*;
  public class RolloverSpinnerListModel extends SpinnerListModel {
  public RolloverSpinnerListModel(List values) {
  super(values);
  }
  public RolloverSpinnerListModel(Object[] values) {
  super(values);
  }
  public Object getNextValue() {
  Object returnValue = super.getNextValue();
  if (returnValue == null) {
  returnValue = getList().get(0);
  }
  return returnValue;
  }
  public Object getPreviousValue() {
  Object returnValue = super.getPreviousValue();
  if (returnValue == null) {
  List list = getList();
  returnValue = list.get(list.size() - 1);
  }
  return returnValue;
  }}
  
  JSpinner編輯器
  
  對于JSpinner每個可用的模型,一個次要的支持類,JSpinner的一個內部類。然而這個模塊可以控制控件是否可選,JSpinner編輯器答應你控制如何顯示和編輯每個可選的值。
  
  JSpinner.DefaultEditor類
  
  JSpinner的setEditor()方法答應你將任何Jcomponent作為JSpinner的編輯器,當然你可以那樣做,更典型的是,你將用JSpinner.DefaultEditor的子類作運行。以JformattedTextField作為簡單的編輯器工作,將提供所有你需要的基本功能。它包括一個基本的構造函數:
  
  public JSpinner.DefaultEditor(JSpinner spinner)JSpinner spinner = new JSpinner();
  JComponent editor = JSpinner.DefaultEditor(spinner);
  spinner.setEditor(editor);
  
  在表格6中可以看到,有兩個屬性:
  
  
Table 6. JSpinner.DefaultEditor properties
   Swing指南:Spinner Model Controls(組圖)(圖八)

  在不知道使用的是哪個模型工作的情況下,在這個級別的你可以做的是改變JformattedTextField中的文字顯示。更典型的是,你將改變模型編輯器的某些自定義方面。
  
  JSpinner.DateEditor類
  
  DateEditor答應你定制不同的日期顯示方式,使用java.text包中SimpleDateFormat類。察看Javadoc了解更多的關于SimpleDateFormat的可用格式模式。假如你不喜歡默認的地顯示方式,可以通過給構造函數的第二個參數傳遞一個新參數來改變顯示模式。
  
  public JSpinner.DateEditor(JSpinner spinner)SpinnerModel model = new SpinnerDateModel();
  JSpinner spinner = new JSpinner(model);JComponent editor = JSpinner.DateEditor(spinner);
  spinner.setEditor(editor);
  public JSpinner.DateEditor(JSpinner spinner, String dateFormatPattern)SpinnerModel model = new SpinnerDateModel();
  JSpinner spinner = new JSpinner(model);
  JComponent editor = JSpinner.DateEditor(spinner, "MMMM yyyy");
  spinner.setEditor(editor);
  
  默認情況,格式是M/d/yy h:mm a或者12/25/04 12:34 PM 代表2004年的圣誕節的某個時間。后面的例子將要顯示2004 December。
  
  編輯器的兩個屬性在表格7中。
  
  
Table 7. JSpinner.DateEditor屬性
   Swing指南:Spinner Model Controls(組圖)(圖九)

  JSpinner.ListEditor類
  
  當使用SpinnerListModel類工作時,ListEditor不支持任何非凡格式。而是提供了前置類型支持。既然模塊的所有入口都知道了,編輯器將嘗試匹配用戶輸入的字符。這里只有一個構造函數,但是你可能幾乎用不到。
  
  public JSpinner.ListEditor(JSpinner spinner)
  
  在表格8中將看到ListEditor只有一個屬性:
  
 Swing指南:Spinner Model Controls(組圖)(圖十)

  JSpinner.NumberEditor類
  
  NumberEditor和DateEditor的工作方式很相似,答應你輸入定制的顯示模式。代替SimpleDateFormat工作,NumberEditor可以協助java.text包中的DecimalFormat類。就像DateEditor一樣,他又兩個構造函數:
  
  public JSpinner.NumberEditor(JSpinner spinner)SpinnerModel model = new SpinnerNumberModel(50, 0, 100, .25);JSpinner spinner = new JSpinner(model);JComponent editor = JSpinner.NumberEditor(spinner);spinner.setEditor(editor);public JSpinner.NumberEditor(JSpinner spinner, String decimalFormatPattern)SpinnerModel model = new SpinnerNumberModel(50, 0, 100, .25);JSpinner spinner = new JSpinner(model);JComponent editor = JSpinner.NumberEditor(spinner, "#,##0.###");spinner.setEditor(editor);
  
  第二個構造函數使用默認的字符串格式。假如數字太大,將使用逗號。假如結果是一個完整的數,將不會用十進制顯示。
  
  表格9中,顯示editor的兩個屬性。
  
  
Table 9. JSpinner.NumberEditor 屬性
   Swing指南:Spinner Model Controls(組圖)(圖十)

  總結
  
  在這篇文章中,你學習到了Swing中的JSpinner控件。當你要控制某些選擇在一定的范圍中時,JSpinner可以讓你通過翻滾來選擇需要的值。你學習到了如何提供這些要選擇的值:通過使用SpinnerDateModel和DateEditor,SpinnerListModel和ListEditor,SpinnerNumberModel和NumberEditor來設置日期。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性生交xxxxx久久久| 欧美福利视频在线| 亚洲va男人天堂| 国产精品免费久久久| 色诱女教师一区二区三区| 成人a级免费视频| 91高清在线免费观看| 日韩第一页在线| 日韩福利伦理影院免费| 久久亚洲春色中文字幕| 久久免费精品视频| 久国内精品在线| 一区二区三区国产视频| 欧美刺激性大交免费视频| 亚洲free性xxxx护士白浆| 久99久在线视频| 国产黑人绿帽在线第一区| 中文字幕九色91在线| 国模视频一区二区| 久久免费国产视频| 亚洲白虎美女被爆操| 亚洲国产精彩中文乱码av在线播放| 久久九九有精品国产23| 亚洲欧美日本伦理| 欧美日韩在线看| 色综合伊人色综合网站| 国产精品日韩在线观看| 亚洲欧美日韩精品久久| 亚洲欧美国产日韩中文字幕| 亚洲国产高潮在线观看| 久久久免费精品| 久久精品亚洲一区| 91九色国产社区在线观看| 中文字幕国产精品| 成人免费直播live| 久久国产精品偷| 国产中文日韩欧美| 欧美成人午夜免费视在线看片| 国产成人啪精品视频免费网| 亚洲天堂成人在线视频| 欧美小视频在线观看| 亚洲欧洲高清在线| 亚洲直播在线一区| 欧美成人合集magnet| 欲色天天网综合久久| www.亚洲天堂| 亚洲2020天天堂在线观看| 欧美性视频网站| 久久久噜噜噜久久中文字免| 欧美日韩亚洲精品内裤| 91精品在线影院| 欧美色另类天堂2015| 亚洲成人精品在线| 91在线观看欧美日韩| 91九色国产视频| 国产精品美女www爽爽爽视频| 97在线精品国自产拍中文| 成人免费网站在线观看| 日韩av不卡电影| 91久热免费在线视频| 日韩视频在线免费| 国产精品人人做人人爽| 日韩色av导航| 亚洲国产精品99久久| 国产一区二区日韩精品欧美精品| 国产精品一区二区三| 中文字幕精品一区久久久久| 久久综合电影一区| 久久久久久久久久久久久久久久久久av| 粉嫩av一区二区三区免费野| 欧美性极品xxxx娇小| 欧美夫妻性视频| 国产日韩换脸av一区在线观看| 精品国内亚洲在观看18黄| 国产精品wwww| 精品欧美激情精品一区| 国产欧美亚洲精品| 欧美日韩ab片| 欧美日韩亚洲91| 亚洲成年网站在线观看| 91在线视频九色| 亚洲精品wwww| 亚洲精品国产精品自产a区红杏吧| 中文字幕在线成人| 国产免费一区二区三区香蕉精| 久久综合久久八八| 国产精品mp4| 亚洲第一av网| 欧美一级免费视频| 欧美日韩精品在线| 亚洲精品久久久久中文字幕欢迎你| 欧美性在线观看| 日韩一区二区三区国产| 原创国产精品91| 欧美野外猛男的大粗鳮| 欧美有码在线视频| 欧美高清理论片| 午夜精品久久久久久99热| 国产日产亚洲精品| 国产精品久久久久久久久免费| 色婷婷av一区二区三区久久| 欧美激情高清视频| 亚洲欧美日韩成人| 国产成人鲁鲁免费视频a| 韩国精品久久久999| 91夜夜揉人人捏人人添红杏| 欧美国产日韩视频| 国产有码一区二区| 亚洲国产成人久久| 久久久久久亚洲精品中文字幕| 久久理论片午夜琪琪电影网| 亚洲裸体xxxx| 亚洲午夜精品久久久久久久久久久久| 欧美激情一区二区三区久久久| 日本aⅴ大伊香蕉精品视频| 黑人巨大精品欧美一区二区免费| 国产精品电影在线观看| 久久久久久成人| 久久天天躁狠狠躁夜夜爽蜜月| 欧美噜噜久久久xxx| 欧美不卡视频一区发布| 精品福利在线观看| 国产精品高潮呻吟久久av黑人| 亚洲精品动漫久久久久| 日本国产欧美一区二区三区| 日韩成人中文字幕在线观看| 日韩欧美精品中文字幕| 久久伊人免费视频| 亚洲加勒比久久88色综合| 国产91ⅴ在线精品免费观看| 自拍偷拍亚洲一区| 国产精品男人爽免费视频1| 久久久久一本一区二区青青蜜月| 久热精品视频在线免费观看| 亚洲精品wwwww| 国产亚洲精品一区二555| 国产自产女人91一区在线观看| 亚洲一区二区三区视频播放| 亚洲人午夜精品| 日韩欧美国产网站| 国产成人精品999| 欧美电影免费观看| 日本欧美爱爱爱| 国产一区二区免费| 日韩欧美在线国产| 91在线免费观看网站| 亚洲va男人天堂| 久久久久久久久久久久久久久久久久av| 欧美老少做受xxxx高潮| 国产精品视频精品视频| 亚洲网站在线播放| 欧美性极品xxxx娇小| 日本免费久久高清视频| 久久国产精品久久国产精品| 国产精品999| 欧美大全免费观看电视剧大泉洋| 在线观看精品自拍私拍| 欧美性一区二区三区| 亚洲一区二区三| 久久五月情影视| 最近的2019中文字幕免费一页| 日韩欧美国产中文字幕| 亚洲国产精品久久久久秋霞蜜臀| 国产欧美一区二区三区在线看|