已閱讀5頁,還剩108頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第七講 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ū)ο?,文本框中的可見字符序列的長度為 x個(gè)機(jī)器字符長。文本框是可編輯的,用戶可以在文本框中輸入若干個(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)視器注冊到文本框)。,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(“輸入你的猜測: “, 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è)容器使用這種布局,那么容器空間簡單地劃分為東、西、南、北、中五個(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)格的左上角開始,從左向右排列,直到排滿一行,再從下一行開始從左向右依次排列。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)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024路面鋪裝工程測量與放樣服務(wù)合同
- 2025年度智慧社區(qū)物業(yè)管理服務(wù)合同規(guī)范文本3篇
- 2025年度殯葬墓地銷售及售后服務(wù)協(xié)議書3篇
- 2025年度數(shù)據(jù)中心建設(shè)承包合同參考范文4篇
- 2025年度智能車位共享平臺(tái)代理銷售合同模板4篇
- 2024栽樹合同范本:生態(tài)濕地栽樹項(xiàng)目合同3篇
- 2025年度智能儲(chǔ)藏室資產(chǎn)交易合同4篇
- 2025年度智能化倉儲(chǔ)儲(chǔ)藏室租賃及運(yùn)營管理協(xié)議范本4篇
- 2025年度醫(yī)療設(shè)備代工制造合同4篇
- 2025年度個(gè)人車輛購置稅連帶擔(dān)保協(xié)議4篇
- GB/T 11072-1989銻化銦多晶、單晶及切割片
- GB 15831-2006鋼管腳手架扣件
- 有機(jī)化學(xué)機(jī)理題(福山)
- 醫(yī)學(xué)會(huì)自律規(guī)范
- 商務(wù)溝通第二版第4章書面溝通
- 950項(xiàng)機(jī)電安裝施工工藝標(biāo)準(zhǔn)合集(含管線套管、支吊架、風(fēng)口安裝)
- 微生物學(xué)與免疫學(xué)-11免疫分子課件
- 《動(dòng)物遺傳育種學(xué)》動(dòng)物醫(yī)學(xué)全套教學(xué)課件
- 弱電工程自檢報(bào)告
- 民法案例分析教程(第五版)完整版課件全套ppt教學(xué)教程最全電子教案
- 7.6用銳角三角函數(shù)解決問題 (2)
評(píng)論
0/150
提交評(píng)論