<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    posts - 15,  comments - 34,  trackbacks - 27
    允許用戶從帶有 JSpinner 的拾取列表中快速選擇日期、數(shù)字和選項

    John Zukowski (jaz@zukowski.net)
    總裁,JZ Ventures, Inc.
    2001 年 7 月

    歡迎閱讀 Merlin 的魔力,一個半月刊的短篇系列,目的是為使用 Java 2 標準版,版本 1.4 編程提供幫助。在隨后的幾個月中,作者 John Zukowski 將提供一些技巧和訣竅來利用此發(fā)行版中許多新功能。在這個部分中,John 描述了 Swing 的新 JSpinner 組件,它允許您從拾取列表中選擇日期、數(shù)字和選項。請點擊文章頂部或底部的 討論,參與討論論壇,與本文作者和其他讀者分享您對本文的看法。

    Java 2 SDK,1.4 beta 的最新發(fā)行版向 JFC/Swing 組件集添加了兩個強大的新組件。其中一個是 JSpinner,它使用戶能夠方便地選擇日期、數(shù)字或拾取列表中的選項。(另一個是 JFormattedTextField,用于支持格式化的輸入。)

    開始啟動
    JSpinner 使您可創(chuàng)建一個排序的值列表,該表在選擇框中每次顯示一個選項,如圖 1 所示。用戶通過點擊上移和下移箭頭進行選擇。

    圖 1. JSpinner 示例
    圖 1. JSpinner 示例

    用戶使用組件或鍵盤上的上移和下移箭頭進行選擇。他們也可輸入自己的選擇。然而,與 JComboBox 不同,JSpinner 不提供下拉列表選擇,所以各個選擇以及它們的順序應(yīng)有一定的意義。

    要使用類,可簡單地創(chuàng)建一個供選擇的元素集合(在 List 或數(shù)組中),從列表中創(chuàng)建一個 SpinnerModel,并為模型創(chuàng)建一個 JSpinner

    清單 1. 簡單的 JSpinner 用法

     String[] months = new DateFormatSymbols().getMonths();
      SpinnerModel model = new SpinnerListModel(months);
      JSpinner spinner = new JSpinner(model);
    
    


    根據(jù)您所用的輸入類型,有以下幾個可用于創(chuàng)建組件數(shù)據(jù)模型的幫助類:

    • SpinnerDateModel:用于接受日期輸入。該類支持通過將 Calendar 類中的常數(shù)設(shè)置為不同的值來更改日期;例如,Calendar.WEEK_OF_MONTH 每次將日期更改一周。

    • SpinnerListModel:用于接受來自值列表的輸入。

    • SpinnerNumberModel:用于接受已設(shè)定好步長的一定范圍內(nèi)的數(shù)字( intdouble)的輸入。

    每個 SpinnerModel 執(zhí)行取決于用于輸入值的編輯器。此編輯器必須是一個 JComponent;系統(tǒng)定義的編輯器子類 JSpinner.DefaultEditor。其中一個可用于每個模型:

    • JSpinner.DateEditor:用于 SpinnerDateModel。允許您定制輸入日期格式。

    • JSpinner.ListEditor:用于 SpinnerListModel。支持 type-ahead 來對值進行定位。

    • JSpinner.NumberEditor:用于 SpinnerNumberModel。允許您定制十進制格式的模式。

    所有這些類(及更多類)之間的關(guān)系如圖 2 所示。

    圖 2. JSpinner UML 關(guān)系示意圖
    圖 2. JSpinner UML 關(guān)系示意圖

    事件處理
    JSpinner 組件象其它 Swing 組件一樣工作。如果您有興趣查出用戶更改選擇的時間,請連一個偵聽器。對于 JSpinner,偵聽器是一個 ChangeListener,您可直接將其連到 JSpinner 或其 SpinnerModel 上。雖然您可將偵聽器連到兩者中的任意一個,當值發(fā)生更改時,ChangeEvent 的源總是 SpinnerModel

    清單 2. JSpinner 事件偵聽

     ChangeListener listener = new ChangeListener() {
        public void stateChanged(ChangeEvent e) {
          SpinnerModel source = (SpinnerModel)e.getSource();
          System.out.println("The value is: " + source.getValue());
        }
      };
      model.addChangeListener(listener);
    
    


    一個完整的示例
    讓我們來看一下使用全部三種不同的 spinner 模型的示例(清單 3)。列表模型使用從 DateFormatSymbols 類取出的月份名稱集。日期模型示例更改編輯器的輸入格式。(beta 發(fā)行版中好象存在一處錯誤,當編輯器更改時不重新格式化字段。)當使用該字段旁邊的箭頭時,每次也可將日期移動一周。數(shù)字模型示例讓用戶選取從 0 到 100 之間的一個數(shù)字,當使用箭頭時每次跳 5 個數(shù)。請注意:用戶可輸入任意數(shù)字,而并不僅限于 5 的倍數(shù)。

    對于所有組件來說,當每個 spinner 值確實發(fā)生更改時,所連的偵聽器將顯示同一改變。如果使用光標鍵更改月、日或年,您會注意到直到按下回車鍵這些值才發(fā)生更改。

    清單 3. JSpinner 完整示例

    import javax.swing.*;
    import javax.swing.event.*;
    import java.text.*;
    import java.awt.*;
    import java.util.*;
    
    public class Spinner {
      public static void main (String args[]) throws Exception {
        JFrame frame = new JFrame("Spinner");
        frame.setDefaultCloseOperation(3);
        String[] months = new DateFormatSymbols().getMonths();
        SpinnerModel model = new SpinnerListModel(months);
        JSpinner spinner = new JSpinner(model);
        frame.getContentPane().add(spinner, BorderLayout.NORTH);
    
        SpinnerDateModel model2 = new SpinnerDateModel();
        model2.setCalendarField(Calendar.WEEK_OF_MONTH);
        JSpinner spinner2 = new JSpinner(model2);
        JSpinner.DateEditor editor2 = new JSpinner.DateEditor(
          spinner2, "MMMMM dd, yyyy");
        spinner2.setEditor(editor2);
        frame.getContentPane().add(spinner2, BorderLayout.SOUTH);
    
        SpinnerNumberModel model3 = new SpinnerNumberModel(50, 0, 100, 5);
        JSpinner spinner3 = new JSpinner(model3);
        frame.getContentPane().add(spinner3, BorderLayout.CENTER);
    
        ChangeListener listener = new ChangeListener() {
          public void stateChanged(ChangeEvent e) {
            SpinnerModel source = (SpinnerModel)e.getSource();
            System.out.println("The value is: " + source.getValue());
          }
        };
        model.addChangeListener(listener);
        model2.addChangeListener(listener);
        model3.addChangeListener(listener);
    
        frame.pack();
        frame.show();
      }
    }
    
    


    參考資料

    posted on 2005-02-05 20:25 jacky 閱讀(463) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(10)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    java

    搜索

    •  

    最新評論


    主站蜘蛛池模板: 一个人免费观看视频在线中文| 亚洲AV无码第一区二区三区| 免费的一级片网站| 久久精品无码一区二区三区免费 | youjizz亚洲| 亚洲乱码在线视频| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲经典在线观看| 亚洲天堂电影在线观看| 亚洲专区一路线二| 亚洲人成电影网站色| 亚洲av成人片在线观看| 亚洲aⅴ无码专区在线观看春色| 亚洲av综合av一区二区三区| 色天使亚洲综合一区二区| 鲁啊鲁在线视频免费播放| 一级毛片a免费播放王色| 久久精品免费网站网| 久久午夜无码免费| 免费看美女裸露无档网站| 日本免费高清一本视频| 亚洲AV无码一区二三区| 亚洲综合AV在线在线播放| 久久精品国产亚洲av麻| 亚洲精品456在线播放| 亚洲 欧洲 视频 伦小说| 校园亚洲春色另类小说合集| 男女拍拍拍免费视频网站| 99视频在线看观免费| 三年片在线观看免费观看高清电影| 日韩精品视频免费网址| 亚洲福利视频一区二区| 亚洲国产成人片在线观看无码| 亚洲综合激情视频| 含羞草国产亚洲精品岁国产精品 | 亚洲色精品三区二区一区| 免费人人潮人人爽一区二区| 在线看片免费人成视频福利| 午夜国产精品免费观看 | 久9热免费精品视频在线观看| 免费在线观看的网站|