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

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

使用Decorator模式實現日期選擇組件(3)

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

  基本的selector接口
  日期選擇類的核心是Date_selector_panel.仔細分析后,首先做了一些如下變量聲明,不要被"常量初始化"語法擲出。(以為括號中的代碼是靜態的,和其他沒有任何聯系.)實例初始化聲名使用this的結構避免了在構造器中連接另一個構造器。他們提供了保證在每個構造器都能有效調用的初始化方法。同時在一個地方給出所有的初始化代碼也是非常方便的。散布在各個地方的沒有初始化的變量很輕易引起運行錯誤。當移動代碼到構造器中也是非常困難的,因為移動過程中你必須考慮你已經改變的2個地方。比如說,在下面日歷聲明中代碼就是實例初始化:
    public class Date_selector_panel extends JPanel implements Date_selector
  {
   //這些字符串應該應該在資源包中,因此它們是國際化的?! ?br />      PRivate String[] months =
    {  "Jan","Feb", "Mar","Apr", "May","June",
      "July","Aug","Sept","Oct","Nov","Dec"
    };
  
    private static final int DAYS_IN_WEEK = 7, // 一個 星期的天數
    MAX_WEEKS  = 6; // 在一月中最大的//星期數。
    // 用戶選擇的日期
  private Date selected = null;
  
    private Calendar calendar = Calendar.getInstance();
    {  calendar.set( Calendar.HOUR,  0 );
      calendar.set( Calendar.MINUTE, 0 );
      calendar.set( Calendar.SECOND, 0 );
    }
  
    //顯示在屏幕上的當前日期
    private final Calendar today = Calendar.getInstance();
  
  下面便開始處理點擊不同天的事件。我采用比較輕易實現的外觀即將天天都以一個標簽是日期的按紐顯示在屏幕上,我定義了一個簡單的監聽對象并加載到每個按紐中。由監聽對象獲取按紐標簽值,由標簽值可以得到日期與日歷的位置,然后它將從日歷中獲取日期對象并且將日期字符串發送給監聽器(通過調用fire_ActionEvent()的方式)。
  //一個監聽器適合所有calendar事件
  private final Button_handler day_listener = new Button_handler();
  
  private class Button_handler implements ActionListener
  {  public void actionPerformed(ActionEvent e)
    {
      if (e.getActionCommand().equals("D"))
      {  String text = ((JButton) e.getSource()).getText();
  
        if(text.length() > 0) // <=0 means click on blank square. Ignore.
        {  calendar.set
          (  calendar.get(Calendar.YEAR),  // Reset the calendar
            calendar.get(Calendar.MONTH),  // to be the chosen
            Integer.parseInt(text)     // date.
          );
          selected = calendar.getTime();
          fire_ActionEvent( SELECT_ACTION, selected.toString() );
        }
      }
    }
  }
  
  private ActionListener subscribers = null;
  public synchronized void addActionListener(ActionListener l)
  {  subscribers = AWTEventMulticaster.add(subscribers, l);
  }
  public synchronized void removeActionListener(ActionListener l)
  {  subscribers = AWTEventMulticaster.remove(subscribers, l);
  }
  private void fire_ActionEvent( int id, String command )
  {  if (subscribers != null)
       subscribers.actionPerformed(new ActionEvent(this, id, command) );
  }
  
  
  
  //在面板顯示前調用addNotify()。它實際上創建了基本的圖象對象,因此你可以調用super.addNotify()去調用面板。
  [code]//這里使用它是一個入口去發送初始化ActionEvent到支持標題的任何實體。
  public void addNotify()
  {
    super.addNotify();
    int month = calendar.get(Calendar.MONTH);
    int year = calendar.get(Calendar.YEAR);
    fire_ActionEvent( CHANGE_ACTION, months[month] + " " + year );
  }[/code]
    然后我創建并初始化了代表天的按紐數組。有趣的是,日歷并不能用二維數組表示,于是,我把按紐放在GridLayout布局中,讓布局治理器來獲取他的狀態。在線形數組中在Grid中的第一個按鈕表示第一周的第一天;第八個按紐是第二周的第一天;等等。下面是代碼 :
  
  [code]--");
      days[i] = day;
      day.setBorder (BorderFactory.createEmptyBorder(1,2,1,2));
       day.setFocusPainted (false);  // Cannot get focus
      day.setActionCommand  ("D");
      day.addActionListener  (day_listener);// Our single listener
      day.setOpaque (false);         
   // Transparent background
    }
  }[/code]
  然后便是構造器。主要工作都在這沒有參數的構造器中。它創建了包含日歷的面板,建立了gridlayout布局,并將按紐加入到布局中:
  
  public Date_selector_panel()
  {
    JPanel calendar_display = new JPanel();
    calendar_display.setOpaque(false);
    calendar_display.setBorder( BorderFactory.createEmptyBorder(5,3,0,1) );
    calendar_display.setLayout(new GridLayout(MAX_WEEKS /*rows*/, DAYS_IN_WEEK /*columns*/ ));
  
    for( int i = 0; i < days.length; ++i )
      calendar_display.add(days[i]);
  
    setOpaque( false );
    setLayout( new BorderLayout() );
    add(calendar_display, BorderLayout.CENTER);
    update_calendar_display();
  }
  
    全部代碼清單還含有少量的的方便組件,使用他們比用當前日期能更好的初始化日歷。在這里我沒有談到。
  在Date_selector_panel中最值得說的是update_calendar_display()方法,當改變日歷的時候該方法更新顯示的日歷。我使用java.util.Calendar()方法來判定星期日與月初的偏移量并在這些按鈕上設置空字符串的標簽。最后我將用空字符串來填寫表示月末的按鈕標簽。
  通過這種方式,你看到的每個按都在改變,即使它代表的是當前月中的無效天。這里并不需要用代碼實現 ,因為當你 將按鈕放入GridLayout中,布局便會自動列出你放入的按鈕。
  [code]private void update_calendar_display()
  {
    setVisible(false); // Improves paint speed and redUCes flicker.
  
    clear_highlight();
  
    // The buttons that comprise the calendar are in a single
    // dimensioned array that was added to a 6x7 grid layout in
    // order. Because of the linear structure, it's easy to
    // lay out the calendar just by changing the labels on
    // the buttons. Here's the algorithm used below:
    //
    // 1) Find out the offset to the first day of the month.
    // 2) Clear everything up to that offset.
    // 3) Add the days of the month.
    // 4) Clear everything else.
  
    int month = calendar.get(Calendar.MONTH);
    int year = calendar.get(Calendar.YEAR);
  
    fire_ActionEvent( CHANGE_ACTION, months[month] + " " + year );
  
    calendar.set( year, month, 1 ); // First day of the current month.
  
    int first_day_offset = calendar.get(Calendar.DAY_OF_WEEK);   /* 1 */
  
    assert Calendar.SUNDAY == 0;
    assert first_day_offset < days.length;
  
    int i = 0;
    while( i < first_day_offset-1 )               /* 2 */
      days[i++].setText("");
  
    int day_of_month = 1;
    for(; i < days.length; ++i )                 /* 3 */
    {
      if( calendar.get(Calendar.MONTH)==today.get(Calendar.MONTH)
      && calendar.get(Calendar.YEAR )==today.get(Calendar.YEAR )
      && calendar.get(Calendar.DATE )==today.get(Calendar.DATE ) )
      {  highlight( days[i] );
      }
  
      days[i].setText( String.valueOf(day_of_month) );
  
      calendar.roll( Calendar.DATE, /*up=*/ true );  // Forward one day.
  
      day_of_month = calendar.get(Calendar.DATE);
      if( day_of_month == 1 )
        break;
    }
  
    // Note that we break out of the previous loop with i positioned
    // at the last day we added, thus the following ++ *must* be a
    // preincrement because we want to start clearing at the cell
    // a

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类在线观看| 国产精品久久久久久av| 亚洲激情在线视频| 亚洲精品国产suv| 亚洲色在线视频| 久热精品在线视频| 久久国产天堂福利天堂| 26uuu亚洲伊人春色| 欧美日韩中文字幕| 精品久久久久久久中文字幕| 久久精品久久久久电影| 亚洲精品视频免费在线观看| 亚洲第一精品自拍| 国产精品欧美日韩久久| 国产女人18毛片水18精品| 在线观看免费高清视频97| 九九精品在线观看| 日韩在线精品视频| 成人精品在线视频| 欧美激情一区二区三区成人| 亚洲国产精品一区二区三区| 黑人巨大精品欧美一区二区三区| 97婷婷大伊香蕉精品视频| 日韩国产高清污视频在线观看| 国产精品黄视频| 亚洲成人在线视频播放| 69国产精品成人在线播放| 日韩中文字幕在线| 亚洲一区二区日本| 日韩欧美国产高清91| 亚洲在线免费看| 狠狠色狠狠色综合日日小说| 亚洲一区二区三区视频播放| 国产精品wwwwww| 久久久久久国产精品三级玉女聊斋| 91久久精品一区| 97免费视频在线播放| 一区二区三区美女xx视频| 精品久久久久久久大神国产| 欧美野外wwwxxx| 亚洲女同性videos| 欧美性xxxxx| 亚洲美腿欧美激情另类| 日韩精品在线免费观看| 国产精品国模在线| 国产日韩欧美夫妻视频在线观看| 久久精品久久久久久国产 免费| 日本视频久久久| 亚洲欧洲激情在线| 久久99久久亚洲国产| 亚洲精品国产精品乱码不99按摩| 国产精品自拍偷拍视频| 久久噜噜噜精品国产亚洲综合| 久久福利网址导航| 国产日韩精品入口| 欧洲成人免费视频| 成人信息集中地欧美| 亚洲成年网站在线观看| 欧美成人剧情片在线观看| 精品久久中文字幕久久av| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲久久久久久久久久| 奇米4444一区二区三区| 欧洲永久精品大片ww免费漫画| 国产一区二区美女视频| 国模极品一区二区三区| 国产va免费精品高清在线| 欧美理论电影网| 茄子视频成人在线| 国产精品中文在线| 国产精品日日做人人爱| 日韩精品中文字幕有码专区| 亚洲精品一区久久久久久| 性欧美xxxx视频在线观看| 欧美激情综合亚洲一二区| 97久久精品国产| 懂色av影视一区二区三区| 精品人伦一区二区三区蜜桃网站| 欧美裸体xxxxx| 久久精品一本久久99精品| 韩国福利视频一区| www.午夜精品| 91精品国产电影| 国产精品视频永久免费播放| 成人午夜在线视频一区| 中文字幕国产精品久久| 欧美综合一区第一页| 亚洲一区二区三区四区在线播放| 国产视频在线一区二区| 国产精品视频免费在线观看| 亚洲精品美女久久| 欧洲成人性视频| 国产成人精品久久二区二区91| 97av在线影院| 欧美另类99xxxxx| 国产69精品久久久| 4444欧美成人kkkk| 午夜精品久久久久久久99热浪潮| 欧美激情一区二区三区久久久| 久久久国产一区二区三区| 亚洲精品福利免费在线观看| 色噜噜狠狠狠综合曰曰曰| 国产精品视频26uuu| 国内外成人免费激情在线视频| 欧美午夜片在线免费观看| www.国产精品一二区| 欧美多人乱p欧美4p久久| 日韩在线视频国产| 欧美另类交人妖| 亚洲欧美制服综合另类| 91久久久亚洲精品| 亚洲男女性事视频| 日韩精品免费电影| 欧洲日韩成人av| 日韩av影院在线观看| 成人在线一区二区| 国产伦精品免费视频| 国产精品九九久久久久久久| 在线看福利67194| 亚洲男人天堂手机在线| 九九久久精品一区| 91亚洲精品在线观看| 国产日韩综合一区二区性色av| 亚洲女人天堂av| 午夜精品久久久久久久久久久久久| 国产视频999| 狠狠做深爱婷婷久久综合一区| 成人免费xxxxx在线观看| 国产精品揄拍500视频| 亚洲国产精品va在线看黑人| 日韩欧美亚洲国产一区| 黄色成人av网| 国产精品视频一区国模私拍| 国产日韩欧美日韩大片| 欧美做爰性生交视频| 奇米四色中文综合久久| 国产欧美一区二区三区视频| 国产a级全部精品| 亚洲国产精品资源| 亚洲人精选亚洲人成在线| 国产成人精品一区二区在线| 欧美日韩国产色视频| 亚洲精品国产品国语在线| 97成人在线视频| 国产成人精品久久二区二区| 国产亚洲美女精品久久久| 中文字幕国内精品| 欧美激情女人20p| 亚洲丝袜一区在线| 久久九九免费视频| 日韩视频―中文字幕| 亚洲91精品在线观看| 日产精品99久久久久久| 日韩欧美亚洲国产一区| 一区二区三欧美| 一本色道久久综合狠狠躁篇怎么玩| 亚洲乱码一区av黑人高潮| 亚洲精品免费网站| 日韩a**站在线观看| 国产精品偷伦视频免费观看国产| 亚洲成av人乱码色午夜| 国产精品久久久久久婷婷天堂| 日韩一区二区三区在线播放| 国产在线观看精品一区二区三区|