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

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

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

    如鵬網 大學生計算機學習社區

    CowNew開源團隊

    http://www.cownew.com 郵件請聯系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

     

    與VCL、AWT等框架中的圖形界面框架不同,Swing創造性的采用了MVC(Model View Controller) 模式。MVC 把控件(Component)劃分成三個部分:模型( Model):管理這個模塊中所用到的數據和值,如某個數據的最大值、最小值、當前值等數據;視圖( View):管理如何將模型顯示給用戶;控制器(Controller) 決定如何處理用戶和該模塊交互時產生的事件,如用戶單擊一個按鈕等。Sun 出于對視圖和控制器之間的依賴關系的考慮, 在 Swing 設計中將 MVC體系簡化為分離模型體系 ( Separable Model Architecture) , 將其中的控制器和視圖結合成 UI 代理。

    界面中的每個控件都包含三種特征:

    它的狀態:比如一個按鈕的狀態

    它的外觀:顏色、尺寸等

    它的行為:對事件作出的反應

    以一個按鈕為例,它有可用、不可用狀態,在不同的LookAndFeel中有不同的外觀顯示,在鼠標按下、鼠標右擊等事件中有自己獨特的響應方式。如果管理按鈕狀態、繪制按鈕外觀,響應時間等任務都由按鈕負責的話就違背了面向對象設計中的“單一責任原則”。Swing開發人員采用MVC模式解決了此問題,將控件的LookAndFeel同一個對象關聯到一起,同時將其內容保存到另一個對象中。控制器負責控制用戶輸入事件。比如鼠標單擊、按鍵操作等,它會決定將這些事件轉換成模型中的改變.還是視圖中的改變。例如,假定用戶在文本框中按下某個鍵,控制器就會調用模型的“插入字符”命令。隨后,模型會通知視圖更新來顯示新的模型。視圖不用關心什么時候進行文字改變,只要模型通知它更新它就會更新。這樣控制器只用與用戶交互并把交互結果反映到模型中去;模型負責維護狀態,當狀態變化時通知視圖更新顯示;視圖不負責用戶交互的狀態維護,它只是根據模型中的狀態繪制不同的界面。

    Swing中的大多數控件的模型是由一個名字以Model結尾的接口實現的。比如按鈕對應的模型接口就是 ButtonModel,JDK中定義了ButtonModel的默認實現類DefaultButtonModel。下面是ButtonModel各個方法的說明:

    boolean isArmed():如果按鈕被按下,且鼠標指針仍停留在按鈕上則返回true

    boolean isSelected():如果按鈕處于選擇狀態則返回true

    boolean isEnabled():如果按鈕可用則返回true

    boolean isPressed():如果按鈕被按下,但鼠標沒有松開,則返回true

    boolean isRollover():如果鼠標指針在按鈕之上則返回true

    public int getMnemonic():返回按鈕的助記鍵

    public String getActionCommand():返回命令字符串

    此外還有對應的設置狀態方法:public void setArmed(boolean b)、public void setSelected(boolean b)、public void setEnabled(boolean b)、public void setPressed(boolean b)、public void setRollover(boolean b)、public void setMnemonic(int key)、public void setActionCommand(String s)等。

    每一個JButton都保存著一個ButtonModel對象,我們可以通過JButton的getModel方法來取得該模型對象:

    JButton btn = new JButton(“test”);

    ButtonModel btnModel = btn.getModel();

    通過這個模型對象我們就可以得到按鈕的是否可用等狀態,不過這個模型是給控件開發者使用的,對于普通使用者來說無需直接調用它,JButton提供了方法來間接的取得這些屬性,這一點可以從AbstractButton類的isSelected方法中看出來:

    public boolean isSelected()

    {

    return model.isSelected();

    }

    Swing中大部分控件都由自己的模型,比如JList控件的ListModel、JTable的TableModel、JSpinner的SpinnerModel、JComboBox的SpinnerModel(SpinnerModel是從ListModel派生出來的),這些模型也由默認的實現,名稱通常為模型名前加Default。

    Swing中的大多數控件的視圖是由一個名字以UI結尾的類實現的,比如按鈕對應的模型接口就是 ButtonUI。由于視圖在不同的LookAndFeel中有不同的展現形式,所以控件的視圖對每一種LookAndFeel都提供了不同的實現。以JLabel為例,它就有MetalLabelUI、MotifLabelUI、WindowsLabelUI等對應不同LookAndFeel的實現。所有的視圖都要直接或者間接的從ComponentUI抽象類派生,ComponentUI類中的方法都是供Model回調使用的,下面是ComponentUI主要方法的說明:

    public void installUI(JComponent c):這個方法在ComponentUI 實例被安裝到UI代理的時候被觸發,用來根據LookAndFeel配置控件。它需要完成如下工作:為Color、Font、Border、Icon等類型的屬性設定默認值;根據需要設置布局管理器;創建子控件;初始化監聽器;為控件設置PropertyChangeListener 監聽器以檢測控件屬性變化事件;初始化快捷鍵、Tab鍵順序等;初始化數據;

    public void uninstallUI(JComponent c):這個方法在ComponentUI 實例被從UI代理移除的時候觸發。需要在此方法中撤銷任何在installUI中進行的配置,要保證JComponent實例變為潔凈狀態(也就是沒有監聽器,沒有LookAndFeel專有屬性等)。它需要完成如下工作:從控件中移除border;從控件中移除布局管理器;從控件中移除子控件;從控件中移除事件、屬性監聽器、從控件中移除快捷鍵、Tab鍵順序等;將數據標記為可以垃圾回收。

    public void paint(Graphics g, JComponent c):為本視圖的LookAndFeel繪制控件。

    public void update(Graphics g, JComponent c):通知UI代理繪制指定控件。當特定的控件被繪制的時候此方法會被觸發。這個方法的默認實現是用背景色填充控件,并且立即調用paint方法。

    public Dimension getPreferredSize(JComponent c):返回當前LookAndFeel下控件的最佳尺寸。默認實現是返回null;

    public Dimension getMinimumSize(JComponent c):返回當前LookAndFeel下控件的最小尺寸。默認實現是返回getPreferredSize的值;

    public Dimension getMaximumSize(JComponent c):返回當前LookAndFeel下控件的最大尺寸。默認實現是返回getPreferredSize的值;

    public boolean contains(JComponent c, int x, int y):判斷指定的x、y坐標是否存在于當前LookAndFeel下的控件中。

    public static ComponentUI createUI(JComponent c):為指定的控件返回UI代理實例。如果UI代理子類是無狀態的,它也可以返回多控件共享的實例。如果UI代理子類是有狀態的,則它必須為某個控件返回一個新的實例。

    public int getAccessibleChildrenCount(JComponent c):返回所有可訪問子控件的數量。

    public Accessible getAccessibleChild(JComponent c, int i):返回指定的子控件

    posted on 2007-04-19 19:37 CowNew開源團隊 閱讀(3876) 評論(3)  編輯  收藏

    評論

    # re: Swing中的MVC 2007-04-19 22:00 匿名
    骨的,正在學習swing,對我很有幫助  回復  更多評論
      

    # re: Swing中的MVC 2007-04-20 09:00 BeanSoft
    Swing 的思路設計的如此之好, 以至于好些 JS 組件庫也用這種思路, 例如: YUI-Ext. 這種思路好處就是各層可以單獨實現/修改, 加入換膚功能等, 壞處就是第一次來學曲線比較高. 其實比起來 RCP 也是有很高學習曲線的了, 不但要學 SWT/JFace, 還得看 Eclipse Plugin 開發, 畫圖的項目還得看 EMF 等.  回復  更多評論
      

    # re: Swing中的MVC 2007-04-20 13:41 sqhe18
    是啊,所以我覺得NetBeansRCP也是不錯的,關鍵不需要我再去學習SWT/Jface 之類的,而且它的插件機制相對于Eclipse來的簡單。  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲另类小说图片| 最近免费中文字幕大全视频 | 曰批免费视频播放在线看片二| 亚洲精品自产拍在线观看动漫| 啦啦啦在线免费视频| 久久w5ww成w人免费| 国产无遮挡色视频免费观看性色| 亚洲老熟女五十路老熟女bbw| 亚洲综合在线视频| 国产亚洲综合成人91精品 | 亚洲人成色99999在线观看| 亚洲综合成人网在线观看| 国产成人A亚洲精V品无码| 免费一级毛片不卡在线播放| 国产精品久久久久免费a∨| 99精品视频在线观看免费播放| 国产99精品一区二区三区免费| 在线91精品亚洲网站精品成人| 亚洲香蕉久久一区二区三区四区| 亚洲一区影音先锋色资源| 亚洲欧洲成人精品香蕉网| 亚洲男女内射在线播放| 在线永久免费观看黄网站| 一二三四影视在线看片免费 | 免费看少妇作爱视频| 免费电影在线观看网站| 国内精自视频品线六区免费| 精品无码AV无码免费专区| 久久国产乱子伦精品免费看| 手机看片国产免费永久| 国产性生大片免费观看性| 国产激情久久久久影院老熟女免费| 免费人成动漫在线播放r18 | 国产乱子伦精品免费女| 国产美女做a免费视频软件| 爽爽日本在线视频免费| 免费无码又爽又刺激毛片| 国产精品免费综合一区视频| 日本免费一区尤物| 免费一级国产生活片| 亚洲一区二区三区在线播放 |