版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第16講圖形用戶界面㈡布局管理器事件驅動設計AWT高級組件(一)/第16講圖形用戶界面㈡布局管理器/1教學目標掌握布局管理器的使用理解事件驅動機制掌握事件驅動設計方法掌握AWT高級組件的應用教學目標掌握布局管理器的使用2布局管理器在前面課程的學習中,經常會發(fā)生這樣的情況,當將很多的組件放在容器里面的時候,這些組件擺放將很凌亂,有時候甚至看不見部分組件。這是因為沒有對這些組件進行布局管理。AWT提供了5個類來對容器頁面進行管理,它們均直接繼承自java.lang.Object類。FlowLayout(流式布局)BorderLayout(邊界布局)GridLayout(網格布局)CardLayout(多層/卡片布局)GridBagLayout(動態(tài)網格布局)布局管理器在前面課程的學習中,經常會發(fā)生這樣的情況,當將3布局管理器-FlowLayoutFlowLayout是Applet和Panel容器的默認布局管理器,它按照從上到下、從左到右的規(guī)則,將添加到容器中的組件依次排列,默認情況下每行組件均居中排列。自動調用組件的getPreferredSize()方法,使用組件的最佳尺寸來顯示組件。FlowLayout的構造函數:FlowLayout():居中對齊方式,組件間的水平和豎直間距為缺省值5個象素。FlowLayout(intalignment):可以設定每一行組件的對齊方式FlowLayout(intalignment,inthorz,intvert):可以設定組件間的水平和垂直距離布局管理器-FlowLayoutFlowLayout是4importjava.awt.*;publicclassEx9_9{
publicstaticvoidmain(Stringargs[]){ Framefrm=newFrame("FlowLayout演示窗口"); Buttonbut1,but2,but3,but4,but5; but1=newButton(“按鈕一”);
but2=newButton("按鈕二"); but3=newButton(“按鈕三”);
but4=newButton("按鈕四"); but5=newButton("按鈕五");
//設置FlowLayout布局,并且組件左對齊
frm.setLayout(newFlowLayout(FlowLayout.LEFT)); frm.add(but1); //把五個按鈕加入容器中
frm.add(but2); frm.add(but3); frm.add(but4); frm.add(but5); frm.setSize(200,100); frm.setLocation(100,100); frm.setVisible(true);}} 程序分析:程序運行結果如圖所示。當拖動窗口的邊界改變窗口大小時,將會發(fā)現窗口里面的組件也隨著窗口大小而改變位置,組建的布局就像流動式的一樣,這就是FlowLayout布局的特點。FlowLayout示例importjava.awt.*;程序分析:程序運行結果如5布局管理器-BorderLayoutBorderLayout是Windows及其子類Frame的默認布局管理器,它將容器分為5個部分,分別命名為NORTH、SOUTH、WEST、EAST和CENTER。下面是BorderLayout所定義的構造函數:BorderLayout():生成默認的邊界布局BorderLayout(inthorz,intvert):設定組件間的水平和垂直距離用add()方法往容器中添加組件時必須指明添加的位置,若沒有指明放置位置,則表明為默認的“Center”方位。若每個區(qū)域或若干個區(qū)域沒有放置組件,東西南北區(qū)域將不會有預留,而中間區(qū)域將置空。add(“North”,newButton(“North”));add(newButton(“West”),BorderLayout.SOUTH);布局管理器-BorderLayoutBorderLay6importjava.awt.*;publicclassEx9_10{
publicstaticvoidmain(Stringargs[]) { Framefrm=newFrame("BorderLayout演示窗口"); BorderLayoutborder=newBorderLayout(2,5); Buttonbut1,but2,but3,but4,but5; but1=newButton("按鈕東"); but2=newButton("按鈕南"); but3=newButton("按鈕西"); but4=newButton("按鈕北"); but5=newButton("按鈕中"); frm.setLayout(border); frm.add(but1,border.EAST);
frm.add(but2,border.SOUTH); frm.add(but3,border.WEST);
frm.add(but4,border.NORTH); frm.add(but5,border.CENTER); frm.setSize(200,150); frm.setLocation(100,100); frm.setVisible(true);
}} 程序分析:運行程序,將看到如圖的圖形。如果容器使用BorderLayout類對象作為布局管理器,添加任何一個組件都將以邊界作為參照。比如,frm.add(but1,border.EAST);就是在容器frm的最左端添加一個組件but1。BorderLayout示例說明:每個區(qū)域只能添加一個組件,若添加多個,則只能顯示一個組件。如果想在一個區(qū)域添加多個組件,則必須先在該區(qū)域放一個Panel容器,再將多個組件放在該Panel容器中。importjava.awt.*;程序分析:運行程序,將看7布局管理器-GridLayoutGridLayout是一種很容易理解的布局管理器,它將容器按照指定的行數、列數分成大小均勻的網格,然后將添加到容器里面的組件一一放入。GridLayout的構造函數如下所示:GridLayout():生成一個單列的網格布局GridLayout(introw,intcol):生成一個設定行數和列數的網格布局GridLayout(introw,intcol,inthorz,intvert):可以設置組件之間的水平和垂直間隔布局管理器-GridLayoutGridLayout8importjava.awt.*;publicclassEx9_11{publicstaticvoidmain(Stringargs[]){Framefrm=newFrame("GridLayout演示窗口");GridLayoutgrid=newGridLayout(3,4);frm.setLayout(grid);for(inti=1;i<=12;i++)frm.add(newButton(Integer.toString(i)));frm.setSize(200,150);frm.setVisible(true);}}程序分析:由于使用GridLayout布局管理器布局的容器里面添加的組件大小完全相同,所以經常將界面中具有這些規(guī)則的組件放入一個新的容器里面,使用GridLayout進行布局,然后再將這個容器添加到界面容器里面。GridLayout示例importjava.awt.*;程序分析:由于使用Gri9布局管理器-CardLayoutCardLayout是一種將每個組件看作一張卡片,且將所有卡片碼成一摞,每一時刻只有一張卡片被顯示的布局管理器。有人將其形象地描述為一副落成一疊的撲克牌。第一個添加到容器中的組件位于最低層,最后一個添加到容器中的組件位于最上層。請參考API文檔熟悉CardLayout類的構造方法和常用方法。布局管理器-CardLayoutCardLayout是10布局管理器-GridBagLayoutGridBagLayout生成的布局管理器也是和GridLayout一樣是使用網格來進行布局管理的。所不同之處在于GridBagLayout可以通過類GridBagConstraints來控制布局容器內各組件的大小,每個組件都使用一個GridBageConstraints對象來給出它的大小和擺放位置,這樣就可以按照設計者的意圖,改變組件的大小,把它們擺在設計者希望擺放的位置上。這種靈活性是前面幾個布局管理器所不具備的。有關GridBageLayout布局管理器使用的詳細情況參閱API文檔。布局管理器-GridBagLayoutGridBagL11容器的嵌套實際應用中,可能將整個窗口分成很多小塊,每一塊包含幾個組件,這些組件用一個容器來存放,然后再將這些小塊容器添加到窗口對象中。AWT就提供了另外一個容器類Panel??梢栽谝粋€容器中添加幾個Panel容器對象,每個Panel容器對象都可以指定不同的布局方式。容器的嵌套實際應用中,可能將整個窗口分成很多小塊,每一塊包12importjava.awt.*;publicclassEx9_12{
publicstaticvoidmain(Stringargs[]) { Framefrm=newFrame("容器的嵌套"); Labellab=newLabel("0.",Label.RIGHT); frm.setLayout(null); Panelpnl=newPanel(); GridLayoutgrid=newGridLayout(4,4); pnl.setLayout(grid); Strings[]={"7","8","9","/","4","5","6","*","1","2","3","-","0",".","=","+"}; for(inti=0;i<16;i++)
pnl.add(newButton(s[i])); lab.setBackground(Color.orange); lab.setBounds(20,30,160,20); pnl.setBounds(20,60,160,80); frm.add(lab); frm.add(pnl); frm.setSize(200,150); frm.setVisible(true); }} 程序分析:程序中,將大小相同的12個按鈕組件添加在一個Panel對象里面,使用GridLayout進行布局,然后再將這個Panel對象添加到頂層容器Frame對象中。Panel示例importjava.awt.*;程序分析:程序中,將大小13事件驅動設計事件驅動設計14事件驅動設計在窗口程序設計里,事件(event)的設計是不可或缺的一塊。當按下按鈕時,也就觸發(fā)了“按鈕被按”的事件,至于計算機要做什么樣的反應,則是由程序代碼來做判斷與決定的。前面已經學會來怎樣去繪制一個圖形用戶界面,但是還沒有編寫用戶交互的代碼。下面來認識一下Java的事件處理機制。每發(fā)生一個事件,程序都需要作出相應的響應,這稱為事件處理。事件驅動設計在窗口程序設計里,事件(event)的設計是不15委派事件模型事件處理機制的思想是:可能產生事件的對象(事件源,如窗口,按鈕等)收到用戶發(fā)出的操作指令后產生相應的事件,然后將這些事件分別發(fā)送給不同的監(jiān)聽器,由監(jiān)聽器來處理這些事件,并將處理結果返回。整個過程中,監(jiān)聽器簡單的等待,直到它收到一個事件。這種事件處理機制使得處理事件的應用程序邏輯與生成那些事件的界面邏輯(容器或者組件)彼此分離,相互獨立存在。委派事件模型事件處理機制的思想是:可能產生事件的對象(事件16importjava.awt.*;importjava.awt.event.*;classEx9_13extendsFrameimplementsActionListener{
staticEx9_13frm=newEx9_13();
staticButtonbtn=newButton("將窗口變成黃色");
publicstaticvoidmain(Stringargs[]){
btn.addActionListener(frm);//把frm向btn注冊,讓frm監(jiān)聽事件
frm.setLayout(newFlowLayout()); frm.setTitle("ActionEvent"); frm.setSize(200,150); frm.add(btn); frm.setVisible(true); }
publicvoidactionPerformed(ActionEvente){ frm.setBackground(Color.yellow);
}}程序分析:事件源:也就是事件發(fā)生的場所,通常就是各個組件。如本例的按鈕對象。事件:用戶對界面操作在Java語言上的描述。它由用戶和界面中的組件交換而產生,比如移動鼠標、點擊鼠標按鈕和按下鍵盤鍵等都可以引發(fā)事件。本例中,當按下按鈕時,就產生了一個事件ActionEvent。監(jiān)聽:Java使用一組接口來實現對事件源的監(jiān)聽。本例中,為了使frm窗口對象能夠監(jiān)聽按鈕觸發(fā)的事件,讓Ex9_13對象實現事件處理的接口。自身實現監(jiān)聽器示例importjava.awt.*;程序分析:自身實現監(jiān)聽器17importjava.awt.*;importjava.awt.event.*;classEx9_14{
staticFramefrm=newFrame("ActionEvent");
staticButtonbtn=newButton("將窗口變成黃色");
publicstaticvoidmain(Stringargs[]){ btn.addActionListener(newActLis()); frm.setLayout(newFlowLayout()); frm.setTitle("ActionEvent"); frm.setSize(200,150); frm.add(btn); frm.setVisible(true);
} //定義內部類ActLis,并實現ActionListener接口
staticclassActLisimplementsActionListener{ publicvoidactionPerformed(ActionEvente){//事件發(fā)生的處理操作
frm.setBackground(Color.yellow); }
}}程序分析:上個例子中,選擇了窗口作為監(jiān)聽者。事實上也可以自定義一個類來實現ActionListener接口,再把此類產生的對象作為監(jiān)聽。通常把實現接口的類定義在主類里,自己成為它的內部類。內部類實現監(jiān)聽器示例importjava.awt.*;程序分析:內部類實現監(jiān)聽18事件處理類Java把事件類大致分成兩種:語義事件(semanticevents)與底層事件(low-leverevents)(指屏幕上可視化組件的低級輸入或窗口系統(tǒng)事件)。其中語義事件直接繼承自AWTEvent,如ActionEvent、AdjustmentEvent與ComponentEvent等等,底層事件則是繼承自ComponentEvent類,如ContainerEvent、FocusEvent、WindowEvent與KeyEvent等等。下表提供了常用的事件類、事件監(jiān)聽接口與事件監(jiān)聽接口提供的方法。事件處理類Java把事件類大致分成兩種:語義事件(seman19ActionEvent事件類的處理ActionEvent事件對應于組件的主要用途。點擊按鈕,選擇菜單項目,或向單行文本框輸入字符串并敲擊Enter鍵時,都會發(fā)生ActionEvent事件。例:Ex9_15程序分析:點擊前面兩個按鈕,文本框將顯示相應的信息,點擊退出按鈕,程序將結束。類Ex9_15繼承自Frame,frm對象是按鈕組件的容器。當按下按鈕時,將會發(fā)生ActionEvent類事件,按鈕本身不作任何處理,這時候就會把事件向上傳遞,直到窗口對象frm監(jiān)聽為止。當frm對象監(jiān)聽到按鈕事件后,就會運行ActionListener接口提供的方法actionPerformed(ActionEvente)。由于ActionEvent類繼承自EventObject類,所以可以使用EventObject類提供的方法getSource()來查看是哪個對象激活的事件。ActionEvent事件類的處理ActionEvent事20TextEvent類文本事件是指當窗口中TextField或TextArea組件里的文本改變時所觸發(fā)的事件。Java用TextEvent類來處理這個事件,而TextListener則為監(jiān)聽TextEvent事件的接口,該接口聲明了textValueChanged()方法:publicvoidtextValueChanged(TextEvente)當TextEvent事件發(fā)生時,textValueChanged()就會執(zhí)行。Ex9_16程序分析:當在文本框輸入文字時,textValueChanged()方法將會執(zhí)行,兩個標簽分別顯示文本框的內容和文本的長度。程序中在類Ex9_16里面定義了一個內部類TextHandler,由TextListener接口實現。文本框組件tf向內部類對象注冊監(jiān)聽。TextEvent類文本事件是指當窗口中TextField21KeyEvent類KeyEvent類繼承自InputEvent類,是屬于低層次的事件類,只要在鍵盤上按下任何鍵,都會觸發(fā)按鍵事件。要處理KeyEvent事件,可以用KeyListener接口來承擔監(jiān)聽。Ex9_17但是KeyListener接口提供的事件處理方法較多,在實現的類里針對每一個方法都要編寫處理代碼。即使沒有作相關的處理,也必須要把這些方法都寫上去,所以用起來有點不方便。除了KeyListener之外,AWT還提供了KeyAdapter類來處理KeyEvent事件。Ex9_18程序分析:程序中類Ex9_17用KeyListener接口處理KeyEvent事件,必須用類實現KeyListener接口,然后用這個類對象來監(jiān)聽KeyEvent事件。當在文本框按鍵時,KeyEvent事件將被觸發(fā),frm對象監(jiān)聽到之后,KeyListener接口定義的三個方法將會執(zhí)行。程序中類Ex9_18里面定義了一個內部類KeyLis,然后用這個內部類的對象去監(jiān)聽KeyEvent事件。在內部類KeyLis中,定義了方法keyTyped()方法,這個方法覆蓋了父類KeyAdapter類中的方法keyTyped()。KeyEvent類KeyEvent類繼承自InputEve22MouseEvent類鼠標事件類MouseEvent也繼承自InputEvent類,屬于低層次事件類的一種,只要鼠標的按鈕按下、鼠標指針進入或移出事件源、移動鼠標、拖拽鼠標,都會觸發(fā)鼠標事件。同KeyEvent事件一樣,可以使用多種方法來處理MouseEvent事件。AWT提供了MouseListener接口和MouseMotionListener接口作為MouseEvent事件的監(jiān)聽。為了方便操作,還提供了MouseAdapter類和MouseMotionAdapter類來處理MouseEvent事件,它們分別用MouseListener接口和MouseMotionListener接口進行定義。MouseEvent類鼠標事件類MouseEvent也繼承23MouseEvent類1.用MouseListener接口來處理MouseEvent事件例:Ex9_192.用MouseMotionListener接口來處理MouseEvent事件例:Ex9_203.用MouseAdapter類事件處理MouseEvent事件例:Ex9_21MouseEvent類1.用MouseListener接24WindowEvent類低層次事件類。窗口的創(chuàng)建、縮小、關閉、變成非活動窗口等操作都會觸發(fā)WindowEvent事件。AWT提供了WindowListerner接口用于窗口事件的監(jiān)聽。為了簡便操作,提供了WindowAdapter類來處理WindowEvent事件。WindowListerner接口中聲明了7個方法。方法主要功能voidwindowActivated(WindowEvente)將Window設置為活動Window時調用voidwindowClosed(WindowEvente)因對窗口調用dispose而將其關閉時調用WindowEvent類低層次事件類。窗口的創(chuàng)建、縮小、關25方法主要功能voidwindowClosing(WindowEvente)用戶試圖從窗口的系統(tǒng)菜單中關閉窗口時調用voidwindowDeactivated(WindowEvente)當Window不再是活動Window時調用voidwindowDeiconified(WindowEvente)窗口從最小化狀態(tài)變?yōu)檎顟B(tài)時調用voidwindowIconified(WindowEvente)窗口從正常狀態(tài)變?yōu)樽钚』癄顟B(tài)時調用voidwindowOpened(WindowEvente)窗口首次變?yōu)榭梢姇r調用例:Ex9_22方法主要功能voidwindowClosing26AWT高級組件AWT高級組件27文本框列表List提供一個可以滾動的文本項列表,用戶可以選擇一個或者多個選項。方法主要功能List()創(chuàng)建新的滾動列表List(introws)創(chuàng)建一個用指定可視行數初始化的新滾動列表List(introws,booleanmultipleMode)創(chuàng)建一個初始化為顯示指定行數的新滾動列表voidadd(Stringitem)向滾動列表的末尾添加指定的項voidadd(Stringitem,intindex)向滾動列表中索引指示的位置添加指定的項文本框列表List提供一個可以滾動的文本項列表,用戶可以選擇28方法主要功能voidaddItemListener(ItemListenerl)添加指定的項偵聽器以接收此列表的項事件voidaddNotify()創(chuàng)建列表的同位體voiddeselect(intindex)取消選擇指定索引處的項StringgetItem(intindex)獲取與指定索引關聯的項intgetItemCount()獲取列表中的項數intgetRows()獲取此列表中的可視行數intgetSelectedIndex()獲取列表中選中項的索引StringgetSelectedItem()獲取此滾動列表中選中的項String[]getSelectedItems()獲取此滾動列表中選中的項booleanisMultipleMode()確定此列表是否允許多項選擇voidremove(intposition)從此滾動列表中移除指定位置處的項voidremoveAll()從此列表中移除所有項方法主要功能voidaddItemList29List組件使用當用戶選取或者取消選取文本框列表中的某個選項時,ItemEvent事件就會被觸發(fā)??梢允褂胊ddItemListener()方法把事件監(jiān)聽向List類的對象注冊,再將事件處理的程序代碼編寫在itemStateChanged()方法里。例:Ex9_23程序分析:當選擇某一選項時,窗口中的標簽顏色將相應產生變化。本例中,類Ex9_23由接口ItemListener實現,所以Ex9_23類對象frm就可以用來監(jiān)聽ItemEvent事件。當用戶選擇某一個選項時,ItemE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 燙染師培訓管理制度
- 淘寶培訓新人制度
- 衛(wèi)生院感染培訓制度
- 體育培訓班規(guī)章制度
- 塔城企業(yè)培訓制度
- 就業(yè)培訓安置制度
- 企業(yè)培訓線上平臺制度
- 酒店部門培訓員管理制度
- 駕駛員培訓學校會計制度
- 培訓師管理制度細則
- 宋代插花課件
- 2025年度耳鼻喉科工作總結及2026年工作計劃
- 2024年執(zhí)業(yè)藥師《藥學專業(yè)知識(一)》試題及答案
- 2025寧夏黃河農村商業(yè)銀行科技人員社會招聘考試筆試參考題庫及答案解析
- 統(tǒng)編版語文一年級上冊無紙化考評-趣味樂考 玩轉語文 課件
- 2025年新水利安全員b證考試試題及答案
- 高壓氧進修課件
- 2025無人機物流配送網絡建設與運營效率提升研究報告
- 鋁錠采購正規(guī)合同范本
- 城市更新能源高效利用方案
- 2025 精神護理人員職業(yè)倦怠預防課件
評論
0/150
提交評論