AWT組件及事件處理.ppt_第1頁(yè)
AWT組件及事件處理.ppt_第2頁(yè)
AWT組件及事件處理.ppt_第3頁(yè)
AWT組件及事件處理.ppt_第4頁(yè)
AWT組件及事件處理.ppt_第5頁(yè)
已閱讀5頁(yè),還剩108頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七講 AWT組件及事件處理,7.1 Java窗口 7.2 文本框 7.3 內(nèi)部類實(shí)例做監(jiān)視器 7.4 按鈕與標(biāo)簽 7.5 菜單項(xiàng) 7.6 文本區(qū) 7.7 面板 7.8 布局,7.9 畫布 7.10 選擇型組件 7.11 Component類的常用方法 7.12 窗口事件 7.13 鼠標(biāo)事件 7.14 焦點(diǎn)事件 7.15 鍵盤事件,教學(xué)目的: 1.掌握?qǐng)D形用戶界面中各種基本組件的屬性及使用方法; 2.掌握?qǐng)D形用戶界面的事件處理機(jī)制。 教學(xué)內(nèi)容: 本講主要介紹Java GUI中各種組件的用法,及相應(yīng)的事件處理機(jī)制。,重點(diǎn): 1各組件的屬性及使用。 2. 事件的處理方法。 難點(diǎn): GUI中的事件處理機(jī)制。,補(bǔ)充知識(shí),一、Java圖形用戶界面 圖形用戶界面(GUI,Graphical User Interface)是為應(yīng)用程序提供一個(gè)圖形化的界面,程序通過GUI與用戶交互,GUI能使一個(gè)應(yīng)用程序具有與眾不同的“外觀”與“感覺”。 二、容器 容器(Container)是組件(Component)的抽象子類,在該類中允許裝入其他的組件,要裝入的組件也可以是容器,在這些窗口中還可以裝入其他的組件,這樣可以創(chuàng)建完整的層次結(jié)構(gòu)。容器有助于在屏幕上布置GUI組件。最常用的容器是Panel和Frame。,補(bǔ)充知識(shí),三、 java.awt中的各個(gè)類,四、圖形組件類的繼承關(guān)系(補(bǔ)充知識(shí)),補(bǔ)充知識(shí),五、窗口類 AWT提供了三個(gè)在屏幕上顯示窗口的組件:Window、Frame和Dialog。這三個(gè)組件都用于顯示窗口,而且相互之間的區(qū)別也不明顯,因此有時(shí)候很難確定到底使用哪個(gè)組件更好。,補(bǔ)充知識(shí),1、窗口(Window) java.awt.Window是三個(gè)窗口組件中最基本的組件,它實(shí)際上是Frame與Dialog組件的超類。窗口組件沒有邊界、標(biāo)題欄與菜單欄,而且大小不可以調(diào)整。 常用窗口實(shí)現(xiàn)的界面包括:產(chǎn)品信息的封面(如Outlook等軟件啟動(dòng)時(shí),顯示在屏幕中間且?guī)酌牒笞詣?dòng)消失的封面窗口),提示幫助信息(如使用金山詞霸等軟件時(shí),移動(dòng)鼠標(biāo)到某個(gè)英文單詞上時(shí)自動(dòng)彈出的解釋信息)等。,補(bǔ)充知識(shí),2、框架(Frame) java.awt.Frame是Window的一個(gè)子類,它是帶有標(biāo)題欄和邊界的窗口,而且允許調(diào)整大小。另外,用戶還可以為框架附加一個(gè)菜單欄。用戶在程序設(shè)計(jì)過程中,當(dāng)程序窗口需要圖表化或者需要包含菜單欄時(shí),則可以選擇使用框架組件。 構(gòu)造一個(gè)框架后,可以用add()方法來給框架添加組件??蚣艿娜笔〔季止芾砥鲗傩允荁orderLayout??梢杂胹etLayout()方式來改變布局管理器屬性。,補(bǔ)充知識(shí),3、對(duì)話框(Dialog) java.awt.Dialog也是Window的擴(kuò)展類。與框架相同的是,對(duì)話框也擁有邊界與標(biāo)題欄,而且也可以調(diào)整大??;而與框架不同的是,對(duì)話框不支持附加菜單欄,而且對(duì)話框可以模式化屬性設(shè)置,這是窗口和框架都不允許的。因此,如果用戶在程序設(shè)計(jì)過程中需要?jiǎng)?chuàng)建一個(gè)臨時(shí)窗口與用戶交換信息時(shí),使用模式對(duì)話框是最方便的。,補(bǔ)充知識(shí),另外,AWT中還提供了Dialog類的一個(gè)常用的擴(kuò)展類FileDialog(文件對(duì)話框)。它可以為用戶選擇一個(gè)待打開或保存的文件。 文件對(duì)話框是文件選擇設(shè)備的一個(gè)實(shí)現(xiàn)。它有自己的自由窗口以及窗口元素,并且允許用戶瀏覽文件系統(tǒng),以及為以后的操作選擇一個(gè)特定的文件。(詳見例程),7.1 Java窗口,Frame類是Container類的間接子類。當(dāng)需要一個(gè)窗口時(shí),可使用Frame或其子類創(chuàng)建一個(gè)對(duì)象。窗口也是一個(gè)容器,可以向窗口添加組件。需要注意的是,窗口默認(rèn)地被系統(tǒng)添加到顯示器屏幕上。因此,不允許將一個(gè)窗口添加到另一個(gè)容器中。,7.1 Java窗口,一、 Frame常用方法 1Frame() 該構(gòu)造方法可以創(chuàng)建一個(gè)無標(biāo)題的窗口,窗口的默認(rèn)布局為BorderLayout布局。 2Frame(String s) 該構(gòu)造方法可以創(chuàng)建一個(gè)標(biāo)題為s的窗口,窗口的默認(rèn)布局為BorderLayout布局。 3public void setBounds(int a,int b,int width,int height) 窗口調(diào)用該方法可以設(shè)置出現(xiàn)在屏幕上時(shí)的初始位置是(a,b),即距屏幕左面a個(gè)像素、距屏幕上方b個(gè)像素;窗口的寬是width,高是height。,7.1 Java窗口,4public void setSize(int width,int height) 設(shè)置窗口的大小,窗口在屏幕出現(xiàn)是默認(rèn)位置是(0,0)。 5public void setVisible(boolean b) 設(shè)置窗口是可見還是不可見,窗口默認(rèn)是不可見的。 6public void setResizable(boolean b) 設(shè)置窗口是否可調(diào)整大小,窗口默認(rèn)是可調(diào)整大小的。,7.1 Java窗口,二、菜單條、菜單、菜單項(xiàng) java.awt包中的Menubar類是負(fù)責(zé)創(chuàng)建菜單條的,即Menubar的一個(gè)實(shí)例就是一個(gè)菜單條。Frame類有一個(gè)將菜單條放置到窗口中的方法:setMenuBar(MenuBar bar); java.awt包中的Menu類是負(fù)責(zé)創(chuàng)建菜單的,即Menu的一個(gè)實(shí)例就是一個(gè)菜單 java.awt包的MunuItem類負(fù)責(zé)創(chuàng)建菜單項(xiàng),即MenuItem的一個(gè)實(shí)例就是一個(gè)菜單項(xiàng)。,例7.1,import java.awt.*; class FirstWindow extends Frame MenuBar menubar=new MenuBar(); Menu menu; MenuItem item1, item2; setBounds(0,0,dim.width,dim.heigth/2); setTitle(s); item2=new MenuItem(“打開”); setMenuBar(menubar); public class Example7_1,7.2文本框,Java.awt包中的TextField類是專門用來建立文本框的,用戶可以在文本框中輸入單行文本。,7.2文本框,.TextField類的主要方法 1)TextField(int x) 如果使用這個(gè)構(gòu)造方法創(chuàng)建文本框?qū)ο?,文本框中的可見字符序列的長(zhǎng)度為 x個(gè)機(jī)器字符長(zhǎng)。文本框是可編輯的,用戶可以在文本框中輸入若干個(gè)字符。 2)TextField(String s ) 如果使用這個(gè)構(gòu)造方法創(chuàng)建文本框?qū)ο?,則文本框的初始字符串為s。文本框是可編輯的,可以在文本框中輸入若干個(gè)字符。 3)public void setText(String s) 文本框?qū)ο笳{(diào)用該方法可以設(shè)置文本框中的文本為參數(shù)s指定的文本,文本框中先前的文本將被清除。,7.2文本框,4)public String getText() 文本框?qū)ο笳{(diào)用該方法可以獲取文本框中的文本。 5)public void addActionListener (ActionListener l)文本框?qū)ο笳{(diào)用該方法可以向文本框增加動(dòng)作監(jiān)視器(將監(jiān)視器注冊(cè)到文本框)。,7.2文本框,2.文本框上的ActionEvent事件 學(xué)習(xí)組件除了了解組件的屬性和功能外,一個(gè)更重要的方面是學(xué)習(xí)怎樣處理組件上發(fā)生的界面事件。 在學(xué)習(xí)處理事件時(shí),必須很好地掌握事件源、監(jiān)視器、處理事件的接口這三個(gè)概念。 通過處理文本框這個(gè)具體的組件上的事件,來掌握處理事件的基本原理。,例7.2,class WindowText extends Frame TextFiled text1=new TextFiled(“輸入密碼:”,10); text1.setEditable(false); super(s); setLayout(new FlowLayout(); text2.setEchochar(*); ,7.2文本框,3、Java的事件處理模式 1)事件源:能夠產(chǎn)生事件的對(duì)象都可以成為事件源,如文本框、按鈕、下拉式列表等。也就是說,事件源必須是一個(gè)對(duì)象,而且這個(gè)對(duì)象必須是Java認(rèn)為能夠發(fā)生事件的對(duì)象。 2)監(jiān)視器:需要一個(gè)對(duì)象對(duì)事件源進(jìn)行監(jiān)視,以便對(duì)發(fā)生的事件作出處理。事件源通過調(diào)用相應(yīng)的方法將某個(gè)對(duì)象作為自己的監(jiān)視器。例如,對(duì)于文本框,這個(gè)方法是: addActionListener(監(jiān)視器); 創(chuàng)建該監(jiān)視器對(duì)象的類必須聲明實(shí)現(xiàn)相應(yīng)的接口 ,一個(gè)監(jiān)聽器對(duì)象是一個(gè)實(shí)現(xiàn)了專門的監(jiān)聽器接口的類的實(shí)例。,7.2文本框,3)處理事件的接口:在文本框獲得輸入焦點(diǎn)之后,如果用戶按回鍵,Java運(yùn)行系統(tǒng)就自動(dòng)用ActionEvent類創(chuàng)建了一個(gè)對(duì)象,即發(fā)生了ActionEvent事件 當(dāng)事件源發(fā)生事件時(shí),監(jiān)視器就自動(dòng)調(diào)用執(zhí)行被類實(shí)現(xiàn)的某個(gè)接口方法。 4)Event handlers(事件處理器):接收事件對(duì)象、解釋事件對(duì)象并處理用戶交互的方法。,處理事件示意圖,7.2文本框,4、引入事件處理機(jī)制后的編程基本方法如下: 對(duì)java.awt中組件實(shí)現(xiàn)事件處理必須使用java.awt.event包,所以在程序開始應(yīng)加入import java.awt.event.*語句。 用如下語句設(shè)置事件監(jiān)聽者: 事件源.addXXListener(XXListener代表某種事件監(jiān)聽者)。,7.2文本框, 事件監(jiān)聽者所對(duì)應(yīng)的類實(shí)現(xiàn)事件所對(duì)應(yīng)的接口XXListener,并重寫接口中的全部方法。這樣就可以處理圖形用戶界面中的對(duì)應(yīng)事件了。要?jiǎng)h除事件監(jiān)聽者可以使用語句: 事件源.removeXXListener; (詳見課本例子例7.3),例7.3,import java.awt.*; import java.awt.event.*; class MyWindow extends Frame implements ActionListener text1.addActionListener(this); text2.addActionListener(this); public void actionPerformed(ActionEvent e) if(e.getSource()=text1) String word=text1.getText(); else if(e.getSource()=text2) ,補(bǔ)充: Java常用事件 _列表,7.3內(nèi)部類實(shí)例做監(jiān)視器,內(nèi)部類實(shí)例做監(jiān)視器的本質(zhì)就是:用內(nèi)部類實(shí)現(xiàn)了相應(yīng)的接口,使用其定義的對(duì)象做監(jiān)視器。(詳見課本例7.5),例7.5,text1.addActionListener(police); /內(nèi)部類的實(shí)例做監(jiān)視器 text1.addActionListener(new ActionListener() /和接口有關(guān)的匿名類的實(shí)例做監(jiān)視器 public void actionPerformed(ActionEvent e) String number=e.getActionCommand(); int n=Integer.parseInt(number); int m=n*n; text2.setText(n+“的平方是:“+m); );,7.4按鈕與標(biāo)簽,1、標(biāo)簽組件 標(biāo)簽的功能是只顯示文本,不能動(dòng)態(tài)地編輯 文本。Lalel類的實(shí)例就是一個(gè)標(biāo)簽。 標(biāo)簽使用Label類來創(chuàng)建,而Label類是從 Component類直接擴(kuò)展而來的。Label類的構(gòu)造 函數(shù)及常用方法 如圖所示。,7.4按鈕與標(biāo)簽,7.4按鈕與標(biāo)簽,2、按鈕組件 Java.awt包中的Button類是專門用來建立按鈕的。而Button類是由Component類直接擴(kuò)展的,即Button類創(chuàng)建的一個(gè)對(duì)象就是一個(gè)按鈕。要想使Button可見,必須使用add方法將它們添加到一個(gè)容器中。 Button類的構(gòu)造函數(shù)及常用方法如圖所示。,7.4按鈕與標(biāo)簽,7.4按鈕與標(biāo)簽,3、按鈕的ActionEvent事件 按鈕可以發(fā)生ActionEvent事件,當(dāng)按鈕獲得監(jiān)視器之后,用鼠標(biāo)單擊按鈕,就發(fā)生ActionEven事件。,例7.6,Label 提示條; TextField 輸入框; Button buttonGetNumber,buttonEnter; 提示條=new Label(“輸入你的猜測(cè): “, Label.CENTER); 提示條.setBackground(Color.cyan); buttonGetNumber=new Button(“得到一個(gè)隨機(jī)數(shù)“); buttonEnter.addActionListener(this); buttonGetNumber.addActionListener(this);,7.5菜單項(xiàng),菜單及其相關(guān)的類在java.awt軟件包中的 層次關(guān)系如下:,7.5菜單項(xiàng),MenuBar類用于創(chuàng)建菜單欄,菜單欄是菜單的容器。 Menu類用于創(chuàng)建菜單,菜單中包含若干菜單項(xiàng),并將其添加到菜單欄上。當(dāng)使用鼠標(biāo)點(diǎn)擊一個(gè)菜單時(shí),就將展開該菜單,并顯示一列菜單項(xiàng)。 MenuItem類用于創(chuàng)建菜單項(xiàng)。一個(gè)菜單項(xiàng)就是包含在菜單中的一個(gè)字符串,當(dāng)選中它時(shí)將會(huì)執(zhí)行一個(gè)動(dòng)作。,7.5菜單項(xiàng),CheckboxMenuItem類用于創(chuàng)建復(fù)選框菜單。復(fù)選框菜單項(xiàng)就是帶有選擇標(biāo)記的菜單項(xiàng)。當(dāng)選中復(fù)選框菜單項(xiàng)時(shí),在該菜單項(xiàng)左邊出現(xiàn)一個(gè)選擇標(biāo)記。如果再次選中該項(xiàng),則該選項(xiàng)左邊的選擇標(biāo)記就會(huì)消失。 (見補(bǔ)充例程MenuDemo , pop MenuDemo ),7.5菜單項(xiàng),當(dāng)單擊某個(gè)菜單項(xiàng)時(shí)可以發(fā)生ActionEvent事件,因此,我們可以通過處理ActionEvent事件實(shí)現(xiàn)我們想要進(jìn)行的操作。 另外,可以使用MenuShotcut類為菜單項(xiàng)設(shè)置快捷鍵,該類的一個(gè)構(gòu)造方法是: MenuShotcut (int key); 其中key可以取值:KeyEvent.VK_A KeyEvent.VK_Z; 菜單項(xiàng)使用setShortcut(MenuShortcut k)方法來設(shè)置快捷鍵。,例7.8,menubar=new MenuBar(); menu=new Menu(“文件“); itemExit=new MenuItem(“退出“); itemExit.setShortcut(new MenuShortcut(KeyEvent.VK_E); menu.add(itemExit); menubar.add(menu); itemExit.addActionListener(this);,7.6文本區(qū),java.awt包中的類TextArea類是專門用來建立文本區(qū)的,即TextArea創(chuàng)建的一個(gè)對(duì)象稱做一個(gè)文本區(qū)。用戶可以在文本區(qū)輸入多行的文本。,7.6文本區(qū),1. TextArea類主要方法 1)TextArea(int x,int y) 使用這個(gè)構(gòu)造方法創(chuàng)建文本區(qū)對(duì)象,文本框可見行數(shù)和列數(shù)數(shù)分別為x和y。文本區(qū)有水平和垂直滾動(dòng)條。 2)public void setText(String s) 文本區(qū)對(duì)象調(diào)用該方法可以將文本區(qū)中的文本設(shè)置為參數(shù)s指定的文本,文本區(qū)中先前的文本將被清除。,7.6文本區(qū),3)public String getText() 文本區(qū)對(duì)象調(diào)用該方法可以獲取文本區(qū)中的文本。 4)public void append(String s) 文本區(qū)對(duì)象調(diào)用該方法可以在文本區(qū)中尾加文本。 5)addTextListener(TextListener) 文本區(qū)對(duì)象調(diào)用該方法可以向文本框增加文本監(jiān)視器。,7.6文本區(qū),.文本區(qū)上的TextEvent事件 1)對(duì)于文本區(qū)事件源,可以發(fā)生TextEvent事件。當(dāng)文本區(qū)獲得監(jiān)視器之后,在文本區(qū)域中改變文本的內(nèi)容,如鍵入字符、刪除字符時(shí),TextEvent類將自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。 2)發(fā)生TextEvent事件的事件源獲得監(jiān)視器的方法是addTextListener(監(jiān)視器),由于文本區(qū)可以發(fā)生TextEvent事件,所以TextArea類提供了addTextListener方法。,7.6文本區(qū),3)處理發(fā)生TextEvent 事件的接口是TextListener,該接口中只有一個(gè)的方法: textValueChanged (TextEvent e); 4)創(chuàng)建文本區(qū)監(jiān)視器的類必須要實(shí)現(xiàn)TextListener接口。當(dāng)文本區(qū)發(fā)生TextEvent事件時(shí),監(jiān)視器將自動(dòng)調(diào)用方法: textValueChanged (TextEvent e) 對(duì)發(fā)生的事件作出處理。,例7.9,class WindowTextArea extends Frame implements TextListener,ActionListener TextArea text1,text2; text1=new TextArea(6,15); text2=new TextArea(6,15); text2.setEditable(false); text1.addTextListener(this); buttonClear.addActionListener(this); public void textValueChanged(TextEvent e) public void actionPerformed(ActionEvent e) ,public void textValueChanged(TextEvent e) String s=text1.getText(); StringTokenizer fenxi=new StringTokenizer(s,“ ,n“); int n=fenxi.countTokens(); String a=new Stringn; for(int i=0;i=n-1;i+) String temp=fenxi.nextToken(); ai=temp; Arrays.sort(a); text2.setText(null); for(int i=0;in;i+) text2.append(ai+“n“); ,7.7面板,1、Panel類 java.awt包的Panel類是Container(容器)的子類,因此Panel類及其子類的實(shí)例也是一個(gè)容器,Panel型容器的默認(rèn)布局是FlowLayout型布局。Panel類創(chuàng)建的對(duì)象稱做面板,我們經(jīng)常在一個(gè)面板里添加若干個(gè)組件后,再把面板放到另一個(gè)容器里。,例7.10,class Mypanel extends Panel implements ActionListener setBackground(Color.pink); backColor=getBackground(); button1.addActionListener(this); button2.addActionListener(this); class WindowPanel extends Frame implements ActionListener panel1=new Mypanel(); panel2=new Mypanel(); button.addActionListener(this);,7.7面板,2、ScrollPane類 java.awt包中的ScrollPane類也是Container類的子類,因此該類創(chuàng)建的對(duì)象也是一個(gè)容器,稱為滾動(dòng)面板。我們可以把一個(gè)組件放到一個(gè)滾動(dòng)面板中,然后通過滾動(dòng)條來觀察這個(gè)組件。與Panel創(chuàng)建的容器所不同的是,ScrollPane帶有滾動(dòng)條,而且只能向滾動(dòng)面板添加一個(gè)組件。,7.7面板,滾動(dòng)面板(ScrollPane)實(shí)現(xiàn)了為單一組件提供水平方向或者/和豎直方向的滾動(dòng)條。滾動(dòng)條的顯示方式可以設(shè)置成三種模式:需要的時(shí)候才顯示(SCROLLBARS_AS_NEEDED(默認(rèn)),只有當(dāng)滾動(dòng)面板需要的時(shí)候才創(chuàng)建并顯示滾動(dòng)條)、總是顯示(SCROLLBARS_ALWAYS,滾動(dòng)面板總是創(chuàng)建并顯示滾動(dòng)條)和決不顯示(SCROLLBARS_NEVER,滾動(dòng)面板決不創(chuàng)建和顯示滾動(dòng)條)。 ScrollPane類的構(gòu)造函數(shù)如下:,7.7面板,例7.11,Panel p; ScrollPane scrollpane; p=new Panel(); scrollpane=new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); scrollpane.add(p); add(scrollpane);,7.8布局,布局管理器會(huì)依據(jù)組件的加入順序決定其擺放方式。組件的大小、形狀、位置,在不同的布局管理器下有顯著的不同。此外,布局管理器會(huì)自動(dòng)適應(yīng)小程序或應(yīng)用程序窗口的大小,所以如果某個(gè)窗口的大小改變了,那么其上各個(gè)組件的大小、形狀、位置都有可能發(fā)生改變。,7.8布局,Java提供以下幾種布局管理器:流布局(Fl-owLayout)、邊界布局(BorderLayout)、網(wǎng)格布局(GridLayout)、網(wǎng)格包布局(GridBagLayout)、卡片布局(CardLayout)和手工布局。 Panel、Applet的默認(rèn)布局為流布局, Window、Frame的默認(rèn)布局為邊界布局。容器可以使用方法:setLayout(布局對(duì)象);來設(shè)置自己的布局。,7.8布局,1、FlowLayout布局 FlowLayout類創(chuàng)建的對(duì)象稱做FlowLayout型布局。FlowLayout型布局是Panel型容器的默認(rèn)布局,即Panel及其子類創(chuàng)建的容器對(duì)象,如果不專門為其指定布局,則它們的布局就是FlowLayout型布局。 如果一個(gè)容器使用這個(gè)FlowLayout型布局,組件按照加入的先后順序從左向右排列,一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列。,7.8布局,7.8布局,例7.12,FlowLayout flow=new FlowLayout(); flow.setAlignment(FlowLayout.LEFT); flow.setHgap(2); flow.setVgap(8); setLayout(flow);,7.8布局,2、BorderLayout布局 BorderLayout 布局是Window型容器的默認(rèn)布局,例如Frame、Dialog都是Window類的子類,它們的默認(rèn)布局都是BorderLayout 布局。 如果一個(gè)容器使用這種布局,那么容器空間簡(jiǎn)單地劃分為東、西、南、北、中五個(gè)區(qū)域,中間的區(qū)域最大。,7.8布局,注意:在邊界布局下add方法的使用方法: add(Component c, int position);,7.8布局,其中參數(shù)position可取以下常量之一:BorderLayout.NORTH,BorderLayout.SOUTH,BorderLayout.EAST,BorderLayout.WEST,BorderLayout.CENTER。 例如:下面語句將按鈕eastButton放置在東區(qū): add(eastButton, BorderLayout.EAST); 由于組件放置的位置必須由參數(shù)指定,因此可按任何順序向容器添加組件。,例7.12,Frame win=new Frame(“窗體“); win.add(bNorth,BorderLayout.NORTH); win.add(bSouth,BorderLayout.SOUTH); win.add(bEast,BorderLayout.EAST); win.add(bWest,BorderLayout.WEST); win.add(bCenter,BorderLayout.CENTER);,7.8布局,3、CardLayout 布局 使用CardLayout 的容器可以容納多個(gè)組件,但是實(shí)際上同一時(shí)刻容器只能從這些組件中選出一個(gè)來顯示,就像一疊“撲克牌”每次只能顯示最上面一張一樣,這個(gè)被顯示的組件將占據(jù)所有的容器空間,依次排序。,例7.14,CardLayout mycard; mycard=new CardLayout(); pCenter=new Panel(); pCenter.setLayout(mycard); mycard.first(pCenter); mycard.next(pCenter); mycard.last(pCenter);,7.8布局,4、GridLayout布局 網(wǎng)格布局將容器劃分成網(wǎng)格,這樣各個(gè)組件就可以按行列放置到每個(gè)網(wǎng)格中,每個(gè)組件的大小一樣(均分)。在向GridLayout添加組件時(shí),其順序是從網(wǎng)格的左上角開始,從左向右排列,直到排滿一行,再?gòu)南乱恍虚_始從左向右依次排列。GridLayout類的構(gòu)造函數(shù)如下:,7.8布局,7.8布局,GridLayout的布局策略是把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來的小格中。GridLayout比較靈活,劃分多少網(wǎng)格由程序自由控制,而且組件定位也比較精確 由于GridLayout布局中每個(gè)網(wǎng)格都是相同大小并且強(qiáng)制組件與網(wǎng)格的大小相同,使得容器中的每個(gè)組件也都是相同的大小,顯得很不自然。為了克服這個(gè)缺點(diǎn),你可以使用容器嵌套。,例7.15,GridLayout grid; grid=new GridLayout(12,12); setLayout(grid); Label label=new Label1212; labelij.setBackground(Color.black);,7.8布局,5、BoxLayout布局 盒式布局的容器將組件排列在一行或一列,這取決于創(chuàng)建盒式布局對(duì)象時(shí),是否指定了是行排列還是列排列。 使用行(列)型盒式布局的容器將組件排列在一行(列),組件按加入的先后順序從左(上)向右(下)排列,容器的兩端是剩余的空間。和FlowLayou布局不同的是,使用行型盒式布局的容器只有一行(列),即使組件再多,也不會(huì)延伸到下一行(列),這些組件可能會(huì)被縮小大小,緊縮在這一行(列)中。,例7.16,import javax.swing.border.*; Box baseBox ,boxV1,boxV2; boxV1=Box.createVerticalBox(); boxV1.add(new Label(“姓名“); boxV1.add(Box.createVerticalStrut(8); baseBox=Box.createHorizontalBox(); baseBox.add(boxV1); baseBox.add(Box.createHorizontalStrut(10); baseBox.add(boxV2);,7.9畫布,java.awt包中的類Canvas負(fù)責(zé)創(chuàng)建畫布對(duì)象。創(chuàng)建畫布對(duì)象的常用辦法是用Canvas的子類來創(chuàng)建畫布對(duì)象,并在子類中重寫父類的public void paint(Graphics g)方法。該方法是Component類的一個(gè)方法,可以在其子類中重寫這個(gè)方法,當(dāng)重寫這個(gè)方法時(shí),參數(shù)g是自動(dòng)實(shí)例化的,這樣我們就可以在子類中使用 g調(diào)用相應(yīng)方法,比如畫串、畫圖形、圖像等。,例7.18,class Mycanvas extends Canvas public void paint(Graphics g) g.drawOval(x,y,2*r,2*r); Mycanvas canvas; canvas=new Mycanvas(); canvas.repaint();,7.10選擇型組件,1、選擇框 選擇框提供兩種狀態(tài),一種是選中,另一種是未選中。java.awt包中的Checkbox用來建立選擇框,即Checkbox創(chuàng)建的一個(gè)對(duì)象就是一個(gè)選擇框。 1) Checkbox類的常用方法,7.10選擇型組件,7.10選擇型組件,2)選擇框上的ItemEvent事件 選擇框可以發(fā)生ItemEvent事件,發(fā)生ItemEvent事件的事件源獲得監(jiān)視器的方法是:addItemListener(監(jiān)視器)。 創(chuàng)建監(jiān)視器的類必須實(shí)現(xiàn)ItemListener接口,該接口中只有一個(gè)的方法。當(dāng)在選擇框發(fā)生ItemEvent事件時(shí),監(jiān)視器將自動(dòng)調(diào)用接口方法: ItemStateChanged(ItemEvent e) 對(duì)發(fā)生的事件作出處理。,例7.19,class Mypanel1 extends Panel implements ItemListener Checkbox box1,box2,box3; CheckboxGroup sex; sex=new CheckboxGroup(); box1=new Checkbox(“男“,true,sex); box2=new Checkbox(“女“,false,sex); box1.addItemListener(this); box2.addItemListener(this);,public void itemStateChanged(ItemEvent e) Checkbox box=(Checkbox)e.getSource(); if(box.getState() int n=text.getCaretPosition(); text.insert(box.getLabel(),n); ,7.10選擇型組件,2、下拉列表 下拉列表框由Choice類創(chuàng)建,它只能從列表中選擇一個(gè)選項(xiàng),當(dāng)用戶單擊旁邊下拉箭頭按鈕時(shí),選項(xiàng)列表打開。 下拉式列表可以發(fā)生ItemEvent事件。當(dāng)下拉式列表獲得監(jiān)視器之后,用戶在下拉列表選項(xiàng)列表中選中某個(gè)選項(xiàng)時(shí)就發(fā)生ItemEvent事件。,例7.20,Choice choice; choice=new Choice(); choice.add(“音樂天地“); choice.add(“武術(shù)天地“); choice.addItemListener(this); add.addActionListener(this); text.addActionListener(this); del.addActionListener(this);,public void itemStateChanged(ItemEvent e) String name=choice.getSelectedItem(); int index=choice.getSelectedIndex(); area.setText(“n“+index+“:“+name); String name=text.getText(); choice.add(name); choice.select(name); area.append(“n列表添加:“+name);,7.10選擇型組件,3、滾動(dòng)列表 滾動(dòng)列表框由List類創(chuàng)建,用于顯示一系列的選項(xiàng),用戶可以從中選擇一個(gè)或多個(gè)選項(xiàng)。 滾動(dòng)列表和下拉列表的另一不同之處是,滾動(dòng)列表除了可以發(fā)生ItemEvent事件外,還可以發(fā)生ActionEvent事件。當(dāng)用鼠標(biāo)單擊滾動(dòng)列表的某個(gè)選項(xiàng)后,發(fā)生ItemEvent事件;當(dāng)用鼠標(biāo)雙擊某個(gè)選項(xiàng)后,發(fā)生ActionEvent事件。,7.11 Component類的常用方法,Component類是所有組件的父類,這一節(jié)介紹 Component類的常用方法 。 1、組件的顏色 public void setBackground(Color c) 設(shè)置組件的背景色。 public void setForeground(Color c) 設(shè)置組件的前景色。 public Color getBackground() 獲取組件的背景色。 public Color getForeground() 獲取組件的前景色。,7.11 Component類的常用方法,2、組件的字體 public void setFont(Font f) 組件調(diào)用該方法設(shè)置組件上的字體。例如,文本組件調(diào)用該方法可以設(shè)置文本組件中的字體。 public Font getFont() 組件調(diào)用該方法獲取組件上的字體。,7.11 Component類的常用方法,3、組件的大小與位置 public void setSize(int width,int height) 組件調(diào)用該方法設(shè)置組件的大小,參數(shù)width指定組件的寬度,height指定組件的高度。 public void setLocation(int x,int y) 組件調(diào)用該方法設(shè)置組件在容器中的位置,包含該組件的容器都有默認(rèn)的坐標(biāo)系,容器的坐標(biāo)系的左上角的坐標(biāo)是(0,0),參數(shù)x,y指定該組件的左上角在容器的坐標(biāo)系中的坐標(biāo),即組件距容器的左邊界 x個(gè)像素,距容器的上邊界 y 個(gè)像素。 public Dimension getSize() 組件調(diào)用該方法返回一個(gè)Dimension對(duì)象的引用,該對(duì)像實(shí)體中含有名字是width 和height的成員變量,方法返回的Dimension 對(duì)象的width的值就是組件的寬度、height的值就是當(dāng)前組件的高度。,7.11 Component類的常用方法,public Point getLocation() 組件調(diào)用該方法返回一個(gè)Point對(duì)象的引用,該對(duì)像實(shí)體中含有名字是x 和y的成員變量,方法返回的Point對(duì)象的x,y的值就是組件的左上角在容器的坐標(biāo)系中的x坐標(biāo)和y坐標(biāo)。 public void setBounds(int x,int y,int width,int height) 組件調(diào)用該方法設(shè)置組件在容器中的位置和組件的大小。該方法相當(dāng)于setSize方法和setLocation方法的組合。 public Rectangle getBounds() 組件調(diào)用該方法返回一個(gè)Rectangle對(duì)象的引用,該對(duì)象實(shí)體中含有名字是x、y、width 和height的成員變量,方法返回的Rectangle對(duì)象的x,y的值就是組件的左上角在容器的坐標(biāo)系中的x坐標(biāo)和y坐標(biāo),width和height的值就是當(dāng)前組件的寬度和高度。,7.11 Component類的常用方法,4、組件的激活與可見性 public void setEnabled(boolean b) 組件調(diào)用該方法可以設(shè)置組件是否可被激活,當(dāng)參數(shù)b取值true時(shí),組件可以被激活,當(dāng)參數(shù)b取值false 時(shí),組件不可激活。默認(rèn)情況下,組件是可以被激活的。 public void setVisible(boolean) 設(shè)置組件在該容器中的可見性,當(dāng)參數(shù)b取值true時(shí),組件在容器中可見,當(dāng)參數(shù)b取值false 時(shí),組件在容器中不可見。除了Window型組件外,其它類型組件默認(rèn)是可見的。,7.11 Component類的常用方法,5、組件上的光標(biāo) public void setCursor(Cursor c) 設(shè)置鼠標(biāo)指向組件時(shí)的光標(biāo)形狀。 可以使用 Cursor類的類方法直接獲得一個(gè)光標(biāo)對(duì)象,例如: Cursor c=Cursor. getPredefinedCursor (Cursor.HAND_CURSOR);,7.11 Component類的常用方法,6、paint方法與repaint方法 調(diào)用repaint()方法時(shí),repaint()方法會(huì)再去調(diào)用update(Graphics g)方法。update(Graphics g)方法也是Component類中的一個(gè)方法,這個(gè)方法的功能是:清除paint()方法以前所畫的內(nèi)容,然后再調(diào)用paint方法。因此我們可以在子類中重寫update方法(即隱藏父類的方法),根據(jù)需要來清除哪些部分或保留哪些部分。,7.12窗口事件,Frame是Window的子類,凡是 Window子類創(chuàng)建的對(duì)象都可以發(fā)生WindowEvent類型事件,即窗口事件。 當(dāng)一個(gè)Frame窗口被激活、撤消激活、打開、關(guān)閉、圖標(biāo)化或撤消圖標(biāo)化時(shí),就引發(fā)了窗口事件,即WindowEvent創(chuàng)建一個(gè)窗口事件對(duì)象。WindowEvent創(chuàng)建的事件對(duì)象調(diào)用getWindow()方法可以獲取發(fā)生窗口事件的窗口。窗口使用addWindowlistener方法獲得監(jiān)視器,創(chuàng)建監(jiān)視器對(duì)象的類必須實(shí)現(xiàn)WindowListener接口,該接口中有7個(gè)不同的方法。,7.12窗口事件,1、WindowListener接口中的方法 public void windowActivated(WindowEvent e) 當(dāng)窗口從非激活狀態(tài)到激活時(shí),窗口的監(jiān)視器調(diào)用該方法。 public void windowDeactivated(WindowEvent e) 當(dāng)窗口激活狀態(tài)到非激活狀態(tài)時(shí),窗口的監(jiān)視器調(diào)用該方法。 public void windowClosing(WindowEvent e) 當(dāng)窗口正在被關(guān)閉時(shí),窗口的監(jiān)視器調(diào)用該方法。,7.12窗口事件,public void windowClosed(WindowEvent e) 當(dāng)窗口關(guān)閉后,窗口的監(jiān)視器調(diào)用該方法。 public void windowIconified(WindowEvent e) 當(dāng)窗口圖標(biāo)化時(shí),窗口的監(jiān)視器調(diào)用該方法。 public void windowDeiconified(WindowEvent e) 當(dāng)窗口撤消圖標(biāo)化時(shí),窗口的監(jiān)視器調(diào)用該方法。 public void windowOpened(WindowEvent e) 當(dāng)窗口打開時(shí),窗口的監(jiān)視器調(diào)用該方法。,例7.25,class MyFrame extends Frame implements WindowListener addWindowListener(this);,7.12窗口事件,2、WindowAdapter適配器 為了方便,Java為那些聲明了多個(gè)方法的Listener接口提供了一個(gè)對(duì)應(yīng)的適配器(Adapter)類,在該類中實(shí)現(xiàn)了對(duì)應(yīng)接口的所有方法,只是方法體為空。 在創(chuàng)建新類時(shí),可以不實(shí)現(xiàn)接口,而是只繼承某個(gè)適當(dāng)?shù)倪m配器,并且僅覆蓋所關(guān)心的事件處理方法即可。 接口及對(duì)應(yīng)的適配器類 如下所示:,7.12窗口事件,例7.26,class MyFrame extends Frame Boy police; addWindowListener(police); class Boy extends WindowAdapter,7.13鼠標(biāo)事件,任何組件上都可以發(fā)生鼠標(biāo)事件,如:鼠標(biāo)進(jìn)入組件、退出組件、在組件上方單擊鼠標(biāo)、拖動(dòng)鼠標(biāo)等都觸發(fā)組件發(fā)生鼠標(biāo)事件,也就是說,組件可以成為發(fā)生鼠標(biāo)事件的事件源。 1、MouseListener接口,7.13鼠標(biāo)事件,使用MouseListener接口可以處理5種操作觸發(fā)的鼠標(biāo)事件: (1)在事件源上按下鼠標(biāo)鍵。 (2)在事件源上釋放鼠標(biāo)鍵。 (3)在事件源上擊鼠標(biāo)鍵。 (4)鼠標(biāo)進(jìn)入事件源。 (5)鼠標(biāo)退出事件源。 鼠標(biāo)事件的類型是MouseEvent,即當(dāng)發(fā)生鼠標(biāo)事件時(shí),MouseEvent類自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。,7.13鼠標(biāo)事件,2、MouseListener接口中的方法: (1)mousePressed(MouseEvent) 負(fù)責(zé)處理在組件上按下鼠標(biāo)觸發(fā)的鼠標(biāo)事件,當(dāng)在組件上按下鼠標(biāo)時(shí),監(jiān)視器將自動(dòng)調(diào)用接口中的這個(gè)方法對(duì)事件作出處理。 (2)mouseReleased(MouseEvent) 負(fù)責(zé)處理在組件上釋放鼠標(biāo)觸發(fā)的鼠標(biāo)事件,當(dāng)在組件上釋放鼠標(biāo)時(shí),監(jiān)視器將自動(dòng)調(diào)用接口中的這個(gè)方法對(duì)事件作出處理。,7.13鼠標(biāo)事件,(3)mouseEntered(MouseEvent) 負(fù)責(zé)處理鼠進(jìn)入組件觸發(fā)的鼠標(biāo)事件,當(dāng)鼠標(biāo)進(jìn)入組件上方時(shí),監(jiān)視器將自動(dòng)調(diào)用接口中的這個(gè)方法對(duì)事件作出處理。 (4)mouseExited(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)離開組件觸發(fā)的鼠標(biāo)事件,當(dāng)鼠標(biāo)離開組件時(shí),監(jiān)視器自動(dòng)調(diào)用接口中的這個(gè)方法對(duì)事件作出處理。 (5)mouseClicked(MouseEvent) 負(fù)責(zé)處理在組件上單擊或連擊鼠標(biāo)觸發(fā)的鼠標(biāo)事件,當(dāng)單擊或連擊鼠標(biāo)時(shí),監(jiān)視器自動(dòng)調(diào)用接口中的這個(gè)方法對(duì)事件作出處理。,例7.29,class MyCanvas extends Canvas implements MouseListener MyCanvas() setBackground(Color.cyan) ; addMouseListener(this); if(e.getModifiers()=InputEvent.BUTTON1_MASK) if(e.getModifiers()=InputEvent.BUTTON3_MASK),public class Example7_29 public static void main(String args) Frame f=new Frame(); f.set

溫馨提示

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

評(píng)論

0/150

提交評(píng)論