




已閱讀5頁,還剩172頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
主要內容,基于java程序的gui設計工具,主要包括下述幾個概念: 組件-component(api) 容器-container 布局管理器-layoutmanager 事件處理,主要內容,容器及布局管理:解決組件在容器中的位置和大小; 常用組件介紹:按鈕、文本框、標簽、列表框、菜單等; 事件管理:如何監聽和響應事件;,主要內容,在java中,開發一個gui程序,通常需要以下幾步: (1)構建一個頂層容器,通常是jframe或japplet; (2)構建若干個組件,組件可以是其它容器; (3)設定容器的布局管理器,用容器的add()方法將這些組件加入到這個容器中; (4)設置組件事件,并將組件事件與代碼關聯。,重點掌握的內容,從介紹容器及布局管理入手,主要掌握組件如何布置問題,重點掌握取消布局管理的方法 事件管理,是本章的核心,對事件管理的四個要素,各起什么作用?怎樣應用熟練掌握? 對事件處理的三個方式要清楚,至少掌握一種方法 對各組件的具體使用,重點是按鈕、文本框、標簽,其它了解 對菜單、鼠標、鍵盤的事件管理做了解,7.1 圖形用戶界面概述,圖形用戶界面gui(graphics user interface) 1、目的 在applet或application程序中提供人機交互界面,是不可缺少的部分。 2、有關的java包及類 java.awt包,抽象窗口工具包awt,是jdk1.0 版本,主要包括如下: 繪制圖形、控制字體和顏色; 容器及布局管理; 各種常用組件,如按鈕、文本框、列表框等; 菜單,對話框; 事件管理; javax.swing包,是對awt的升級和擴充,比awt 組件更豐富、功能更強,由jdk1.2以上版本提供,兼容awt,各組件名前加j字頭,如jbutton。,為了開發gui程序,在java 1.2版之前, java提供了一個awt類庫,稱為抽象窗口工具箱(簡稱awt) 。 由于awt存在嚴重缺陷,sun從java 1.2 版開始提供了一個新的組件庫swing。 swing可以說是第二代gui開發工具集,它是通過javax.swing包提供的,javax.swing包也是java基礎類庫的組成部分。,7.1 圖形用戶界面概述,由于swing組件比awt組件有許多優點,所以新開發的程序應該使用swing組件而不應該再使用awt組件。 swing組件并沒有完全取代awt,它只是替代了awt包中的圖形用戶界面組件(如button、textfield、textarea等),awt中的一些輔助類(如graphics、color、font、layoutmanager等)仍然保持不變。另外,swing仍然使用awt的事件模型。,7.1 圖形用戶界面概述,swing組件簡介,1. 組件及層次 在java語言中,與圖形用戶界面相關的包有多個,其中比較重要的有java.awt包、java.awt.event包、javax.swing包。 圖7.1給出了有關包中常用的類及類的層次結構。,1. 組件及層次,圖7.1中applet類在java.applet包中,以j開頭的類在 javax.swing包中,其他類在java.awt包中。,圖7.1 java gui所用類的層次結構圖,表7-1 構建圖形用戶界面常用的類,java把component類的子類或間接子類創建的對象稱為一個組件。 把container的子類或間接子類創建的對象稱為一個容器。 awt中的大部分類都是容器類(container)和組件類(component)的子類或間接子類。,1. 組件及層次,java.awt包中一部分類的層次關系如圖所示,1. 組件及層次,2.組件分類,容器組件:容器組件又可以分為三類: 頂層容器:包括jframe、japplet、jdialog; 通用容器:包括jpanel、jscrollpane、jsplitpane、jtabbedpane、jtoolbar; 專用容器:包括jinternalframe、jlayeredpane、jrootpane等。 基本組件:基本組件包括jbutton、jtextfield、 jcombobox、jlist、jmenu、jslider等。這些組件有的主要用于信息的顯示,如jlabel、jprogressbar、jtooltip等,有的可以在其中編輯信息,如jtextarea、jtextfield、jfilechooser、jcolorchooser、jtable、jtree等。 菜單組件:菜單組件包括jmenubar、jmenu、jmenuitem、jradiobuttonmenuitem、jcheckboxmenuitem和jpopupmenu等。這些組件主要用于構建各種菜單。,2.組件分類,japplet:java.lang.applet的擴展版本。 jbutton: 按鈕或命令按鈕。 jcheckbox: 復選框。 jcheckboxmenuitem: 復選菜單項。 jcombobox: 組合框。 jcomponent: swing組件的基類。 jdialog: 對話框窗口的基類。 jlabel: 標簽項。 jlist: 列表框。 jmenu: 菜單。 jmenubar: 菜單條。 jmenuitem: 菜單項。 jpanel: 通用的輕量容器。 jpasswordfield: 文本框(用來輸入口令),jcomponent類常用方法,jcomponent抽象類是所有swing組件的超類,其 中定義了每個組件都可以使用的方法,常用的方法 有: public void setsize(int width,int height) 設置組件或容器的大小。 public void setvisible(boolean b) 設置組件或容器是否可見。 public void setbackground(color c) 設置組件的背景顏色,color為顏色類。 public color getbackground() 返回組件的背景顏色,color為顏色類。,jcomponent類及其方法,public void setforeground(color c) 設置組件的前景顏色。 public color getforeground() 返回組件的前景顏色。 public void setfont(font f) 設置組件上使用的字體,font為字體類。 public font getfont() 返回組件上使用的字體。 public graphics getgraphics() 返回組件的圖形上下文(graphics context)或繪圖對象,graphics為圖形上下文類,使用該類對象可以在組件上繪制圖形。 public void settooltiptext(string text) 設置組件上的提示信息。 public string gettooltiptext() 返回組件上的提示信息。,container類及其方法,容器(container)也是一個類,實際上 是component的子類,因此容器本身也是一 個組件,具有組件的所有性質,但是它的主 要功能是容納其他組件和容器。,添加到容器中的組件位置和大小由容器的布局管理器決定(layout manager)。setlayout()方法設置容器布局。 容器中可以容納其他組件,通過調用容器的add()方法把其他組件添加到容器中。,container類及其方法,container類中的常用方法: public component add(component comp) public component add(component comp, int index) 向容器中添加組件,index參數指定組件添加到容器中的位置,無index參數則添加到默認位置。 public void remove(component comp) 從容器中清除指定的組件。,container類及其方法,public void setlayout(layoutmanager mgr) 設置容器的布局。參數mgr是布局管理器對象,它決定組件在容器中如何擺放。 public void paint(graphics g) 在容器上繪制圖形。 public void paintcomponents(graphics g) 在容器上繪制圖形。 public void update(graphics g) 更新容器上繪制的圖形。,7.2 容器(container),容器的作用:容納其它組件; 容器類:container類,繼承于component類; 基本容器:共有三種; 1、japplet:java小程序容器,可作為頂層容器,除菜單以外,可加入任何其它組件。 2、jframe:框架容器,生成彈出式窗口,可加入菜單和任何組件,是獨立于japplet的頂層容器,可在applet和application中使用。 3、jdialog:對話框容器,也是一種彈出式窗口,作為頂層容器,可加入其它組件,但不能加入菜單,用于彈出一些信息。java提供一些標準的對話框,如filedialog可推出window風格的文件對話框,對文件進行打開、保存等。 一般容器:有jpanel,jscrollpanel,jtabbedpanel,jtoolbar等。,簡單的框架窗口,1. 創建簡單的框架窗口 每個使用swing gui的程序必須至少有一個頂層swing容器。 對于gui應用程序來說,一般應該有一個主窗口,也稱為框架窗口。在swing中,框架窗口是由jframe對象實現的。 2.jframe類常用的構造方法有: public jframe() 創建一個沒有標題的窗口對象。 public jframe(string title) 創建一個以title為標題的窗口對象。,3.常用方法 (1)創建窗口 直接創建一個jframe的實例或通過繼承jframe類來定義 子類,再創建對象。 例: jframe frame=new jframe(“窗體“); (2)設置標題 通過super(string title)調用基類的構造方法,或通過 settitle(string title)方法設置標題。 jframe frame=new jframe(“窗體“); 或jframe frame=new jframe(); frame.settitle(“窗體”); (3)設置初始位置 void setlocation(int x,int y)設置初始位置,其中x,y是窗口左上角在屏幕上的坐標值。 (4)設置大小 void setsize(int w,int h) 設置frame尺寸。,簡單的框架窗口,(5)設置窗體是否可見 void setvisible(boolean b)設置窗體是否可見。 (6)窗體自適應組件 void pack()調整frame大小自動適應顯示所有組件。 (7)定義關閉行為 setdefaultcloseoperation(int operation)方法設置關閉行 為。其中operation取值如下: exit_on_close:當關閉窗口時退出程序。 do_nothing_on_close:當關閉窗口時不做任何處理。 hide_on_close:當關閉窗口時隱藏這個窗口。(默認) dispose_on_close:當關閉窗口時隱藏并處理這個窗口。,簡單的框架窗口,程序7.1 helloswing.java,import javax.swing.*; public class helloswing public static void main(string args) jframe frame = new jframe(“hello swing“); frame.setsize(400,240); frame.setvisible(true); frame.setdefaultcloseoperation( jframe.exit_on_close); ,程序7.1 helloswing.java,圖7-3 最簡單的框架窗口,繼承jframe類,程序7.1的方法在創建比較簡單的窗口時還可以,如果窗口比較復雜,就會使得main()方法的內容過多。 一般應該創建一個繼承jframe類的子類,然后編寫程序創建該類對象。,程序7.2 helloswing.java,import javax.swing.*; public class helloswing extends jframe public helloswing1() this(“ helloswing “); public helloswing(string title) super(title); setsize(400,250); setlocation(350,250); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) helloswing frame = new helloswing(); ,在框架中添加組件,若向頂層容器(jframe、japplet、jdialog)中添加組件,可以使用容器的add()方法實現。 必須清楚容器使用的布局管理器,否則可能會得不到需要的結果。,程序7.3 simpleframe.java,import java.awt.*; import javax.swing.*; public class simpleframe extends jframe jbutton jbutton1,jbutton2; public simpleframe(string title) super(title); jbutton1 = new jbutton(“ok“); jbutton2 = new jbutton(“cancel“); setlayout(new flowlayout(); add(jbutton1); add(jbutton2); setsize(400,300); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) simpleframe frame = new simpleframe(“frame with button“); ,在框架中添加組件,實際上jframe對象是由多個窗格組成的,如圖7.6所示。,在框架中添加組件,jframe對象的中間層是內容窗格(content pane),它是一個容器對象。 用容器的add()方法添加的組件實際是添加到該內容窗格中的。 每個容器都有一個布局管理器,它管理著組件在其中的大小、位置等。 內容窗格默認的布局管理器是borderlayout, 即邊界式布局。 可以使用容器的setlayout()方法改變容器的布局管理器。,7.3 容器布局,1 borderlayout布局管理器 2 flowlayout布局管理器 3 gridlayout布局管理器 4 其他布局管理器 5 面板容器及容器的嵌套 6 應用程序外觀,java語言的一個特點是強調程序的平臺無關性。對于圖形用戶界面同樣是這樣。 在java的圖形界面程序中,它是通過為每種容器提供了布局管理器來實現組件布局的。 所謂布局管理器就是為容器設置一個layoutmanager對象(即布局管理器對象),來管理組件在容器中擺放的順序、位置、大小以及當窗口大小改變后組件如何變化等特征。,7.3 容器布局,通過使用布局管理器機制就可以實現gui的跨平臺性,同時避免為每個組件設置絕對位置。 常用的布局管理器有: flowlayout borderlayout gridlayout cardlayout和gridbaglayout 這些類都是在java.awt包中定義的。,7.3 容器布局,每種容器都有默認的布局管理器,也可以為容器指定新的布局管理器。 如果要將某個容器的布局管理器設置為新的布局,需要使用構造方法創建一個布局管理器對象,然后使用容器的setlayout()方法將容器設置為這種布局管理器。,7.3 容器布局,borderlayout:邊界式布局。是swing包中 容器jframe、japplet、jdialog的默認布 局管理器。 布局特點:將容器分為東西南北中五個區域,通常每個區域放一個組件,位置及大小無法控制; 構造方法:有兩個 public borderlayout() public borderlayout(int h_gap,int v_gap),1. borderlayout布局管理器,borderlayout的構造方法,public borderlayout(int hgap, int vgap) 該構造方法創建一個布局管理器對象,hgap和vgap分別指定使用這種布局時組件之間的水平間隔和垂直間隔距離,單位為像素。 public borderlayout() 該構造方法創建一個borderlayout布局管理器對象,使用這種布局時組件之間沒有間隔。,borderlayout布局管理器,borderlayout布局也叫邊界式布局,它將容器分成東、南、西、北、中五個區域,每個區域可放置一個組件或其他容器。北占據容器的上方,東占據容器的右側,等等。中間區域是在東、南、西、北都填滿后剩下的區域。 若要改變容器的布局管理器須調用容器的setlayout()方法,它的格式為: public void setlayout(layoutmanager layout),borderlayout布局管理器,使用borderlayout 布局管理器,當窗口的大小改變時,容器中的組件大小相應改變。當窗口垂直延伸時,東、西、中區域也延伸;而當窗口水平延伸時,南、北、中區域也延伸。 當某個區域沒有添加組件時,中央組件會占據無組件的空間,但若沒有中央組件,四周組件都有,中央區域空出,請讀者自己修改程序,去掉某個區域的組件,觀察程序運行效果。,borderlayout布局管理器,向borderlayout布局的容器中添加組件應該使用add(component c, int index)方法,c為添加的組件,index為指定的位置。 指定位置需要使用borderlayout類定義的五個常量: borderlayout.north borderlayout.south borderlayout.east borderlayout.west borderlayout.center 如果不指定位置,組件添加到中央位置。 見bordlayouttest.java,程序7.4 borderlayoutdemo.java,import java.awt.*; import javax.swing.*; public class borderlayoutdemo extends jframe jbutton jbutton1,jbutton2, jbutton3,jbutton4,jbutton5; public borderlayoutdemo(string title) jbutton1 = new jbutton(“北“); jbutton2 = new jbutton(“南“); jbutton3 = new jbutton(“西“); jbutton4 = new jbutton(“東“); jbutton5 = new jbutton(“中“); / 設置布局管理器 setlayout(new borderlayout(10,10);,add(jbutton1, borderlayout.north); add(jbutton2, borderlayout.south); add(jbutton3, borderlayout.west); add(jbutton4, borderlayout.east); add(jbutton5, borderlayout.center); setsize(300,240); settitle(title); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) borderlayoutdemo window = new borderlayoutdemo(“border demo“); ,程序運行結果如圖所示:,圖7-6 邊界式布局,flowlayout;流式布局,是applet和frame和jpanel 的默認布局。 布局特點:組件按加入的先后順序依次從左至右,從上至下排列,位置及大小無法控制; 構造方法:有三個 public flowlayout(); public flowlayout(int alignment); 對齊方式:flowlayout.left 左對齊 flowlayout.center 中間對齊 flowlayout.left 右對齊 public flowlayout(int alignment,int h_gap,int v_gap); h_gap 水平間隙;v_gap垂直間隙。,2. flowlayout布局管理器,flowlayout布局管理器,flowlayout布局也叫流式布局,它是最簡單的布局管理器。是applet、frame和jpanel的默認布局。 設置為這種布局管理器的容器,當向其中添加組件時組件是從左到右,從上到下,一個一個地放置到容器中,一行放不下,放到下一行。 采用這種布局管理器的容器,當調整窗口大小后,布局管理器會重新調整組件的擺放位置,組件的大小和相對位置不變,組件的大小采用最佳尺寸。,flowlayout類常用的構造方法,public flowlayout(int align, int hgap, int vgap) 指定添加到容器中組件的對齊方式(align)、水平間距(hgap)和垂直間距(vgap)。 對齊方式align的取值必須為flowlayout定義的整型常量之一: flowlayout.left:表示左對齊 flowlayout.right:右對齊 flowlayout.center:居中對齊 水平間距是指水平方向上兩個組件之間的距離,單位是像素。 垂直間距是行之間的距離,單位也是像素。,flowlayout類常用的構造方法,public flowlayout(int align) 該構造方法只指定對齊方式。組件之間的水平間距和垂直間距使用默認值5個像素。 public flowlayout() 使用該構造方法構造的對象,對齊和間距都采用默認值:居中對齊,水平間距和垂直間距是5個像素。,程序7.5 flowlayoutdemo.java,import java.awt.*; import javax.swing.*; public class flowlayoutdemo extends jframe public flowlayoutdemo() flowlayout layout = new flowlayout(flowlayout.center,10,20); setlayout(layout); add(new jbutton(“button 1“); add(new jbutton(“2“); add(new jbutton(“button 3“); add(new jbutton(“long-named button 4“); add(new jbutton(“button 5“);,settitle(“flowlayout demo“); / 設置窗口標題 setsize(380,150); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) flowlayoutdemo window = new flowlayoutdemo(); ,程序的運行結果如圖所示:,圖7-7 流式布局的應用,3. gridlayout布局管理器,也叫網格式布局,將容器分成大小相等的單元格,每個單元格可放置一個組件,每個組件占據單元格的整個空間,調整容器的大小,單元格大小隨之改變。,gridlayout類的構造方法,public gridlayout(int rows, int cols, int hgap, int vgap) 參數rows和cols分別指定網格布局的行數和列數 hgap和vgap指定組件的水平間隔和垂直間隔,單位為像素。 行和列參數至少有一個為非0值。 public gridlayout(int rows, int cols) 缺省組件之間的間隔,組件之間間隔為0像素。 public gridlayout() 創建只有一行的網格布局對象,每個組件占一列,所有組件在一行,組件之間間隔為0像素。,gridlayout類的構造方法,如果指定的行數和列數與添加的組件個數不一致時 當行數、列數都不為零,以行優先 若有一個為零,則以非零值優先 例: cp.setlayout(new gridlayout(3,1,10,20); 如果添加的組件多于3個,結果是3行多列。 cp.setlayout(new gridlayout(3,0,10,20); 如果添加的組件多于3個,結果是3行多列。 cp.setlayout(new gridlayout(0,3,10,20); 如果添加的組件多于3個,結果是多行3列。,gridlayout布局管理器,向網格布局的容器中添加組件,只需調用容器的add()方法即可,不用指定位置,系統按照先行后列的次序依次將組件添加到容器中。,程序7.6 gridlayoutdemo.java import java.awt.*; import javax.swing.*; public class gridlayoutdemo extends jframe public gridlayoutdemo() setlayout(new gridlayout(0,2); add(new jbutton(“button 1“); add(new jbutton(“2“);,程序7.6 gridlayoutdemo.java,add(new jbutton(“button 3“); add(new jbutton(“long-named button 4“); add(new jbutton(“button 5“); settitle(“gridlayout demo“); pack(); / 以緊縮的形式顯示組件 setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) gridlayoutdemo window = new gridlayoutdemo (); ,gridlayout布局管理器,程序的運行結果如圖所示:,圖9-8 網格布局的應用,4. 其他布局管理器,除上面介紹的布局管理器外,java語言還提供了若干布局管理器,例如: cardlayout、gridbaglayout、boxlayout、grouplayout和springlayout等。 每種布局管理器都有自己的特點,應用在特殊的場合。其中有些非常復雜,可應用于較復雜的圖形用戶界面的設計中。 如果界面復雜,可以考慮使用集成開發環境(ide)來設計用戶界面。,其他布局管理器,在設計圖形界面時,java也支持組件絕對定位的設計。 如果需要手工控制組件在容器中的大小和位置,應該將容器的布局管理器設置為null,即調用容器的setlayout()方法,并將參數指定為null,然后調用組件的setlocation()方法設置組件在容器中的位置、調用setsize()或setbounds()方法設置組件的大小。 不推薦使用這種方法。,5.取消布局管理器及布置組件的方法,取消布局管理器的目的:不受布局管理器固定格式的限制,使組件可任意大小,擺放在任何位置,增加使用的靈活性。 取消的方法:容器的對象名.setlayout(null); 布置組件的方法: 設置組件對象擺放位置及大小的方法: 組件對象名.setbounds(new rectangle(x,y,w,h); 或setbounds(x,y,w,h); 再把組件對象添加到容器中: 容器對象名.add(組件對象名) 演示例程:見layoutnull.java,6. 面板容器及容器的嵌套,jpanel類:由于某一種布局管理器的能力有限,在設計復雜布局時通常采用容器嵌套的方式,即把組件添加到一個中間容器中,再把中間容器作為組件添加到另一個容器中,從而實現復雜的布局。 jpanel類對象經常在構造復雜布局中作為中間容器,既可以把它放入其他容器中,也可以在其上放置其他容器和組件,但它不能單獨顯示,需要放到jframe或applet這樣的頂層容器中。 jframe、japplet、jdialog都默認有一個jpanel。,jpanel的構造方法,public jpanel(layoutmanager layout) 創建一個面板對象,使用指定的布局管理器對象layout設置面板的布局。 public jpanel() 使用缺省的布局管理器創建一個面板。 面板的缺省的布局管理器是flowlayout。也可以在創建面板對象后重新設置它的布局,方法也是使用面板對象的setlayout()方法。,jpanel的常用方法,常用方法: void setsize(int w,int h) void setvisible(boolean b) void setlayout(layoutmanager l);進行布局管理,面板容器及容器的嵌套,使用面板容器作為中間容器構建圖形用戶界面程序的一般思想是: 先將組件添加到面板上,然后將面板作為一個組件再添加到頂層容器中。 例:設計一個如圖所示的圖形界面,程序7.7 framewithpanel.java,import java.awt.*; import javax.swing.*; public class framewithpanel extends jframe jpanel panel_1,panel_2; public framewithpanel() super(“frame with panel“); panel_1 = new jpanel(); / 設置面板的背景顏色為青色 panel_1.setbackground(color.cyan);,創建兩個jpanel對象,在一個jpanel對象上放置三個按鈕,再將此jpanel對象添加到框架內容窗格的南部,將另一個jpanel對象添加到窗口的中央即可。,panel_2 = new jpanel(); panel_2.setlayout( new flowlayout(flowlayout.center,20,10); panel_2.add(new jbutton(“red“); panel_2.add(new jbutton(“green“); panel_2.add(new jbutton(“blue“); add(panel_1,borderlayout.center); add(panel_2,borderlayout.south); setsize(300,200); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) framewithpanel frame = new framewithpanel (); ,圖 jcomponent及其子類的層次結構,7.4 常用組件簡介,7.4 常用組件簡介,1、frame(jframe) 窗體容器 向frame中添加組件,可直接向frame對象添加 this.add(new button(“確定”); 向jframe對象中添加組件,要先獲取contentpane對象,然后再使用add()方法把組件添加到contentpane。 conteiner c=getcontentpane(); c.add(new jbutton(“退出”);,7.4 常用組件簡介,2、jpanel(panel)面板容器,也稱畫布、白板。 3、按鈕: 命令按鈕:button(jbutton) 單選按鈕:radiobutton( jradiobutton ) radiobuttongroup(按鈕組) 復選框: checkbox 4、jlabel(lable)標簽 主要用于顯示字符串,輸出一些信息及提示; 5、文本框 文本框即能輸入又能輸入字符串,而lable只能輸出,有三種文本框: 單行文本框:textfield(jtextfield) 多行文本框:textarea(jtextarea) 口令框: passwordfield 演示例程:testalltext.java,7.4 常用組件簡介,6、列表框,組合框 列表框:jlist(list),下拉式列出選項; 組合框:jcombobox(combbox),如同list,但最上面為可編輯區,可進行輸入編輯,也可從下拉列表中選項到編輯區; 演示例程:list_combbox.java 7、其它組件 滾動條:slider; 表格:table; 樹:tree; 滾動欄:scollbar; 滾動面板:scollpane; 標簽面板:tabbedpane;,7.5 事件處理,現代的圖形用戶界面程序都是事件驅動的。 通過事件處理才能實現用戶與程序的交互。 本節主要介紹java gui程序的事件處理模型:包括 監聽器的事件處理模型; 和常見的事件處理方法。 還將介紹java gui編程中常用的組件,包括標簽、按鈕、文本框和菜單等,它們是圖形用戶界面程序中最基本的元素。,1 事件處理模型 2 事件類 3 事件監聽器 4 事件處理的基本步驟 5 常見的事件處理 6 事件適配器類,7.5 事件處理,1. 事件處理模型,在java 1.1版之前事件處理采用事件傳遞模型。 從java 1.1版開始,java的事件處理采用了新的事件處理模型,稱為事件代理模型。 所謂事件代理模型就是將事件的處理從事件源對象代理給一個或多個稱為事件監聽器的對象,事件由事件監聽器處理。事件代理模型把事件的處理委托給外部實體進行處理,實現了事件源和監聽器分離的機制。,事件代理模型,涉及三種對象:事件源、事件和事件監聽器。 事件源(event source):產生事件的對象,一般來說可以是組件,如按鈕、對話框等。當這些對象的狀態改變時,就會產生事件。事件源可以是可視化組件,也可以是計時器等不可視的對象。 事件(event):描述事件源狀態改變的對象。如按鈕被點擊,就會產生actionevent動作事件。 事件監聽器(listener):接收事件并對其進行處理的對象。事件監聽器對象必須是實現了相應接口的類的對象。,java的事件代理模型,首先在事件源上注冊事件監聽器,當用戶行為觸發一個事件時,運行時系統將創建一個事件對象,然后尋找事件監聽器對象來處理該事件。,圖 gui事件處理模型,2. 事件類,為了實現事件處理,java定義了大量的事件類,這些類封裝了事件對象。 swing組件可產生多種事件,如點擊按鈕、選擇菜單項會產生動作事件(actionevent),關閉窗口會產生窗口事件(windowevent)等。 java.util.eventobject類是所有事件類的根類,該類的定義為:,java.util.eventobject類,package java.util; public class eventobject implements java.io.serializable protected transient object source; public eventobject(object source) if (source = null) throw new illegalargumentexception(“null source“); this.source = source; public object getsource() return source; public string tostring() return getclass().getname() + “source=“ + source + “; ,2. 事件類,java.awt.awtevent是eventobject類的子類,同時又是所有組件awt事件類的根類。 該類中定義了getid()方法,它返回事件的類型。 awtevent類的常用的子類定義在java.awt.event包中,其中常用的awt事件類如下圖所示。,圖 常用的awt事件類及層次關系,2. 事件類,表1 常用事件及產生事件的組件,3. 事件監聽器,事件的處理必須由實現了相應的事件監聽器接口的類對象處理。 java為每類事件定義了相應的接口。 事件類和接口都是在java.awt.event包中定義的。 表2列出了常用的事件監聽器接口、接口中定義的方法以及所處理的事件。 接口中定義了一個或多個方法,這些方法都是抽象方法,必須由實現接口的類實現,java程序就是通過這些方法實現對事件的處理的。,表2 事件監聽器接口、方法及處理的事件,表2 事件監聽器接口、方法及處理的事件,4. 事件處理的基本步驟, 確定事件源和要處理的事件類型 就是確定要處理哪些組件的什么事件。 實現相應的監聽器接口并創建監聽器對象 實現監聽器接口可有多種方法: 方法1:用內部類(推薦); 方法2:在定義的類中用implements實現; 方法3:用匿名內部類實現;,說明: 一個類可以實現一個接口,也可以實現多個接口。 實現監聽器接口必須實現接口中定義的所有方法。實現接口中定義的方法就是編寫事件處理的代碼。 對于有多個方法的接口,系統還定義了事件適配器類,可以通過繼承事件適配器類實現。,4. 事件處理的基本步驟, 為組件注冊監聽器 每種組件都定義了可以觸發的事件類型,使用相應的方法為組件注冊監聽器。如果程序運行過程中,對某事件不需處理,也可以不注冊監聽器,甚至注冊了監聽器也可以注銷。 /注冊監聽器 public void addxxxlistener(xxxlistener l) /注銷監聽器 public void removexxxlistener(xxxlistener l),4. 事件處理的基本步驟,說明: 處理事件必須注冊監聽器:只有為組件注冊了監聽器后,在程序運行時,當發生該事件時才能由監聽器對象處理,否則即使發生了相應的事件,事件也不會被處理。 一個事件源 發生多種事件由多個事件監聽器處理; 一個監聽器對象處理多個事件源的同一類型的事件(如下述程序兩個按鈕可以用一個監聽器對象處理。),4. 事件處理的基本步驟,例:簡單的事件處理程序,例程序7.8 eventdemo.java,功能是:點擊“ok”按鈕時,在文本框中顯示“你點擊了ok按鈕”,點擊“cancel”按鈕時,在文本框中顯示“你點擊了cancel按鈕”。,圖 簡單的事件處理程序,方法1. 通過內部類實現監聽器接口,程序7.8 eventdemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class eventdemo extends jframe jtextfield tf ; jbutton btn1,btn2; public eventdemo() super(“event demo“); tf = new jtextfield(15); btn1 = new jbutton(“ ok “); btn2 = new jbutton(“cancel“); setlayout(new flowlayout(); add(tf); add(btn1); add(btn2); al listener = new al(); /創建一個監聽器對象 btn1.addactionlistener(listener); /為按鈕注冊監聽器 btn2.addactionlistener(listener);,setsize(350,100); setlocation(200,200); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); class al implements actionlistener / 內部類 public void actionperformed(actionevent e) if(jbutton)e.getsource()=btn1) tf.settext(“你點擊了ok按鈕“); / 修改文本框的內容 else if(jbutton)e.getsource()=btn2) tf.settext(“你點擊了cancel按鈕“); public static void main(stringargs) eventdemo frame = new eventdemo(); ,方法1. 通過內部類實現監聽器接口,方法2. 通過當前類實現監聽器接口,改寫上面的程序用當前類對象本身作為監聽器對象,需要修改的主要代碼如下:見eventdemo1.java public class eventdemo extends jframe implements actionlistener btn1.addactionlistener(this); /為按鈕注冊監聽器 btn2.addactionlistener(this); public void actionpe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國智能潔具市場運營狀況與盈利前景預測報告
- 電商用戶生命周期價值-洞察闡釋
- 礦山安全教育與培訓-洞察闡釋
- 康復新液與干細胞聯合治療神經損傷的信號調控研究-第1篇-洞察闡釋
- 情感智能社交機器人-情緒識別與調節技術-洞察闡釋
- 口腔頜面影像學中的影像學影像特征提取技術-洞察闡釋
- 水資源循環與全球變化-洞察闡釋
- 音樂產業鏈整合-洞察闡釋
- 三線整治工程合同范本
- 員工操作證管理制度
- 《RT-Thread實時操作系統內核、驅動和應用開發技術》全套教學課件
- 舌癌放療護理
- PPH術后護理查房
- 2022年江蘇省常州市強基計劃選拔數學試卷(附答案解析)
- 三年級數學下冊計算題大全(每日一練共18份)
- 小學生體適能教育現狀調查與分析
- 09SMS202-1埋地矩形雨水管道及附屬構筑物(混凝土模塊砌體)
- 重慶市沙坪壩區南開中學校2023-2024學年八年級下學期期末英語試題(無答案)
- 廣東省深圳市南山區2023-2024學年七年級下學期期末英語試題
- 2022-2023學年江蘇省蘇州市高二下學期學業質量陽光指標調研卷英語試卷
- 偏差行為、卓越一生3.0版
評論
0/150
提交評論