SWT_GUI設(shè)計(jì)的入門了解.ppt_第1頁
SWT_GUI設(shè)計(jì)的入門了解.ppt_第2頁
SWT_GUI設(shè)計(jì)的入門了解.ppt_第3頁
SWT_GUI設(shè)計(jì)的入門了解.ppt_第4頁
SWT_GUI設(shè)計(jì)的入門了解.ppt_第5頁
已閱讀5頁,還剩172頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

主要內(nèi)容,基于java程序的gui設(shè)計(jì)工具,主要包括下述幾個(gè)概念: 組件-component(api) 容器-container 布局管理器-layoutmanager 事件處理,主要內(nèi)容,容器及布局管理:解決組件在容器中的位置和大??; 常用組件介紹:按鈕、文本框、標(biāo)簽、列表框、菜單等; 事件管理:如何監(jiān)聽和響應(yīng)事件;,主要內(nèi)容,在java中,開發(fā)一個(gè)gui程序,通常需要以下幾步: (1)構(gòu)建一個(gè)頂層容器,通常是jframe或japplet; (2)構(gòu)建若干個(gè)組件,組件可以是其它容器; (3)設(shè)定容器的布局管理器,用容器的add()方法將這些組件加入到這個(gè)容器中; (4)設(shè)置組件事件,并將組件事件與代碼關(guān)聯(lián)。,重點(diǎn)掌握的內(nèi)容,從介紹容器及布局管理入手,主要掌握組件如何布置問題,重點(diǎn)掌握取消布局管理的方法 事件管理,是本章的核心,對事件管理的四個(gè)要素,各起什么作用?怎樣應(yīng)用熟練掌握? 對事件處理的三個(gè)方式要清楚,至少掌握一種方法 對各組件的具體使用,重點(diǎn)是按鈕、文本框、標(biāo)簽,其它了解 對菜單、鼠標(biāo)、鍵盤的事件管理做了解,7.1 圖形用戶界面概述,圖形用戶界面gui(graphics user interface) 1、目的 在applet或application程序中提供人機(jī)交互界面,是不可缺少的部分。 2、有關(guān)的java包及類 java.awt包,抽象窗口工具包awt,是jdk1.0 版本,主要包括如下: 繪制圖形、控制字體和顏色; 容器及布局管理; 各種常用組件,如按鈕、文本框、列表框等; 菜單,對話框; 事件管理; javax.swing包,是對awt的升級和擴(kuò)充,比awt 組件更豐富、功能更強(qiáng),由jdk1.2以上版本提供,兼容awt,各組件名前加j字頭,如jbutton。,為了開發(fā)gui程序,在java 1.2版之前, java提供了一個(gè)awt類庫,稱為抽象窗口工具箱(簡稱awt) 。 由于awt存在嚴(yán)重缺陷,sun從java 1.2 版開始提供了一個(gè)新的組件庫swing。 swing可以說是第二代gui開發(fā)工具集,它是通過javax.swing包提供的,javax.swing包也是java基礎(chǔ)類庫的組成部分。,7.1 圖形用戶界面概述,由于swing組件比awt組件有許多優(yōu)點(diǎn),所以新開發(fā)的程序應(yīng)該使用swing組件而不應(yīng)該再使用awt組件。 swing組件并沒有完全取代awt,它只是替代了awt包中的圖形用戶界面組件(如button、textfield、textarea等),awt中的一些輔助類(如graphics、color、font、layoutmanager等)仍然保持不變。另外,swing仍然使用awt的事件模型。,7.1 圖形用戶界面概述,swing組件簡介,1. 組件及層次 在java語言中,與圖形用戶界面相關(guān)的包有多個(gè),其中比較重要的有java.awt包、java.awt.event包、javax.swing包。 圖7.1給出了有關(guān)包中常用的類及類的層次結(jié)構(gòu)。,1. 組件及層次,圖7.1中applet類在java.applet包中,以j開頭的類在 javax.swing包中,其他類在java.awt包中。,圖7.1 java gui所用類的層次結(jié)構(gòu)圖,表7-1 構(gòu)建圖形用戶界面常用的類,java把component類的子類或間接子類創(chuàng)建的對象稱為一個(gè)組件。 把container的子類或間接子類創(chuàng)建的對象稱為一個(gè)容器。 awt中的大部分類都是容器類(container)和組件類(component)的子類或間接子類。,1. 組件及層次,java.awt包中一部分類的層次關(guān)系如圖所示,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等。這些組件主要用于構(gòu)建各種菜單。,2.組件分類,japplet:java.lang.applet的擴(kuò)展版本。 jbutton: 按鈕或命令按鈕。 jcheckbox: 復(fù)選框。 jcheckboxmenuitem: 復(fù)選菜單項(xiàng)。 jcombobox: 組合框。 jcomponent: swing組件的基類。 jdialog: 對話框窗口的基類。 jlabel: 標(biāo)簽項(xiàng)。 jlist: 列表框。 jmenu: 菜單。 jmenubar: 菜單條。 jmenuitem: 菜單項(xiàng)。 jpanel: 通用的輕量容器。 jpasswordfield: 文本框(用來輸入口令),jcomponent類常用方法,jcomponent抽象類是所有swing組件的超類,其 中定義了每個(gè)組件都可以使用的方法,常用的方法 有: public void setsize(int width,int height) 設(shè)置組件或容器的大小。 public void setvisible(boolean b) 設(shè)置組件或容器是否可見。 public void setbackground(color c) 設(shè)置組件的背景顏色,color為顏色類。 public color getbackground() 返回組件的背景顏色,color為顏色類。,jcomponent類及其方法,public void setforeground(color c) 設(shè)置組件的前景顏色。 public color getforeground() 返回組件的前景顏色。 public void setfont(font f) 設(shè)置組件上使用的字體,font為字體類。 public font getfont() 返回組件上使用的字體。 public graphics getgraphics() 返回組件的圖形上下文(graphics context)或繪圖對象,graphics為圖形上下文類,使用該類對象可以在組件上繪制圖形。 public void settooltiptext(string text) 設(shè)置組件上的提示信息。 public string gettooltiptext() 返回組件上的提示信息。,container類及其方法,容器(container)也是一個(gè)類,實(shí)際上 是component的子類,因此容器本身也是一 個(gè)組件,具有組件的所有性質(zhì),但是它的主 要功能是容納其他組件和容器。,添加到容器中的組件位置和大小由容器的布局管理器決定(layout manager)。setlayout()方法設(shè)置容器布局。 容器中可以容納其他組件,通過調(diào)用容器的add()方法把其他組件添加到容器中。,container類及其方法,container類中的常用方法: public component add(component comp) public component add(component comp, int index) 向容器中添加組件,index參數(shù)指定組件添加到容器中的位置,無index參數(shù)則添加到默認(rèn)位置。 public void remove(component comp) 從容器中清除指定的組件。,container類及其方法,public void setlayout(layoutmanager mgr) 設(shè)置容器的布局。參數(shù)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:框架容器,生成彈出式窗口,可加入菜單和任何組件,是獨(dú)立于japplet的頂層容器,可在applet和application中使用。 3、jdialog:對話框容器,也是一種彈出式窗口,作為頂層容器,可加入其它組件,但不能加入菜單,用于彈出一些信息。java提供一些標(biāo)準(zhǔn)的對話框,如filedialog可推出window風(fēng)格的文件對話框,對文件進(jìn)行打開、保存等。 一般容器:有jpanel,jscrollpanel,jtabbedpanel,jtoolbar等。,簡單的框架窗口,1. 創(chuàng)建簡單的框架窗口 每個(gè)使用swing gui的程序必須至少有一個(gè)頂層swing容器。 對于gui應(yīng)用程序來說,一般應(yīng)該有一個(gè)主窗口,也稱為框架窗口。在swing中,框架窗口是由jframe對象實(shí)現(xiàn)的。 2.jframe類常用的構(gòu)造方法有: public jframe() 創(chuàng)建一個(gè)沒有標(biāo)題的窗口對象。 public jframe(string title) 創(chuàng)建一個(gè)以title為標(biāo)題的窗口對象。,3.常用方法 (1)創(chuàng)建窗口 直接創(chuàng)建一個(gè)jframe的實(shí)例或通過繼承jframe類來定義 子類,再創(chuàng)建對象。 例: jframe frame=new jframe(“窗體“); (2)設(shè)置標(biāo)題 通過super(string title)調(diào)用基類的構(gòu)造方法,或通過 settitle(string title)方法設(shè)置標(biāo)題。 jframe frame=new jframe(“窗體“); 或jframe frame=new jframe(); frame.settitle(“窗體”); (3)設(shè)置初始位置 void setlocation(int x,int y)設(shè)置初始位置,其中x,y是窗口左上角在屏幕上的坐標(biāo)值。 (4)設(shè)置大小 void setsize(int w,int h) 設(shè)置frame尺寸。,簡單的框架窗口,(5)設(shè)置窗體是否可見 void setvisible(boolean b)設(shè)置窗體是否可見。 (6)窗體自適應(yīng)組件 void pack()調(diào)整frame大小自動適應(yīng)顯示所有組件。 (7)定義關(guān)閉行為 setdefaultcloseoperation(int operation)方法設(shè)置關(guān)閉行 為。其中operation取值如下: exit_on_close:當(dāng)關(guān)閉窗口時(shí)退出程序。 do_nothing_on_close:當(dāng)關(guān)閉窗口時(shí)不做任何處理。 hide_on_close:當(dāng)關(guān)閉窗口時(shí)隱藏這個(gè)窗口。(默認(rèn)) dispose_on_close:當(dāng)關(guān)閉窗口時(shí)隱藏并處理這個(gè)窗口。,簡單的框架窗口,程序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的方法在創(chuàng)建比較簡單的窗口時(shí)還可以,如果窗口比較復(fù)雜,就會使得main()方法的內(nèi)容過多。 一般應(yīng)該創(chuàng)建一個(gè)繼承jframe類的子類,然后編寫程序創(chuàng)建該類對象。,程序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()方法實(shí)現(xiàn)。 必須清楚容器使用的布局管理器,否則可能會得不到需要的結(jié)果。,程序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“); ,在框架中添加組件,實(shí)際上jframe對象是由多個(gè)窗格組成的,如圖7.6所示。,在框架中添加組件,jframe對象的中間層是內(nèi)容窗格(content pane),它是一個(gè)容器對象。 用容器的add()方法添加的組件實(shí)際是添加到該內(nèi)容窗格中的。 每個(gè)容器都有一個(gè)布局管理器,它管理著組件在其中的大小、位置等。 內(nèi)容窗格默認(rèn)的布局管理器是borderlayout, 即邊界式布局。 可以使用容器的setlayout()方法改變?nèi)萜鞯牟季止芾砥鳌?7.3 容器布局,1 borderlayout布局管理器 2 flowlayout布局管理器 3 gridlayout布局管理器 4 其他布局管理器 5 面板容器及容器的嵌套 6 應(yīng)用程序外觀,java語言的一個(gè)特點(diǎn)是強(qiáng)調(diào)程序的平臺無關(guān)性。對于圖形用戶界面同樣是這樣。 在java的圖形界面程序中,它是通過為每種容器提供了布局管理器來實(shí)現(xiàn)組件布局的。 所謂布局管理器就是為容器設(shè)置一個(gè)layoutmanager對象(即布局管理器對象),來管理組件在容器中擺放的順序、位置、大小以及當(dāng)窗口大小改變后組件如何變化等特征。,7.3 容器布局,通過使用布局管理器機(jī)制就可以實(shí)現(xiàn)gui的跨平臺性,同時(shí)避免為每個(gè)組件設(shè)置絕對位置。 常用的布局管理器有: flowlayout borderlayout gridlayout cardlayout和gridbaglayout 這些類都是在java.awt包中定義的。,7.3 容器布局,每種容器都有默認(rèn)的布局管理器,也可以為容器指定新的布局管理器。 如果要將某個(gè)容器的布局管理器設(shè)置為新的布局,需要使用構(gòu)造方法創(chuàng)建一個(gè)布局管理器對象,然后使用容器的setlayout()方法將容器設(shè)置為這種布局管理器。,7.3 容器布局,borderlayout:邊界式布局。是swing包中 容器jframe、japplet、jdialog的默認(rèn)布 局管理器。 布局特點(diǎn):將容器分為東西南北中五個(gè)區(qū)域,通常每個(gè)區(qū)域放一個(gè)組件,位置及大小無法控制; 構(gòu)造方法:有兩個(gè) public borderlayout() public borderlayout(int h_gap,int v_gap),1. borderlayout布局管理器,borderlayout的構(gòu)造方法,public borderlayout(int hgap, int vgap) 該構(gòu)造方法創(chuàng)建一個(gè)布局管理器對象,hgap和vgap分別指定使用這種布局時(shí)組件之間的水平間隔和垂直間隔距離,單位為像素。 public borderlayout() 該構(gòu)造方法創(chuàng)建一個(gè)borderlayout布局管理器對象,使用這種布局時(shí)組件之間沒有間隔。,borderlayout布局管理器,borderlayout布局也叫邊界式布局,它將容器分成東、南、西、北、中五個(gè)區(qū)域,每個(gè)區(qū)域可放置一個(gè)組件或其他容器。北占據(jù)容器的上方,東占據(jù)容器的右側(cè),等等。中間區(qū)域是在東、南、西、北都填滿后剩下的區(qū)域。 若要改變?nèi)萜鞯牟季止芾砥黜氄{(diào)用容器的setlayout()方法,它的格式為: public void setlayout(layoutmanager layout),borderlayout布局管理器,使用borderlayout 布局管理器,當(dāng)窗口的大小改變時(shí),容器中的組件大小相應(yīng)改變。當(dāng)窗口垂直延伸時(shí),東、西、中區(qū)域也延伸;而當(dāng)窗口水平延伸時(shí),南、北、中區(qū)域也延伸。 當(dāng)某個(gè)區(qū)域沒有添加組件時(shí),中央組件會占據(jù)無組件的空間,但若沒有中央組件,四周組件都有,中央?yún)^(qū)域空出,請讀者自己修改程序,去掉某個(gè)區(qū)域的組件,觀察程序運(yùn)行效果。,borderlayout布局管理器,向borderlayout布局的容器中添加組件應(yīng)該使用add(component c, int index)方法,c為添加的組件,index為指定的位置。 指定位置需要使用borderlayout類定義的五個(gè)常量: 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(“中“); / 設(shè)置布局管理器 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“); ,程序運(yùn)行結(jié)果如圖所示:,圖7-6 邊界式布局,flowlayout;流式布局,是applet和frame和jpanel 的默認(rèn)布局。 布局特點(diǎn):組件按加入的先后順序依次從左至右,從上至下排列,位置及大小無法控制; 構(gòu)造方法:有三個(gè) 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的默認(rèn)布局。 設(shè)置為這種布局管理器的容器,當(dāng)向其中添加組件時(shí)組件是從左到右,從上到下,一個(gè)一個(gè)地放置到容器中,一行放不下,放到下一行。 采用這種布局管理器的容器,當(dāng)調(diào)整窗口大小后,布局管理器會重新調(diào)整組件的擺放位置,組件的大小和相對位置不變,組件的大小采用最佳尺寸。,flowlayout類常用的構(gòu)造方法,public flowlayout(int align, int hgap, int vgap) 指定添加到容器中組件的對齊方式(align)、水平間距(hgap)和垂直間距(vgap)。 對齊方式align的取值必須為flowlayout定義的整型常量之一: flowlayout.left:表示左對齊 flowlayout.right:右對齊 flowlayout.center:居中對齊 水平間距是指水平方向上兩個(gè)組件之間的距離,單位是像素。 垂直間距是行之間的距離,單位也是像素。,flowlayout類常用的構(gòu)造方法,public flowlayout(int align) 該構(gòu)造方法只指定對齊方式。組件之間的水平間距和垂直間距使用默認(rèn)值5個(gè)像素。 public flowlayout() 使用該構(gòu)造方法構(gòu)造的對象,對齊和間距都采用默認(rèn)值:居中對齊,水平間距和垂直間距是5個(gè)像素。,程序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(“l(fā)ong-named button 4“); add(new jbutton(“button 5“);,settitle(“flowlayout demo“); / 設(shè)置窗口標(biāo)題 setsize(380,150); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) flowlayoutdemo window = new flowlayoutdemo(); ,程序的運(yùn)行結(jié)果如圖所示:,圖7-7 流式布局的應(yīng)用,3. gridlayout布局管理器,也叫網(wǎng)格式布局,將容器分成大小相等的單元格,每個(gè)單元格可放置一個(gè)組件,每個(gè)組件占據(jù)單元格的整個(gè)空間,調(diào)整容器的大小,單元格大小隨之改變。,gridlayout類的構(gòu)造方法,public gridlayout(int rows, int cols, int hgap, int vgap) 參數(shù)rows和cols分別指定網(wǎng)格布局的行數(shù)和列數(shù) hgap和vgap指定組件的水平間隔和垂直間隔,單位為像素。 行和列參數(shù)至少有一個(gè)為非0值。 public gridlayout(int rows, int cols) 缺省組件之間的間隔,組件之間間隔為0像素。 public gridlayout() 創(chuàng)建只有一行的網(wǎng)格布局對象,每個(gè)組件占一列,所有組件在一行,組件之間間隔為0像素。,gridlayout類的構(gòu)造方法,如果指定的行數(shù)和列數(shù)與添加的組件個(gè)數(shù)不一致時(shí) 當(dāng)行數(shù)、列數(shù)都不為零,以行優(yōu)先 若有一個(gè)為零,則以非零值優(yōu)先 例: cp.setlayout(new gridlayout(3,1,10,20); 如果添加的組件多于3個(gè),結(jié)果是3行多列。 cp.setlayout(new gridlayout(3,0,10,20); 如果添加的組件多于3個(gè),結(jié)果是3行多列。 cp.setlayout(new gridlayout(0,3,10,20); 如果添加的組件多于3個(gè),結(jié)果是多行3列。,gridlayout布局管理器,向網(wǎng)格布局的容器中添加組件,只需調(diào)用容器的add()方法即可,不用指定位置,系統(tǒng)按照先行后列的次序依次將組件添加到容器中。,程序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(“l(fā)ong-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布局管理器,程序的運(yùn)行結(jié)果如圖所示:,圖9-8 網(wǎng)格布局的應(yīng)用,4. 其他布局管理器,除上面介紹的布局管理器外,java語言還提供了若干布局管理器,例如: cardlayout、gridbaglayout、boxlayout、grouplayout和springlayout等。 每種布局管理器都有自己的特點(diǎn),應(yīng)用在特殊的場合。其中有些非常復(fù)雜,可應(yīng)用于較復(fù)雜的圖形用戶界面的設(shè)計(jì)中。 如果界面復(fù)雜,可以考慮使用集成開發(fā)環(huán)境(ide)來設(shè)計(jì)用戶界面。,其他布局管理器,在設(shè)計(jì)圖形界面時(shí),java也支持組件絕對定位的設(shè)計(jì)。 如果需要手工控制組件在容器中的大小和位置,應(yīng)該將容器的布局管理器設(shè)置為null,即調(diào)用容器的setlayout()方法,并將參數(shù)指定為null,然后調(diào)用組件的setlocation()方法設(shè)置組件在容器中的位置、調(diào)用setsize()或setbounds()方法設(shè)置組件的大小。 不推薦使用這種方法。,5.取消布局管理器及布置組件的方法,取消布局管理器的目的:不受布局管理器固定格式的限制,使組件可任意大小,擺放在任何位置,增加使用的靈活性。 取消的方法:容器的對象名.setlayout(null); 布置組件的方法: 設(shè)置組件對象擺放位置及大小的方法: 組件對象名.setbounds(new rectangle(x,y,w,h); 或setbounds(x,y,w,h); 再把組件對象添加到容器中: 容器對象名.add(組件對象名) 演示例程:見layoutnull.java,6. 面板容器及容器的嵌套,jpanel類:由于某一種布局管理器的能力有限,在設(shè)計(jì)復(fù)雜布局時(shí)通常采用容器嵌套的方式,即把組件添加到一個(gè)中間容器中,再把中間容器作為組件添加到另一個(gè)容器中,從而實(shí)現(xiàn)復(fù)雜的布局。 jpanel類對象經(jīng)常在構(gòu)造復(fù)雜布局中作為中間容器,既可以把它放入其他容器中,也可以在其上放置其他容器和組件,但它不能單獨(dú)顯示,需要放到j(luò)frame或applet這樣的頂層容器中。 jframe、japplet、jdialog都默認(rèn)有一個(gè)jpanel。,jpanel的構(gòu)造方法,public jpanel(layoutmanager layout) 創(chuàng)建一個(gè)面板對象,使用指定的布局管理器對象layout設(shè)置面板的布局。 public jpanel() 使用缺省的布局管理器創(chuàng)建一個(gè)面板。 面板的缺省的布局管理器是flowlayout。也可以在創(chuàng)建面板對象后重新設(shè)置它的布局,方法也是使用面板對象的setlayout()方法。,jpanel的常用方法,常用方法: void setsize(int w,int h) void setvisible(boolean b) void setlayout(layoutmanager l);進(jìn)行布局管理,面板容器及容器的嵌套,使用面板容器作為中間容器構(gòu)建圖形用戶界面程序的一般思想是: 先將組件添加到面板上,然后將面板作為一個(gè)組件再添加到頂層容器中。 例:設(shè)計(jì)一個(gè)如圖所示的圖形界面,程序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(); / 設(shè)置面板的背景顏色為青色 panel_1.setbackground(color.cyan);,創(chuàng)建兩個(gè)jpanel對象,在一個(gè)jpanel對象上放置三個(gè)按鈕,再將此jpanel對象添加到框架內(nèi)容窗格的南部,將另一個(gè)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及其子類的層次結(jié)構(gòu),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(按鈕組) 復(fù)選框: checkbox 4、jlabel(lable)標(biāo)簽 主要用于顯示字符串,輸出一些信息及提示; 5、文本框 文本框即能輸入又能輸入字符串,而lable只能輸出,有三種文本框: 單行文本框:textfield(jtextfield) 多行文本框:textarea(jtextarea) 口令框: passwordfield 演示例程:testalltext.java,7.4 常用組件簡介,6、列表框,組合框 列表框:jlist(list),下拉式列出選項(xiàng); 組合框:jcombobox(combbox),如同list,但最上面為可編輯區(qū),可進(jìn)行輸入編輯,也可從下拉列表中選項(xiàng)到編輯區(qū); 演示例程:list_combbox.java 7、其它組件 滾動條:slider; 表格:table; 樹:tree; 滾動欄:scollbar; 滾動面板:scollpane; 標(biāo)簽面板:tabbedpane;,7.5 事件處理,現(xiàn)代的圖形用戶界面程序都是事件驅(qū)動的。 通過事件處理才能實(shí)現(xiàn)用戶與程序的交互。 本節(jié)主要介紹java gui程序的事件處理模型:包括 監(jiān)聽器的事件處理模型; 和常見的事件處理方法。 還將介紹java gui編程中常用的組件,包括標(biāo)簽、按鈕、文本框和菜單等,它們是圖形用戶界面程序中最基本的元素。,1 事件處理模型 2 事件類 3 事件監(jiān)聽器 4 事件處理的基本步驟 5 常見的事件處理 6 事件適配器類,7.5 事件處理,1. 事件處理模型,在java 1.1版之前事件處理采用事件傳遞模型。 從java 1.1版開始,java的事件處理采用了新的事件處理模型,稱為事件代理模型。 所謂事件代理模型就是將事件的處理從事件源對象代理給一個(gè)或多個(gè)稱為事件監(jiān)聽器的對象,事件由事件監(jiān)聽器處理。事件代理模型把事件的處理委托給外部實(shí)體進(jìn)行處理,實(shí)現(xiàn)了事件源和監(jiān)聽器分離的機(jī)制。,事件代理模型,涉及三種對象:事件源、事件和事件監(jiān)聽器。 事件源(event source):產(chǎn)生事件的對象,一般來說可以是組件,如按鈕、對話框等。當(dāng)這些對象的狀態(tài)改變時(shí),就會產(chǎn)生事件。事件源可以是可視化組件,也可以是計(jì)時(shí)器等不可視的對象。 事件(event):描述事件源狀態(tài)改變的對象。如按鈕被點(diǎn)擊,就會產(chǎn)生actionevent動作事件。 事件監(jiān)聽器(listener):接收事件并對其進(jìn)行處理的對象。事件監(jiān)聽器對象必須是實(shí)現(xiàn)了相應(yīng)接口的類的對象。,java的事件代理模型,首先在事件源上注冊事件監(jiān)聽器,當(dāng)用戶行為觸發(fā)一個(gè)事件時(shí),運(yùn)行時(shí)系統(tǒng)將創(chuàng)建一個(gè)事件對象,然后尋找事件監(jiān)聽器對象來處理該事件。,圖 gui事件處理模型,2. 事件類,為了實(shí)現(xiàn)事件處理,java定義了大量的事件類,這些類封裝了事件對象。 swing組件可產(chǎn)生多種事件,如點(diǎn)擊按鈕、選擇菜單項(xiàng)會產(chǎn)生動作事件(actionevent),關(guān)閉窗口會產(chǎn)生窗口事件(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類的子類,同時(shí)又是所有組件awt事件類的根類。 該類中定義了getid()方法,它返回事件的類型。 awtevent類的常用的子類定義在java.awt.event包中,其中常用的awt事件類如下圖所示。,圖 常用的awt事件類及層次關(guān)系,2. 事件類,表1 常用事件及產(chǎn)生事件的組件,3. 事件監(jiān)聽器,事件的處理必須由實(shí)現(xiàn)了相應(yīng)的事件監(jiān)聽器接口的類對象處理。 java為每類事件定義了相應(yīng)的接口。 事件類和接口都是在java.awt.event包中定義的。 表2列出了常用的事件監(jiān)聽器接口、接口中定義的方法以及所處理的事件。 接口中定義了一個(gè)或多個(gè)方法,這些方法都是抽象方法,必須由實(shí)現(xiàn)接口的類實(shí)現(xiàn),java程序就是通過這些方法實(shí)現(xiàn)對事件的處理的。,表2 事件監(jiān)聽器接口、方法及處理的事件,表2 事件監(jiān)聽器接口、方法及處理的事件,4. 事件處理的基本步驟, 確定事件源和要處理的事件類型 就是確定要處理哪些組件的什么事件。 實(shí)現(xiàn)相應(yīng)的監(jiān)聽器接口并創(chuàng)建監(jiān)聽器對象 實(shí)現(xiàn)監(jiān)聽器接口可有多種方法: 方法1:用內(nèi)部類(推薦); 方法2:在定義的類中用implements實(shí)現(xiàn); 方法3:用匿名內(nèi)部類實(shí)現(xiàn);,說明: 一個(gè)類可以實(shí)現(xiàn)一個(gè)接口,也可以實(shí)現(xiàn)多個(gè)接口。 實(shí)現(xiàn)監(jiān)聽器接口必須實(shí)現(xiàn)接口中定義的所有方法。實(shí)現(xiàn)接口中定義的方法就是編寫事件處理的代碼。 對于有多個(gè)方法的接口,系統(tǒng)還定義了事件適配器類,可以通過繼承事件適配器類實(shí)現(xiàn)。,4. 事件處理的基本步驟, 為組件注冊監(jiān)聽器 每種組件都定義了可以觸發(fā)的事件類型,使用相應(yīng)的方法為組件注冊監(jiān)聽器。如果程序運(yùn)行過程中,對某事件不需處理,也可以不注冊監(jiān)聽器,甚至注冊了監(jiān)聽器也可以注銷。 /注冊監(jiān)聽器 public void addxxxlistener(xxxlistener l) /注銷監(jiān)聽器 public void removexxxlistener(xxxlistener l),4. 事件處理的基本步驟,說明: 處理事件必須注冊監(jiān)聽器:只有為組件注冊了監(jiān)聽器后,在程序運(yùn)行時(shí),當(dāng)發(fā)生該事件時(shí)才能由監(jiān)聽器對象處理,否則即使發(fā)生了相應(yīng)的事件,事件也不會被處理。 一個(gè)事件源 發(fā)生多種事件由多個(gè)事件監(jiān)聽器處理; 一個(gè)監(jiān)聽器對象處理多個(gè)事件源的同一類型的事件(如下述程序兩個(gè)按鈕可以用一個(gè)監(jiān)聽器對象處理。),4. 事件處理的基本步驟,例:簡單的事件處理程序,例程序7.8 eventdemo.java,功能是:點(diǎn)擊“ok”按鈕時(shí),在文本框中顯示“你點(diǎn)擊了ok按鈕”,點(diǎn)擊“cancel”按鈕時(shí),在文本框中顯示“你點(diǎn)擊了cancel按鈕”。,圖 簡單的事件處理程序,方法1. 通過內(nèi)部類實(shí)現(xiàn)監(jiān)聽器接口,程序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(); /創(chuàng)建一個(gè)監(jiān)聽器對象 btn1.addactionlistener(listener); /為按鈕注冊監(jiān)聽器 btn2.addactionlistener(listener);,setsize(350,100); setlocation(200,200); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); class al implements actionlistener / 內(nèi)部類 public void actionperformed(actionevent e) if(jbutton)e.getsource()=btn1) tf.settext(“你點(diǎn)擊了ok按鈕“); / 修改文本框的內(nèi)容 else if(jbutton)e.getsource()=btn2) tf.settext(“你點(diǎn)擊了cancel按鈕“); public static void main(stringargs) eventdemo frame = new eventdemo(); ,方法1. 通過內(nèi)部類實(shí)現(xiàn)監(jiān)聽器接口,方法2. 通過當(dāng)前類實(shí)現(xiàn)監(jiān)聽器接口,改寫上面的程序用當(dāng)前類對象本身作為監(jiān)聽器對象,需要修改的主要代碼如下:見eventdemo1.java public class eventdemo extends jframe implements actionlistener btn1.addactionlistener(this); /為按鈕注冊監(jiān)聽器 btn2.addactionlistener(this); public void actionpe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論