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

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

通過 JAVA SWING 看透 MVC 設計模式

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

  一個好的用戶界面(GUI)的設計通??梢栽诂F實世界找到相應的表現。例如,假如在您的面前擺放著一個類似于電腦鍵盤按鍵的一個簡單的按鈕,然而就是這么簡單的一個按鈕,我們就可以看出一個GUI設計的規則,它由兩個主要的部分構成,一部分使得它具有了按鈕應該具有的動作特性,例如可以被按下。另外一部分則負責它的表現,例如這個按鈕是代表了A還是B。
  
  看清楚這兩點你就發現了一個很強大的設計方法,這種方法鼓勵重用reuse,而不是重新設計redesign。你發現按鈕都有相同的機理,你只要在按鈕的頂上噴上不同的字母便能制造出“不同”的按鈕,而不用為了每個按鈕而重新設計一份圖紙。這大大減輕了設計工作的時間和難度。
  
  假如您把上述設計思想應用到軟件開發領域,那么取得相似的效果一點都不讓人驚異。一個在軟件開發領域應用的非常廣泛的技術Model/View/Controller(MVC)便是這種思想的一個實現。
  
  這當然很不錯,但是或許您又開始迷惑這和java基礎類JFC(Java Foundation Class)中的用戶界面設計部分(Swing)又有什么關系呢?好的,我來告訴你。
  
  盡管MVC設計模式通常是用來設計整個用戶界面(GUI)的,JFC的設計者們卻獨創性的把這種設計模式用來設計Swing中的單個的組件(Component),例如表格Jtable,樹Jtree,組合下拉列表框JcomboBox等等等等。這些組件都有一個Model,一個View,一個Controller,而且,這些model,view,controller可以獨立的改變,就是當組件正在被使用的時候也是如此。這種特性使得開發GUI界面的工具包顯得非常的靈活。
  
  MVC設計模式
  就象我剛才指出的一樣,MVC設計模式把一個軟件組件區分為三個不同的部分,model,view,controller。
  
 通過 JAVA SWING 看透 MVC 設計模式(圖一)

  Model是代表組件狀態和低級行為的部分,它治理著自己的狀態并且處理所有對狀態的操作,model自己本身并不知道使用自己的view和controller是誰,系統維護著它和view之間的關系,當model發生了改變系統還負責通知相應的view。
  
  View代表了治理model所含有的數據的一個視覺上的呈現。一個Model可以有一個以上的View,但是Swing中卻很少有這樣的情況。
  
  Controller治理著model和用戶之間的交互的控制。它提供了一些方法去處理當model的狀態發生了變化時的情況。
  
  使用鍵盤上的按鈕的例子來說明一下:Model就是按鈕的整個機械裝置,View/Controller就是按鈕的表面部分。
  
  下面的圖解釋了如何把一個JFC開發的用戶界面分為model,view,controller,注重,view/Controller被合并到了一起,這是MVC設計模式通常的用法,它們提供了組件的用戶界面(UI)。
  
