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

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

通過JAVA SWING看透MVC設計模式

瀏覽:177日期:2024-06-29 08:54:20
內容: 來自:http://www.javaworld.com 作者:vipcowrie(翻譯) 一個好的用戶界面(GUI)的設計通常可以在現(xiàn)實世界找到相應的表現(xiàn)。例如,如果在您的面前擺放著一個類似于電腦鍵盤按鍵的一個簡單的按鈕,然而就是這么簡單的一個按鈕,我們就可以看出一個GUI設計的規(guī)則,它由兩個主要的部分構成,一部分使得它具有了按鈕應該具有的動作特性,例如可以被按下。另外一部分則負責它的表現(xiàn),例如這個按鈕是代表了A還是B。 看清楚這兩點你就發(fā)現(xiàn)了一個很強大的設計方法,這種方法鼓勵重用reuse,而不是重新設計redesign。你發(fā)現(xiàn)按鈕都有相同的機理,你只要在按鈕的頂上噴上不同的字母便能制造出“不同的按鈕,而不用為了每個按鈕而重新設計一份圖紙。這大大減輕了設計工作的時間和難度。 如果您把上述設計思想應用到軟件開發(fā)領域,那么取得相似的效果一點都不讓人驚奇。一個在軟件開發(fā)領域應用的非常廣泛的技術Model/View/Controller(MVC)便是這種思想的一個實現(xiàn)。 這當然很不錯,但是或許您又開始疑惑這和java基礎類JFC(Java Foundation Class)中的用戶界面設計部分(Swing)又有什么關系呢?好的,我來告訴你。 盡管MVC設計模式通常是用來設計整個用戶界面(GUI)的,JFC的設計者們卻獨創(chuàng)性的把這種設計模式用來設計Swing中的單個的組件(Component),例如表格Jtable,樹Jtree,組合下拉列表框JcomboBox等等等等。這些組件都有一個Model,一個View,一個Controller,而且,這些model,view,controller可以獨立的改變,就是當組件正在被使用的時候也是如此。這種特性使得開發(fā)GUI界面的工具包顯得非常的靈活。 好,來吧,讓我來告訴你它是如何工作的。 MVC設計模式就象我剛才指出的一樣,MVC設計模式把一個軟件組件區(qū)分為三個不同的部分,model,view,controller。 IMG http://www.csdn.net/Develop/ArticleImages/18/18953/CSDN_Dev_Image_2003-6-111007320.gif[/IMG]Model是代表組件狀態(tài)和低級行為的部分,它管理著自己的狀態(tài)并且處理所有對狀態(tài)的操作,model自己本身并不知道使用自己的view和controller是誰,系統(tǒng)維護著它和view之間的關系,當model發(fā)生了改變系統(tǒng)還負責通知相應的view。View代表了管理model所含有的數(shù)據(jù)的一個視覺上的呈現(xiàn)。一個Model可以有一個以上的View,但是Swing中卻很少有這樣的情況。Controller管理著model和用戶之間的交互的控制。它提供了一些方法去處理當model的狀態(tài)發(fā)生了變化時的情況。使用鍵盤上的按鈕的例子來說明一下:Model就是按鈕的整個機械裝置,View/Controller就是按鈕的表面部分。下面的圖解釋了如何把一個JFC開發(fā)的用戶界面分為model,view,controller,注意,view/Controller被合并到了一起,這是MVC設計模式通常的用法,它們提供了組件的用戶界面(UI)。 IMG http://www.csdn.net/Develop/ArticleImages/18/18953/CSDN_Dev_Image_2003-6-111007322.gif[/IMG]用Button的例子詳細說明為了更好的理解MVC設計模式和Swing用戶界面組件之間的關系,讓我們更加深入的進行分析。我將采用最常見的組件button來說明。我們從model來開始。 Model一個按鈕的model所應該具備的行為由一個接口ButtonModel來完成。一個按鈕model實例封裝了其內部的狀態(tài),并且定義了按鈕的行為。它的所有方法可以分為四類:l 查詢內部狀態(tài)l 操作內部狀態(tài)l 添加和刪除事件監(jiān)聽器l 發(fā)生事件其他的用戶界面組件有它們各自的與組件相關的Model,但是所有的組件Model都提供這四類方法。 View & Controller 上面的圖中講述一個按鈕的view/controller由一個接口ButtonUI完成。如果一個類實現(xiàn)了這個接口,那么它將會負責創(chuàng)建一個用戶界面,處理用戶的操作。它的所有方法可以被分為三大類:l 繪制Paintl 返回幾何類型的信息l 處理AWT事件其他用戶界面組件有他們自己的組件相關的View/Controller,但是他們都提供上述三類方法。 程序員通常并不會直接和model以及view/controller打交道,他們通常隱藏于那些繼承自java.awt.Component的組件里面了,這些組件就像膠水一樣把MVC三者合三為一。也正是由于這些繼承的組件對象,一個程序員可以很方便的混合使用Swing組件和AWT組件,然后,我們知道,Swing組件有很多都是直接繼承自相應的AWT組件,它能提供比AWT組件更加方便易用的功能,所以通常情況下,我們沒有必要混合使用兩者。 一個實例 現(xiàn)在我們已經明白了Java類與MVC各個部分的對應關系,我們可以更加深入一點去分析問題了。下面我們將要講述一個小型的使用MVC模式開發(fā)的例子。因為JFC十分的復雜,我只能把我的例子局限于一個用戶界面組件里面(如果你猜是一個按鈕的例子,那么你對了!) 讓我們來看看這個例子的所有部分吧。 Button類最顯而易見的開始的地方就是代表了按鈕組件本省的代碼,因為這個類是大部分程序員會接觸的。 就像我前面提到的,按鈕用戶界面組件類實際上就是model和view/controller的之間的黏合劑。每個按鈕組件都和一個model以及一個controller關聯(lián),model定義了按鈕的行為,而view/controller定義了按鈕的表現(xiàn)。而應用程序可以在任何事件改變這些關聯(lián)。讓我們看看得以實現(xiàn)此功能的代碼。 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(); } 在進入下一節(jié)之前,你應該多花一些時間來仔細閱讀一下Button類的源代碼。 ButtonModel類 ButtonModel維護著三種類型的狀態(tài)信息:是否被按下(pressed),是否“武裝上了(armed),是否被選擇(selected)。它們都是boolean類型的值。 一個按鈕被按下(pressed)是指當鼠標在按鈕上面的時候,按下鼠標但是還沒有松開鼠標按鈕的狀態(tài),及時用戶此時把鼠標拖拽到按鈕的外面也沒有改變這種狀態(tài)。 一個按鈕是否“武裝了(armed)是指按鈕被按下,并且鼠標還在按鈕的上面。 一些按鈕還可能被選擇(selected),這種狀態(tài)通過重復的點擊按鈕取得true或者false的值。 下面的代碼是狀態(tài)pressed的一個缺省的實現(xiàn)。狀態(tài)armed以及selected實現(xiàn)的代碼與之類似。ButtonModel類應該被繼承,這樣可以覆蓋缺省的狀態(tài)定義,實現(xiàn)有個性的按鈕。 private boolean boolPressed = false; public boolean isPressed() { return boolPressed; } public void setPressed(boolean boolPressed) { this.boolPressed = boolPressed; fireChangeEvent(new ChangeEvent(button)); } 按鈕的模型button model還負責通知其他對象(事件監(jiān)聽器)它們所感興趣的事件。從下面的代買中我們可以看出當按鈕的轉臺發(fā)生改變的時候就會發(fā)出一個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); } }在進入下一節(jié)之前,你應該多花一些時間來仔細閱讀一下ButtonModel類的源代碼。 ButtonUI類 按鈕的view/controller是負責構建表示層的。缺省情況下它僅僅是用背景色畫一個矩形而已,他們的子類繼承了他們并且覆蓋了繪制的方法,使得按鈕可以有許多不同的表現(xiàn),例如MOTIF,Windows 95,Java樣式等等。 public void update(Button button, Graphics graphics) { ; } public void paint(Button button, Graphics graphics) { Dimension dimension = button.getSize(); Color color = button.getBackground(); graphics.setColor(color); graphics.fillRect(0, 0, dimension.width, dimension.height); }ButtonUI類并不自己處理AWT事件,他們會使用一個定制的事件監(jiān)聽器把低級的AWT事件翻譯為高級的Button模型期望的語義事件。下面就是安裝/卸載事件監(jiān)聽器的代碼。 private static ButtonUIListener buttonuilistener = null; public void installUI(Button button) { button.addMouseListener(buttonuilistener); button.addMouseMotionListener(buttonuilistener); button.addChangeListener(buttonuilistener); } public void uninstallUI(Button button) { button.removeMouseListener(buttonuilistener); button.removeMouseMotionListener(buttonuilistener); button.removeChangeListener(buttonuilistener); }View/Controller實際上就是一些方法。他們不維護任何自己的狀態(tài)信息。因此,許多按鈕的實例可以共享一個ButtonUI實例。ButtonUI是通過在方面的參數(shù)列表里面加上按鈕的引用來區(qū)分各個不同的按鈕。 同樣,希望你能多花一些時間來看看ButtonUI類,然后咱們進入下一節(jié)。 ButtonUIListener類 ButtonUIListener類可以幫助Button類去轉變鼠標或者鍵盤的輸入為對按鈕模型的操作。這個監(jiān)聽器類實現(xiàn)了:MouseListener,MouseMotionListener,ChangeListener接口,并且處理一下事件: public void mouseDragged(MouseEvent mouseevent) { Button button = (Button)mouseevent.getSource(); ButtonModel buttonmodel = button.getModel(); if (buttonmodel.isPressed()) { if (button.getUI().contains(button, mouseevent.getPoint())) { buttonmodel.setArmed(true); } else { buttonmodel.setArmed(false); } } } public void mousePressed(MouseEvent mouseevent) { Button button = (Button)mouseevent.getSource(); ButtonModel buttonmodel = button.getModel(); buttonmodel.setPressed(true); buttonmodel.setArmed(true); } public void mouseReleased(MouseEvent mouseevent) { Button button = (Button)mouseevent.getSource(); ButtonModel buttonmodel = button.getModel(); buttonmodel.setPressed(false); buttonmodel.setArmed(false); } public void stateChanged(ChangeEvent changeevent) { Button button = (Button)changeevent.getSource(); button.repaint(); }在進入下一節(jié)之前希望你能仔細閱讀ButtonUIListener的源代碼。 總結我希望你能按照上面講述的方法去做。如果不能,那么所有的努力都將白費。這個例子以及Swing用戶界面組件的好處在于你不用去花時間去弄明白他們底層是如何設計實現(xiàn)的就可以很方便的使用他們了。他們都提供了缺省的model以及view/controller,然后,當你自己做組件的時候,你會發(fā)現(xiàn)上面的思想的強大之處。 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
標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品男女| 欧美亚洲国产日韩| 日韩精品视频一区二区三区| 亚洲制服少妇| 欧美亚洲在线日韩| 久久国产直播| 日本免费一区二区三区四区| 麻豆免费精品视频| 国产精品xvideos88| 国产精品久久久久久模特| 欧美日韩一区二区三区视频播放| 日韩高清中文字幕一区| 日韩中文字幕| 香蕉久久国产| 午夜在线一区| 久久精品免费看| 欧美精品三级在线| 久久精品伊人| 不卡一区综合视频| 99xxxx成人网| 久久中文字幕二区| 鲁大师影院一区二区三区| 国产精品腿扒开做爽爽爽挤奶网站| 天堂va蜜桃一区二区三区| 亚洲久久一区| 国产伦理久久久久久妇女| 老司机精品久久| 丝瓜av网站精品一区二区| 亚洲+小说+欧美+激情+另类| 国产精品99久久久久久董美香| 精品国产美女a久久9999| 国产日产精品_国产精品毛片| 久久av日韩| 国产精品66| 午夜av成人| 国产精品人人爽人人做我的可爱 | 国产精品综合色区在线观看| 久久超级碰碰| 亚洲天堂成人| 黑丝美女一区二区| 亚洲免费影视| 国产精品一区二区精品| 国内不卡的一区二区三区中文字幕| 91亚洲国产| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产激情久久| 久久久久国产一区二区| 免费在线观看精品| 麻豆精品av| 国产一区清纯| 丝袜美腿亚洲一区| 欧美91在线|欧美| 亚洲少妇一区| 久久一区欧美| 午夜日本精品| 国产精品一区二区三区美女| 尤物tv在线精品| 日韩中文在线电影| 日韩久久一区二区三区| 精品国产午夜肉伦伦影院| av在线最新| 日韩一区欧美二区| 精品在线网站观看| 在线观看视频免费一区二区三区| 精品一区二区三区亚洲| 国产亚洲永久域名| 精品日产乱码久久久久久仙踪林| 日韩一区欧美二区| 成人免费电影网址| 国产视频一区二| 亚洲深夜福利| 欧美日韩国产v| 日韩精品一级中文字幕精品视频免费观看 | 喷白浆一区二区| 中文字幕在线视频久| 日韩激情网站| 99在线|亚洲一区二区| 国产盗摄——sm在线视频| 日本午夜精品久久久久| 在线亚洲观看| 欧美成人基地 | 视频一区视频二区在线观看| 成人一二三区| 91成人在线| 国产偷自视频区视频一区二区| 国产成人1区| 国产一精品一av一免费爽爽| 国产成人a视频高清在线观看| 欧美影院精品| 视频一区中文字幕精品| 亚洲欧美日韩国产综合精品二区| 女生影院久久| 精品视频一区二区三区在线观看 | 亚洲天堂久久| 黄色网一区二区| 欧美一区91| 亚洲欧洲国产精品一区| 欧美va天堂在线| 天堂8中文在线最新版在线| 国产精品天堂蜜av在线播放| 亚洲不卡视频| 免费成人在线观看| 亚洲一区国产| 蜜桃视频欧美| 91精品国产调教在线观看| 久久久久久色| 亚洲区欧美区| 免费看黄色91| 99国产精品久久久久久久成人热| 激情综合婷婷| 精品国产一级| 欧美激情99| 国产美女久久| 久久国产婷婷国产香蕉| 婷婷亚洲成人| 综合激情婷婷| 丝袜a∨在线一区二区三区不卡| 国产精品日韩| 麻豆亚洲精品| 美国三级日本三级久久99 | 亚洲欧美高清| 99国产精品视频免费观看一公开| 亚洲午夜在线| 午夜国产一区二区| 国产精品97| 国产精品日韩| 综合亚洲色图| 欧美日韩亚洲一区| 国产日韩一区二区三区在线播放| 亚洲欧洲日韩精品在线| 日韩欧美激情| 欧美日韩亚洲一区在线观看| 国产精品一国产精品k频道56| 日本国产欧美| 国产精品嫩草影院在线看| 久久免费影院| 日韩精品电影| 精品一区在线| 日韩精品一二三四| 日韩av一区二区在线影视| 国产美女撒尿一区二区| 国产成人免费| 亚洲电影在线一区二区三区| 免费在线观看成人| 国产欧美啪啪| 日韩国产欧美| 亚洲激精日韩激精欧美精品| 免费成人在线观看| 少妇精品久久久一区二区三区| 久久国际精品| 国产盗摄——sm在线视频| 久久视频国产| 亚洲综合二区| 国产麻豆一区二区三区精品视频| 丰满少妇一区| 极品日韩av| 午夜亚洲福利| 久久亚洲精品中文字幕| 青青青免费在线视频| 亚洲精品一级二级| 免费人成黄页网站在线一区二区| 国产精品综合色区在线观看| 精品一区二区三区中文字幕| av在线资源| 日韩视频中文| 欧美视频一区| 精品免费在线| 国产综合激情| 日本中文字幕不卡| 精品国产一区二区三区性色av| 天堂资源在线亚洲| 久久高清精品| 一区二区精彩视频| 精品中文字幕一区二区三区 | 亚洲精品少妇| 久久久久伊人| 久久久夜夜夜| 亚洲九九精品| 成人影视亚洲图片在线| 蜜臀久久久久久久| 四虎成人av| 亚洲毛片视频| 欧美日韩免费观看视频| 日本亚洲三级在线| 日韩精品专区| 国产亚洲一区| 欧美精品自拍| 欧美黄色一区| 亚洲精品网址| 欧美精品国产白浆久久久久| 成人片免费看| 蜜桃传媒麻豆第一区在线观看| 久久99蜜桃| 亚洲精品国产偷自在线观看| 国产激情综合| 在线看片一区| 欧美日韩一二| 久久三级毛片| 欧美日韩日本国产亚洲在线 | 免费一区二区三区在线视频|