日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java Swing權威指南:Spinner Model Controls

瀏覽:196日期:2024-06-14 16:15:51
內容: [J2SE5.0]Java Swing權威指南:Spinner Model Controls作者:John Zukowski譯者:glorywine版權聲明:任何獲得Matrix授權的網站,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:John Zukowski;glorywine原文地址:http://www.javaworld.com/javaworld/jw-08-2005/jw-0829-jspinner.html中文地址:http://www.matrix.org.cn/resource/article/44/44000_Java_Swing.html關鍵詞: Java Swing Spinner Model ControlsJSpinner工作起來好像是在JList或者JComboBox中間放了一個JFormattedTextField。在JList或者JComboBox中,用戶可以提前設定好要輸入的值。JSpinner也提供這樣的一種機制。這個控件的另一個部分是JFormattedTextField。如何顯示和輸入不由那些小的控制格控制,比如JList。相反,可以通過JFormattedTextField來輸入或通過邊上的兩個小箭頭來瀏覽不同的可用的值。圖示1顯示了Spinner伴隨不同的輸入類型是什么樣子。圖示1的頂端的JSpinner是一個用來顯示法語星期,通過SpinnerListModel。中間的,是一個通過SpinnerDateModel顯示日期的JSpinner。底部的是使用SpinnerNumberModel的JSpinner。每一個都是通過各自神秘的方式,在本文的后面我們將要學習。圖示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 屬性value屬性中的值允許你更改當前控件的設置,nextValue和perviousValue可以使你以不同的方向察看模型中的入口。使用ChangeListener來監聽JSpinner eventsJSpinner直接支持一種事件監聽: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.println('Source: ' + e.getSource()); } }; 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,不同點是繪制了兩個箭頭。示圖 2. JSpinner under different look-and-feel types集合中的11個UIResource屬性在表格2中列舉,有限的方法繪制text field和箭頭。Table 2. 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中的三個具體實現如下: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 屬性典型地,唯一的新屬性中你將要用來獲得最終的日期,盡管所有的結果都被包裹在getValue()中,以適當的數據類型。如果在構造函數中提供了數據的表示范圍,那么previous和next的值將是null,在邊界條件下。SpinnerListModelSpinnerListModel提供了從一個入口列表中選擇或者至少是字符串表述,這個類有三個構造函數:public SpinnerListModel()SpinnerModel model = new SpinnerListModel();JSpinner spinner = new JSpinner(model);public SpinnerListModel(List<?> values)List 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 屬性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 屬性自定義模型一般來說,可用的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 在不知道使用的是哪個模型工作的情況下,在這個級別的你可以做的是改變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屬性JSpinner.ListEditor類當使用SpinnerListModel類工作時,ListEditor不支持任何特殊格式。而是提供了前置類型支持。既然模塊的所有入口都知道了,編輯器將嘗試匹配用戶輸入的字符。這里只有一個構造函數,但是你可能幾乎用不到。public JSpinner.ListEditor(JSpinner spinner) 在表格8中將看到ListEditor只有一個屬性: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中的JSpinner控件。當你要控制某些選擇在一定的范圍中時,JSpinner可以讓你通過翻滾來選擇需要的值。你學習到了如何提供這些要選擇的值:通過使用SpinnerDateModel和DateEditor,SpinnerListModel和ListEditor,SpinnerNumberModel和NumberEditor來設置日期。資源·javaworld.com:javaworld.com·Matrix-Java開發者社區:http://www.matrix.org.cn/·這篇文章節選自 The Definitive Guide to Java Swing, Third Edition, John Zukowski (Apress, June 2005; ISBN: 1590594479): http://www.apress.com/book/bookDisplay.html?bID=393關于作者John Zukowski是一個自由作者,也是JZ Ventures的java投資顧問。他是Sun’s Java Develop Connection,IBM’s developeWorks和JavaWorld的專欄作家。他最近一本書是Java Collections,Definitive Guide to Swing for java2,和Master java 1.4。他也是Borland’s JBuilder的作者:No Experience Required。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd [J2SE5.0]Java Swing權威指南:Spinner Model Controls作者:John Zukowski譯者:glorywine版權聲明:任何獲得Matrix授權的網站,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:John Zukowski;glorywine原文地址:http://www.javaworld.com/javaworld/jw-08-2005/jw-0829-jspinner.html
標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
视频一区在线播放| 国产乱论精品| 久久久夜夜夜| 欧美三区四区| 午夜欧美精品| 在线观看一区| 欧美日韩亚洲一区二区三区在线| 欧美日韩视频| 青青草伊人久久| 麻豆中文一区二区| 成人看片网站| 综合色一区二区| 国产精品一国产精品k频道56| 国产精品亚洲综合在线观看| 欧美aⅴ一区二区三区视频| 97国产成人高清在线观看| 国产一区观看| 日韩激情视频网站| 高清精品久久| 日韩精品一二区| 国产高清日韩| 香蕉国产精品| 亚洲精品伊人| 日韩久久一区二区三区| 亚州精品视频| 色综合狠狠操| 91亚洲精品在看在线观看高清| 久久精品毛片| 亚洲一区二区三区在线免费| 久久av网站| 蜜臀av一区二区三区| 电影91久久久| 日韩av二区在线播放| 欧美精选视频一区二区| 欧美视频精品全部免费观看| 激情欧美一区二区三区| 日本特黄久久久高潮| 综合日韩av| 日韩精品一区二区三区中文| 欧美色图国产精品| 成人在线免费观看91| 鲁大师成人一区二区三区| 久久久久久色| 国产国产精品| 美女一区网站| 国产不卡av一区二区| 日韩av午夜在线观看| 夜夜嗨一区二区三区| 久久久9色精品国产一区二区三区| 国产麻豆精品| 欧美片第1页综合| 亚洲狼人精品一区二区三区| 水蜜桃精品av一区二区| 国产欧美在线| 日本va欧美va欧美va精品| 老色鬼久久亚洲一区二区| 99久久亚洲精品| 日韩深夜视频| 国产综合色区在线观看| 激情黄产视频在线免费观看| 麻豆成人在线观看| 精品欧美日韩精品| 欧美激情日韩| 精品国产三区在线| 黑森林国产精品av| 日韩精品免费一区二区在线观看| 欧洲亚洲一区二区三区| 丁香婷婷久久| 中文字幕在线视频网站| 99视频精品全部免费在线视频| 在线中文字幕播放| 午夜av成人| 好看的亚洲午夜视频在线| 99久久婷婷这里只有精品| 伊人久久亚洲热| 日韩高清二区| 精品视频一区二区三区在线观看| 四季av一区二区凹凸精品| 亚洲一级影院| 日韩av影院| 最新中文字幕在线播放| 婷婷丁香综合| 久久国产成人| 国产精品白丝久久av网站| 日韩精品不卡一区二区| 西西人体一区二区| 国产精品最新| 婷婷中文字幕一区| 国产精品一区三区在线观看| 日韩精品一区二区三区免费观影 | 亚洲少妇自拍| 免费欧美在线视频| 日韩欧美午夜| 天海翼精品一区二区三区| 日韩高清电影免费| 欧美成人综合| 欧美日韩午夜| 亚洲国产不卡| 国产欧美日韩免费观看| 蜜臀久久99精品久久一区二区| 中文字幕av亚洲精品一部二部 | 蜜臀av性久久久久蜜臀aⅴ流畅| 精品视频自拍| 日本不卡在线视频| 久久久久久网| 国产精品香蕉| 亚洲欧美一级| 亚洲精品一区二区在线看| 麻豆精品久久| 国产精品久久久久毛片大屁完整版| 亚洲先锋成人| 中文字幕在线视频网站| 麻豆久久一区| 国产精品www.| 日韩国产在线观看| 亚洲在线一区| 国产综合亚洲精品一区二| 久久免费福利| 国产无遮挡裸体免费久久 | 久久精品二区亚洲w码| 亚洲精品美女| 日本中文字幕一区二区| 日韩一区精品字幕| 99在线|亚洲一区二区| 99成人超碰| 亚洲午夜黄色| 99久久久久国产精品| 91精品精品| 99视频+国产日韩欧美| 国产一区清纯| 在线综合亚洲| 国产农村妇女精品一二区| 99久久99久久精品国产片果冰| 人在线成免费视频| 久久久精品久久久久久96 | 国产欧美一区二区三区精品酒店 | 日韩国产在线一| 国产精品观看| 国产精品蜜芽在线观看| 99精品网站| 日韩精品91亚洲二区在线观看| 日本亚洲最大的色成网站www| 日韩精品亚洲专区| 国产精品1区| 日韩精品dvd| 伊人久久亚洲影院| 国产欧美丝祙| 中文在线资源| 亚洲一区免费| 国产精品**亚洲精品| 日韩精品2区| 亚洲精品高潮| 深夜福利视频一区二区| 玖玖精品视频| 国产videos久久| 视频一区视频二区中文| 麻豆视频观看网址久久| 91精品国产福利在线观看麻豆| 蜜桃国内精品久久久久软件9| 日韩影片在线观看| 美女视频一区在线观看| 欧美日韩国产传媒| 久久99影视| 亚洲一区二区三区久久久| 国内在线观看一区二区三区| 久久av在线| 天堂资源在线亚洲| 精品视频高潮| 日本不卡一二三区黄网| 久久国产毛片| 久久精品国产999大香线蕉| 亚洲综合五月| 午夜久久久久| 亚洲四虎影院| 日韩av自拍| 国产日韩一区| 亚洲在线网站| 亚洲国产日韩欧美在线| 国产精品毛片久久| 国产精品一区二区三区av麻| 视频一区二区中文字幕| 日韩午夜一区| 激情婷婷久久| 欧美精品日日操| 久久男人天堂| 日韩国产一区二区| 91综合视频| 吉吉日韩欧美| 日韩精品dvd| 日韩精品电影| 成人午夜亚洲| 久久亚洲人体| 高清一区二区三区av| 久久99国产精品视频| 国产精品videosex极品| 国产乱论精品| 精品一区二区三区中文字幕视频 | 国产一区二区三区四区五区| 精品一区视频| 鲁鲁在线中文|