通過 JAVA SWING 看透 MVC 設計模式(圖二)

  用Button的例子具體說明
  
  為了更好的理解MVC設計模式和Swing用戶界面組件之間的關系,讓我們更加深入的進行分析。我將采用最常見的組件button來說明。
  
  我們從model來開始。
  
  Model
  一個按鈕的model所應該具備的行為由一個接口ButtonModel來完成。一個按鈕model實例封裝了其內部的狀態,并且定義了按鈕的行為。它的所有方法可以分為四類:
  
  查詢內部狀態
  
  操作內部狀態
  
  添加和刪除事件監聽器
  
  發生事件
  
  其他的用戶界面組件有它們各自的與組件相關的Model,但是所有的組件Model都提供這四類方法。
  
  View & Controller
  上面的圖中講述一個按鈕的view/controller由一個接口ButtonUI完成。假如一個類實現了這個接口,那么它將會負責創建一個用戶界面,處理用戶的操作。它的所有方法可以被分為三大類:
  
  繪制Paint
  
  返回幾何類型的信息
  
  處理AWT事件
  
  其他用戶界面組件有他們自己的組件相關的View/Controller,但是他們都提供上述三類方法。
  
  程序員通常并不會直接和model以及view/controller打交道,他們通常隱藏于那些繼續自java.awt.Component的組件里面了,這些組件就像膠水一樣把MVC三者合三為一。也正是由于這些繼續的組件對象,一個程序員可以很方便的混合使用Swing組件和AWT組件,然后,我們知道,Swing組件有很多都是直接繼續自相應的AWT組件,它能提供比AWT組件更加方便易用的功能,所以通常情況下,我們沒有必要混合使用兩者。
  
  一個實例
  現在我們已經明白了Java類與MVC各個部分的對應關系,我們可以更加深入一點去分析問題了。下面我們將要講述一個小型的使用MVC模式開發的例子。因為JFC十分的復雜,我只能把我的例子局限于一個用戶界面組件里面(假如你猜是一個按鈕的例子,那么你對了?。?br />  
  讓我們來看看這個例子的所有部分吧。
  
  Button類
  最顯而易見的開始的地方就是代表了按鈕組件本省的代碼,因為這個類是大部分程序員會接觸的。
  
  就像我前面提到的,按鈕用戶界面組件類實際上就是model和view/controller的之間的黏合劑。每個按鈕組件都和一個model以及一個controller關聯,model定義了按鈕的行為,而view/controller定義了按鈕的表現。而應用程序可以在任何事件改變這些關聯。讓我們看看得以實現此功能的代碼。
  
    public void setModel(ButtonModel buttonmodel)
  {
   if (this.buttonmodel != null)
   {
     this.buttonmodel.removeChangeListener(buttonchangelistener);
     this.buttonmodel.removeActionListener(buttonactionlistener);
  
     buttonchangelistener = null;
     buttonactionlistener = null;
   }
  
   this.buttonmodel = buttonmodel;
  
   if (this.buttonmodel != null)
   {
     buttonchangelistener = new ButtonChangeListener();
     buttonactionlistener = new ButtonActionListener();
  
     this.buttonmodel.addChangeListener(buttonchangelistener);
     this.buttonmodel.addActionListener(buttonactionlistener);
   }
  
   updateButton();
  }
  
  public void setUI(ButtonUI buttonui)
  {
   if (this.buttonui != null)
   {
     this.buttonui.uninstallUI(this);
   }
  
   this.buttonui = buttonui;
  
   if (this.buttonui != null)
   {
     this.buttonui.installUI(this);
   }
  
   updateButton();
  }
  
  public void updateButton()
  {
   invalidate();
  }
  
  在進入下一節之前,你應該多花一些時間來仔細閱讀一下Button類的源代碼。
  
  ButtonModel類
  ButtonModel維護著三種類型的狀態信息:是否被按下(PRessed),是否“武裝上了”(armed),是否被選擇(selected)。它們都是boolean類型的值。
  
  一個按鈕被按下(pressed)是指當鼠標在按鈕上面的時候,按下鼠標但是還沒有松開鼠標按鈕的狀態,及時用戶此時把鼠標拖拽到按鈕的外面也沒有改變這種狀態。
  
  一個按鈕是否“武裝了”(armed)是指按鈕被按下,并且鼠標還在按鈕的上面。
  
  一些按鈕還可能被選擇(selected),這種狀態通過重復的點擊按鈕取得true或者false的值。
  
  下面的代碼是狀態pressed的一個缺省的實現。狀態armed以及selected實現的代碼與之類似。ButtonModel類應該被繼續,這樣可以覆蓋缺省的狀態定義,實現有個性的按鈕。
  
    private boolean boolPressed = false;
  
  public boolean isPressed()
  {
   return boolPressed;
  }
  
  public void setPressed(boolean boolPressed)
  {
   this.boolPressed = boolPressed;
  
   fireChangeEvent(new ChangeEvent(button));
  }   
  
  按鈕的模型button model還負責通知其他對象(事件監聽器)它們所感愛好的事件。從下面的代買中我們可以看出當按鈕的轉臺發生改變的時候就會發出一個ChangeEvent。下面就是代碼:
  
  private Vector vectorChangeListeners = new Vector();
  
  public void addChangeListener(ChangeListener changelistener)
  {
   vectorChangeListeners.addElement(changelistener);
  }
  
  public void removeChangeListener(ChangeListener changelistener)
  {
   vectorChangeListeners.removeElement(changelistener);
  }
  
  protected void fireChangeEvent(ChangeEvent changeevent)
  {
   Enumeration enumeration = vectorChangeListeners.elements();
  
   while (enumeration.hasMoreElements())
   {
     ChangeListener changelistener =
      (ChangeListener)enumeration.nextElement();
  
     changelistener.stateChanged(changeevent);
   }
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费综合在线| 亚洲mm色国产网站| 欧美成人免费观看| 久久久久久亚洲精品中文字幕| 精品久久中文字幕| 91精品国产综合久久久久久久久| 2019国产精品自在线拍国产不卡| 久久伊人精品视频| 91在线观看免费| 精品久久久中文| 欧美日韩国产第一页| 亚洲视频综合网| 久久亚洲精品一区二区| 91九色国产社区在线观看| 欧美孕妇毛茸茸xxxx| 国产亚洲一级高清| 国产精品av在线| 日韩免费电影在线观看| 色综合伊人色综合网| 永久免费精品影视网站| 久久久av网站| 亚洲成人在线网| 国产精品欧美久久久| 亚洲欧美国产精品久久久久久久| 91国内揄拍国内精品对白| 尤物九九久久国产精品的特点| 欧美国产乱视频| 久久久91精品| 欧美激情一级欧美精品| 亚洲免费精彩视频| 亚洲综合自拍一区| 欧美激情久久久久久| 日韩av在线网址| 91精品国产乱码久久久久久久久| 久久噜噜噜精品国产亚洲综合| 亚洲免费精彩视频| 欧美激情一区二区三级高清视频| 日韩成人网免费视频| 久久久在线观看| 亚州成人av在线| 不卡在线观看电视剧完整版| 国产色婷婷国产综合在线理论片a| 久久精品国产久精国产一老狼| 美女精品久久久| 欧美性高跟鞋xxxxhd| 美女视频黄免费的亚洲男人天堂| 成人一区二区电影| 91午夜在线播放| 日韩经典中文字幕在线观看| 久久久亚洲国产| 日韩国产在线播放| 岛国av一区二区| 午夜精品99久久免费| 中文在线不卡视频| 精品少妇v888av| 国产亚洲精品久久久久久777| 欧美成人免费全部| 永久555www成人免费| 亚洲free性xxxx护士白浆| 国产免费一区二区三区在线观看| 2019国产精品自在线拍国产不卡| 欧美亚洲日本黄色| 色偷偷av一区二区三区| 538国产精品视频一区二区| 亚洲精品中文字幕av| 视频一区视频二区国产精品| 亚洲第一在线视频| 国色天香2019中文字幕在线观看| 欧美日韩国产在线播放| 欧美国产日韩在线| 日韩av电影中文字幕| 国产亚洲人成网站在线观看| 亚洲成年网站在线观看| 97国产成人精品视频| 91精品国产网站| 在线观看91久久久久久| 亚洲福利视频网| 国产噜噜噜噜噜久久久久久久久| 国产成人精品电影| 国产成人在线视频| 国产精品劲爆视频| 亚洲第一精品久久忘忧草社区| 亚洲欧美国内爽妇网| 欧美激情亚洲精品| 国产精品美女主播在线观看纯欲| 日韩一区二区三区在线播放| 日韩欧美在线网址| 欧美丰满少妇xxxxx| 91久久精品久久国产性色也91| 在线观看日韩www视频免费| 91精品久久久久久综合乱菊| 亚洲free性xxxx护士hd| www.亚洲人.com| 欧美另类在线观看| 日韩av电影国产| 日韩av快播网址| 欧美美女操人视频| 性欧美暴力猛交69hd| 亚洲精品在线看| 国产美女精彩久久| 欧美激情第1页| 日韩高清免费观看| 欧美精品在线免费播放| 国产日韩精品综合网站| 姬川优奈aav一区二区| 国产区精品视频| 性欧美视频videos6一9| 久久久中精品2020中文| 在线观看中文字幕亚洲| 亚洲欧美日本伦理| 久久久成人av| 亚洲国产一区自拍| 亚洲美女中文字幕| 亚洲国模精品私拍| 欧美日韩国产麻豆| 欧美怡红院视频一区二区三区| 久久人人爽人人爽爽久久| 欧美成人午夜免费视在线看片| 中日韩美女免费视频网站在线观看| 色综合天天综合网国产成人网| 97久久精品在线| 日本a级片电影一区二区| 日韩欧美一区二区三区久久| 96精品久久久久中文字幕| 日韩av大片免费看| 欧洲精品在线视频| 亚洲国产精品va在线观看黑人| 欧美激情综合色综合啪啪五月| 欧美一级淫片播放口| 欧美亚洲国产日韩2020| 91精品啪aⅴ在线观看国产| 精品久久久久久久久久ntr影视| 亚洲激情视频在线播放| 日韩av在线免费| 欧美亚洲另类制服自拍| 久久99国产精品自在自在app| 欧美亚洲激情在线| 欧美精品少妇videofree| 国产视频精品一区二区三区| 精品视频中文字幕| 欧美另类精品xxxx孕妇| 日韩毛片在线看| 亚洲va久久久噜噜噜久久天堂| 高跟丝袜一区二区三区| 成人精品一区二区三区电影黑人| 国产亚洲欧洲高清| 日韩h在线观看| 国产区精品视频| 日本久久久久久久久久久| 日韩高清中文字幕| 51视频国产精品一区二区| 久久久欧美精品| 亚洲日本aⅴ片在线观看香蕉| 97国产在线观看| 成人免费福利视频| 国产精品极品美女在线观看免费| 中文字幕自拍vr一区二区三区| 欧美日韩中国免费专区在线看| 日韩欧美在线国产| 久久视频中文字幕| 97色在线观看免费视频| 亚洲视频电影图片偷拍一区| 日韩免费看的电影电视剧大全| 精品一区二区三区四区|