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

下載本文檔

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

文檔簡(jiǎn)介

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論