第9章_組件及事件處理_第1頁
第9章_組件及事件處理_第2頁
第9章_組件及事件處理_第3頁
第9章_組件及事件處理_第4頁
第9章_組件及事件處理_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2022-2-5第 1 頁注意:開始用功了注意:開始用功了!2022-2-5第 2 頁Java2實用教程實用教程(第第4版版) 第第9章章配合例子源代碼一起使用例子源代碼一起使用Power point 制作:耿祥義 張躍平組件及事件處理組件及事件處理 2022-2-5第 3 頁導(dǎo)讀導(dǎo)讀主要內(nèi)容主要內(nèi)容Java Swing概述概述窗口窗口常用組件與布局常用組件與布局處理事件處理事件使用使用MVC結(jié)構(gòu)結(jié)構(gòu)對話框?qū)υ捒虬l(fā)布發(fā)布GUI程序程序2022-2-5第 4 頁9.1 Java SwingJava Swing概述概述 javax.swingjavax.swing包中包中JComponentJCo

2、mponent類是類是java.awtjava.awt包中包中ContainerContainer類的一個類的一個直接子類、是直接子類、是java.awtjava.awt包中包中ComponentComponent類的一個間接子類,學(xué)習(xí)類的一個間接子類,學(xué)習(xí)GUIGUI編程主編程主要是學(xué)習(xí)掌握使用要是學(xué)習(xí)掌握使用ComponentComponent類的一些重要的子類。以下是類的一些重要的子類。以下是GUIGUI編程經(jīng)常提編程經(jīng)常提到的基本知識點到的基本知識點 。(1)Java把把Component類的子類類的子類或間接子類創(chuàng)建的對象稱為一個或間接子類創(chuàng)建的對象稱為一個組件組件。(2)Java把

3、把Container的子類的子類或間接子類創(chuàng)建的對象稱為一個或間接子類創(chuàng)建的對象稱為一個容器容器。(3)可以可以向容器添加組件向容器添加組件。Container類提供了一個類提供了一個public方法:方法:add( ),一個一個容器可以調(diào)用這個方法將組件添加到該容器中。容器可以調(diào)用這個方法將組件添加到該容器中。(4)容器調(diào)用容器調(diào)用removeAll()方法可以移掉容器中的全部組件;調(diào)用方法可以移掉容器中的全部組件;調(diào)用remove(Component c)方法可以移掉容器中參數(shù)方法可以移掉容器中參數(shù)c指定的組件。指定的組件。(5)注意到容器本身也是一個組件,因此可以把注意到容器本身也是一個

4、組件,因此可以把一個容器添加到另一個容器一個容器添加到另一個容器中實現(xiàn)容器的嵌套。中實現(xiàn)容器的嵌套。(6)每當(dāng)容器添加新的組件或移掉組件時,應(yīng)當(dāng)讓容器調(diào)用每當(dāng)容器添加新的組件或移掉組件時,應(yīng)當(dāng)讓容器調(diào)用validate()方法,方法,以保證容器中的組件能正確顯示出來以保證容器中的組件能正確顯示出來2022-2-5第 5 頁 javax.swing包提供了功能更為強大的用來設(shè)計GUI的類。java.awt和javax.swing包中一部分類的層次關(guān)系的UML類圖如圖9.1。 2022-2-5第 6 頁9.2 窗口窗口 Java提供的提供的JFrame類的實例是一個底層容器,即類的實例是一個底層容

5、器,即通常所稱的窗口。其他組件必須被添加到底層容器中,通常所稱的窗口。其他組件必須被添加到底層容器中,以便借助這個地層容器和操作系統(tǒng)進行信息交互。以便借助這個地層容器和操作系統(tǒng)進行信息交互。 JFrameJFrame類是類是ContainerContainer類的間接子類。當(dāng)需要一個類的間接子類。當(dāng)需要一個窗口時,可使用窗口時,可使用JFrameJFrame或其子類創(chuàng)建一個對象。或其子類創(chuàng)建一個對象。 2022-2-5第 7 頁9.2.1 JFrameJFrame常用方法常用方法 JFrame()JFrame() 創(chuàng)建一個無標(biāo)題的窗口。創(chuàng)建一個無標(biāo)題的窗口。JFrame(String s)JF

6、rame(String s) 創(chuàng)建標(biāo)題為創(chuàng)建標(biāo)題為s s的窗口。的窗口。public void setBounds(int a,int b,int width,int heightpublic void setBounds(int a,int b,int width,int height 設(shè)置窗口的初始位置是(a,b),即距屏幕左面a個像素、距屏幕上方b個像素;窗口的寬是width,高是height。public void setSize(int width,int height)public void setSize(int width,int height) 設(shè)置窗口的大小。public

7、void setLocation(int x,int y)public void setLocation(int x,int y) 設(shè)置窗口的位置,默認(rèn)位置是(0,0)。public void setVisible(boolean b)public void setVisible(boolean b) 設(shè)置窗口是否可見,窗口默認(rèn)是不可見的。public void setResizable(boolean bpublic void setResizable(boolean b) ) 設(shè)設(shè)置窗口是否可調(diào)整大小,默認(rèn)可調(diào)整大小。public void dispose()public void dis

8、pose() 撤消當(dāng)前窗口,并釋放當(dāng)前窗口所使用的資源。public void setExtendedState(int state)public void setExtendedState(int state) 設(shè)置窗口的擴展?fàn)顟B(tài).public void setDefaultCloseOperation(int operation)public void setDefaultCloseOperation(int operation) 該方法用來設(shè)置單擊窗體右上角的關(guān)閉圖標(biāo)后,程序會做出怎樣的處理。 例子例子1 1用用JFrameJFrame創(chuàng)建了兩個窗口,程序運行效果如圖創(chuàng)建了兩個窗口,程序

9、運行效果如圖9.29.2。 2022-2-5第 8 頁9.2.2 菜單條、菜單、菜單項菜單條、菜單、菜單項 1 1菜單條菜單條 JComponent類的子類JMenubar負(fù)責(zé)創(chuàng)建菜單條,JFrame類有一個將菜單條放置到窗口中的方法:setJMenuBar(JMenuBar bar);setJMenuBar(JMenuBar bar);該方法將菜單條添加到窗口的頂端 2 2菜單菜單:JComponent類的子類JMenu負(fù)責(zé)創(chuàng)建菜單, JMenu類的主要方法有以下幾種 public void add(JMenuItem item) public void add(JMenuItem item

10、) 向菜單增加由參數(shù)item指定的菜單選項。 public JMenuItem getItem(int n) public JMenuItem getItem(int n) 得到指定索引處的菜單選項。 public int getItemCount() public int getItemCount() 得到菜單選項的數(shù)目。3.3.菜單項菜單項 JComponent類的子類JMenuItem負(fù)責(zé)創(chuàng)建菜單項,JMenuItem類的主要方法有以下幾種: JMenuItem(String s) JMenuItem(String s) 構(gòu)造有標(biāo)題的菜單項。 JMenuItem(String text,

11、 Icon icon) JMenuItem(String text, Icon icon) 構(gòu)造有標(biāo)題和圖標(biāo)的菜單項 public void setAccelerator(KeyStroke keyStroke) public void setAccelerator(KeyStroke keyStroke) 為菜單項設(shè)置快捷鍵。例 子例 子 2 ( E x a m p l e 9 _ 2 . j a v a , WindowMenu.java )在主類的main方法中用JFrame的子類創(chuàng)建一個含有菜單的窗口,效果如圖9.3。 2022-2-5第 9 頁9. 3 常用組件與布局常用組件與布局

12、可以使用可以使用JComponentJComponent的子類的子類JTextFieldJTextField創(chuàng)建各種組創(chuàng)建各種組件。利用組件可以完成應(yīng)用程序與用戶的交互及事件件。利用組件可以完成應(yīng)用程序與用戶的交互及事件處理等。處理等。 也可以在命令行窗口反編譯組件即時查看組件所具也可以在命令行窗口反編譯組件即時查看組件所具有的屬性及常用方法,例如:有的屬性及常用方法,例如: C:javap javax.swing.JComponent C:javap javax.swing.JComponent也可以查看類庫幫助文檔也可以查看類庫幫助文檔. .例如下載例如下載JavaJava類庫幫助文檔:類

13、庫幫助文檔:jdk-6-doc.zipjdk-6-doc.zip。 2022-2-5第 10 頁9.3.1 常用組件常用組件 1 1文本框:由文本框:由JComponentJComponent的子類的子類JTextFieldJTextField創(chuàng)建文本框。創(chuàng)建文本框。2 2文本區(qū):由文本區(qū):由JComponentJComponent的子類的子類JTexAreaJTexArea創(chuàng)建文本區(qū)。創(chuàng)建文本區(qū)。3 3按鈕:由按鈕:由JComponentJComponent的子類的子類JButtonJButton類用來創(chuàng)建按鈕。類用來創(chuàng)建按鈕。4 4標(biāo)簽:由標(biāo)簽:由JComponentJComponent的

14、子類的子類JLabelJLabel類用來創(chuàng)建標(biāo)簽。類用來創(chuàng)建標(biāo)簽。5 5選擇框:由選擇框:由JComponentJComponent的子類的子類JCheckBoxJCheckBox類用來創(chuàng)建選擇框。類用來創(chuàng)建選擇框。6 6單選按鈕:由單選按鈕:由JComponentJComponent的子類的子類JRadioButtonJRadioButton類用來創(chuàng)建單類用來創(chuàng)建單項選擇框。項選擇框。7 7下拉列表:下拉列表:由由JComponentJComponent的子類的子類JComboBoxJComboBox類用來創(chuàng)建下拉列表。類用來創(chuàng)建下拉列表。8 8密碼框:由密碼框:由JComponentJCo

15、mponent的子類的子類JPasswordFieldJPasswordField創(chuàng)建密碼框。創(chuàng)建密碼框。 密碼框可以使用密碼框可以使用setEchoChar(char c)setEchoChar(char c)重新設(shè)置回顯字符重新設(shè)置回顯字符 。 密碼框調(diào)用密碼框調(diào)用char getPassword()char getPassword()方法可以返回實際的密碼。方法可以返回實際的密碼。例子例子3 3( (Example9_3.javaExample9_3.java , , ComponentInWindow.javaComponentInWindow.java ) )包含有包含有上面提到的常

16、用組件。上面提到的常用組件。 2022-2-5第 11 頁9.3.2 常用容器常用容器 JComponentJComponent是是ContainerContainer的子類,因此的子類,因此JComponentJComponent子類創(chuàng)建的組件也都子類創(chuàng)建的組件也都是容器。容器經(jīng)常用來添加組件。是容器。容器經(jīng)常用來添加組件。JframeJframe是底層容器,本節(jié)提到的容器被習(xí)是底層容器,本節(jié)提到的容器被習(xí)慣地稱做中間容器,中間容器必須被添加到底層容器中才能發(fā)揮作用。慣地稱做中間容器,中間容器必須被添加到底層容器中才能發(fā)揮作用。 1 1JPanel JPanel 面板面板: :使用使用JPa

17、nelJPanel創(chuàng)建面板,再向這個面板添加組件,然后把這創(chuàng)建面板,再向這個面板添加組件,然后把這個面板添加到其它容器中。個面板添加到其它容器中。JPanelJPanel面板的默認(rèn)布局是面板的默認(rèn)布局是FlowLayoutFlowLayout布局。布局。 2 2滾動窗格滾動窗格JScrollPane:JScrollPane:可以將文本區(qū)放到一個滾動窗格中??梢詫⑽谋緟^(qū)放到一個滾動窗格中。 JScorollPane scroll=new JScorollPane(new JTextArea(); JScorollPane scroll=new JScorollPane(new JTextArea

18、(); 3 3拆分窗格拆分窗格JSplitPaneJSplitPane: :窗格有兩種類型:水平拆分和垂直拆分窗格有兩種類型:水平拆分和垂直拆分JSplitPaneJSplitPane的兩個常用的構(gòu)造方法:的兩個常用的構(gòu)造方法: JSplitPane(int a,Component b,Component c) JSplitPane(int a,Component b,Component c) JSplitPane(int a, boolean b,Component c,Component d) JSplitPane(int a, boolean b,Component c,Componen

19、t d) 4 4JLayeredPaneJLayeredPane分層窗格分層窗格: :分層窗格使用分層窗格使用add(Jcomponent com, int layer);add(Jcomponent com, int layer);添加組件添加組件comcom,并指定并指定comcom所在的層所在的層 public void setLayer(Component c,int layer)public void setLayer(Component c,int layer)可以重新設(shè)置組件可以重新設(shè)置組件c c所在的層所在的層public int getLayer(Component c)pu

20、blic int getLayer(Component c)可以獲取組件可以獲取組件c c所在的層數(shù)。所在的層數(shù)。 2022-2-5第 12 頁9.3.3 常用布局常用布局_1 _1 容器可以使用方法容器可以使用方法setLayout(布局對象布局對象);設(shè)置自己的布局設(shè)置自己的布局, ,控制組件在控制組件在容器中的位置。容器中的位置。 1 1FlowLayoutFlowLayout布局布局 : : 1)1)創(chuàng)建創(chuàng)建布局對象布局對象 FlowLayout flow=new FlowLayout();FlowLayout flow=new FlowLayout(); 2)容器容器concon使用

21、布局對象使用布局對象con.setLayout(flow);con.setLayout(flow); 3)con 3)con可以使用可以使用ContainerContainer類提供的類提供的addadd方法方法將組件順序地添加到容器中將組件順序地添加到容器中; ; FlowLayoutFlowLayout布局對象調(diào)用相應(yīng)的方法可以重新設(shè)置布局的對齊方式等布局對象調(diào)用相應(yīng)的方法可以重新設(shè)置布局的對齊方式等. . 2 2BorderLayoutBorderLayout布局布局 : : BorderLayout BorderLayout 布局是布局是WindowWindow型容器的默認(rèn)布局型容器的

22、默認(rèn)布局 。 使用使用BorderLayoutBorderLayout布局的容器布局的容器concon,可以使用可以使用addadd方法將一個組件方法將一個組件b b添加到添加到中心區(qū)域:中心區(qū)域:con.add(b,BorderLayout.CENTER); 或或 con.add(BorderLayour.CENTER,b); 2022-2-5第 13 頁9.3.3 常用布局常用布局_2 _2 3 3CardLayout CardLayout 布局布局 : : 使用使用CardLayoutCardLayout的一般步驟如下:的一般步驟如下: 1) 1)創(chuàng)建創(chuàng)建CardLayoutCardLa

23、yout對象對象 CardLayout card=new CardLayout(); 2) 2)為容器設(shè)置布局為容器設(shè)置布局 con.setLayout(card); 3) 3)容器調(diào)用容器調(diào)用add(String s,Component b)將組件將組件b b加入容器,并給出了顯示該加入容器,并給出了顯示該組件的代號組件的代號s s。 4) 4)布局對象布局對象cardcard用用CardLayoutCardLayout類提供的類提供的show()show()方法,顯示容器方法,顯示容器concon中組件代號為中組件代號為s s的組件:的組件:card.show(con,s);4 4Grid

24、LayoutGridLayout布局布局 : : GridLayoutGridLayout布局策略是把容器劃分成若干行乘若布局策略是把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來的小格干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來的小格中。中。 GridLayoutGridLayout布局編輯器的一般步驟如下:布局編輯器的一般步驟如下: 1) 1)創(chuàng)建布局對象,指定劃分網(wǎng)格的行數(shù)創(chuàng)建布局對象,指定劃分網(wǎng)格的行數(shù)m m和列數(shù)和列數(shù)n n GridLayout grid=new new GridLayout(10,8);GridLayout grid=new new GridLayout(1

25、0,8); 2) 2) 使 用使 用 G r i d L a y o u tG r i d L a y o u t 布 局 的 容 器 調(diào) 用 方 法布 局 的 容 器 調(diào) 用 方 法add(Component c)add(Component c)將組件將組件c c加入容器。加入容器。 例題例題4 4 利用利用GriderLayout布局模擬的國際象棋布局模擬的國際象棋棋盤,效果如圖棋盤,效果如圖9.5。 2022-2-5第 14 頁9.3.3 常用布局常用布局_ _3 3 5 5BoxLayoutBoxLayout布局布局: : 使用盒式布局的容器將組件排列在一行或一列使用盒式布局的容器將組

26、件排列在一行或一列 .BoxLayout.BoxLayout布局的一般步驟如下:布局的一般步驟如下: 1) 1)創(chuàng)建布局對象,使用創(chuàng)建布局對象,使用BoxLayouBoxLayou的構(gòu)造方法的構(gòu)造方法BoxLayout(Container conBoxLayout(Container con,,int axis),int axis)可以創(chuàng)建一個盒式布局對象可以創(chuàng)建一個盒式布局對象. . 2) 2)可以使用可以使用BoxBox類的類(靜態(tài))方法類的類(靜態(tài))方法 createHorizontalBox()createHorizontalBox()獲得一個具有行型盒式獲得一個具有行型盒式布局的盒式

27、容器;布局的盒式容器; 使用使用BoxBox類的類(靜態(tài))方法類的類(靜態(tài))方法 createVerticalBox()createVerticalBox()獲得一個具有獲得一個具有列型盒式布局的盒式容器。列型盒式布局的盒式容器。 3)3)控制盒式布局容器中組件之間的距離控制盒式布局容器中組件之間的距離 Box Box類調(diào)用靜態(tài)方法類調(diào)用靜態(tài)方法createHorizontalStrut(int width)createHorizontalStrut(int width)可以得到一個不可見的水可以得到一個不可見的水平平StructStruct對象,稱做水平支撐。對象,稱做水平支撐。 Box B

28、ox類調(diào)用靜態(tài)方法類調(diào)用靜態(tài)方法createVertialStrut(int height)createVertialStrut(int height)可以得到一個不可見的垂直可以得到一個不可見的垂直StructStruct對象,稱做垂直支撐。對象,稱做垂直支撐。 例子例子5 5 Example9_5.java WindowBoxLayout.java 兩個列型盒式容器boxV1、boxV2和一個行型盒式容器baseBox。 在列型盒式容器的組件之間添加垂直支撐,控制組件之間的距離,將boxV1、boxV2添加到baseBox中,并在它倆之間添加了水平支撐。程序運行效果如圖9.6。 6 6nu

29、llnull布局布局 : : 空布局容器可以準(zhǔn)確地定位組件在容器的位置和大小。組件調(diào)用空布局容器可以準(zhǔn)確地定位組件在容器的位置和大小。組件調(diào)用setBounds(int a,int b,int width,int height)方法可以設(shè)置本身的大小和在容器中的位置。方法可以設(shè)置本身的大小和在容器中的位置。2022-2-5第 15 頁9. 4 處理事件處理事件 學(xué)習(xí)組件除了要熟悉組件的屬性和功能外,一個更重要的學(xué)習(xí)組件除了要熟悉組件的屬性和功能外,一個更重要的方面是學(xué)習(xí)怎樣方面是學(xué)習(xí)怎樣處理組件上發(fā)生的界面事件處理組件上發(fā)生的界面事件。當(dāng)用戶在文本框。當(dāng)用戶在文本框中鍵入文本后按回車鍵、單擊按

30、鈕、在一個下拉式列表中選擇中鍵入文本后按回車鍵、單擊按鈕、在一個下拉式列表中選擇一個條目等操作時,都發(fā)生界面事件。一個條目等操作時,都發(fā)生界面事件。 程序有時需對發(fā)生的事件作出反應(yīng),來實現(xiàn)特定的任務(wù),程序有時需對發(fā)生的事件作出反應(yīng),來實現(xiàn)特定的任務(wù),例如,例如,用戶單擊一個名字叫用戶單擊一個名字叫“確定確定”或名字叫或名字叫“取消取消”的按鈕,的按鈕,程序可能需要作出不同的處理程序可能需要作出不同的處理。 2022-2-5第 16 頁9.4.1 事件處理模式事件處理模式 1 1事件源事件源 : :能夠產(chǎn)生事件的對象都可以成為事件源 . 2 2監(jiān)視器監(jiān)視器 : :事件源通過調(diào)用相應(yīng)的方法將某個對

31、象注冊為自己的監(jiān)視器。對于文本框,這個方法是:addActionListener(addActionListener(監(jiān)視器監(jiān)視器);); 事件源注冊監(jiān)視器之后,相應(yīng)的操作就會導(dǎo)致相應(yīng)的事件的發(fā)生,并通知監(jiān)視器,監(jiān)視器就會作出相應(yīng)的處理。 3 3處理事件的接口處理事件的接口: : 監(jiān)視器負(fù)責(zé)處理事件源發(fā)生的事件。監(jiān)視器是一個對象,為了處理事件源發(fā)生的事件,監(jiān)視器這個對象會自動調(diào)用一個方法來處理事件。 Java規(guī)定:為了讓監(jiān)視器這個對象能對事件源發(fā)生的事件進行處理,創(chuàng)建該監(jiān)視器對象的類必須聲明實現(xiàn)相應(yīng)的接口,那么當(dāng)事件源發(fā)生事件時,監(jiān)視器就自動調(diào)用被類重寫的某個接口方法(如圖9.7)。2022-

32、2-5第 17 頁9.4.2 ActionEventActionEvent事件事件 1 1 ActionEvent ActionEvent事件源事件源 : : 文本框、按紐、菜單項、密碼框和單選按紐都可以觸發(fā)ActionEvent事件,即都可以成為ActionEvent事件的事件源。 2 2注冊監(jiān)視器注冊監(jiān)視器: : 能觸發(fā)ActionEvent事件的組件使用 addActionListener(ActionListener listen) 將實現(xiàn)ActionListener接口的類的實例注冊為事件源的監(jiān)視器。 3 3ActionListenerActionListener接口接口 : : A

33、ctionListener接口在java.awt.event包中,該接口中只有一個方法: public void actionPerformed(ActinEvent e) 事件源觸發(fā)ActionEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ActionEvent事件,然后調(diào)用接口中的方法:actionPerformed(ActinEvent e)對發(fā)生的事件作出處理。ActionEvent類事先創(chuàng)建的事件對象就會傳遞給該方法的參數(shù)e。 4 4ActionEventActionEvent類中的方法類中的方法 : : public Object getSource() 調(diào)用該方法可以獲取發(fā)生ActionE

34、vent事件的事件源對象的引用。 public String getActionCommand() 調(diào)用該方法可以獲取發(fā)生ActionEvent事件時,和該事件相關(guān)的一個命令字符串。2022-2-5第 18 頁 例子例子6(6(Example9_6.java Example9_6.java , , WindowActionEvent.java WindowActionEvent.java , , ReaderListen.java ReaderListen.java ) ) 處理文本框上觸發(fā)的處理文本框上觸發(fā)的ActionEventActionEvent事件。事件。在文本框在文本框textte

35、xt中輸中輸入字符串回車,監(jiān)視器負(fù)責(zé)計算字符串的長度,并在命令行窗口入字符串回車,監(jiān)視器負(fù)責(zé)計算字符串的長度,并在命令行窗口顯示字符串的長度。例子顯示字符串的長度。例子6 6程序運行效果如圖程序運行效果如圖9.89.8和和9.99.9。2022-2-5第 19 頁 例子例子7(7(Example9_7.javaExample9_7.java , , WindowActionEvent.javaWindowActionEvent.java , , MyCommandListener.javaMyCommandListener.java , , PoliceListen.javaPoliceLis

36、ten.java ) ) 例子例子7(中的監(jiān)視器:中的監(jiān)視器:PoliceListenPoliceListen與例子與例子6 6中的中的ReaderListenReaderListen略有不略有不同同 , P o l i c e L i s t e nP o l i c e L i s t e n 類 實 現(xiàn) 了類 實 現(xiàn) 了 A c t i o n L i s t e r n e rA c t i o n L i s t e r n e r 接 口 的 子 接 口接 口 的 子 接 口MyCommandListenerMyCommandListener(我們自己寫的一個接口)。我們自己寫的一

37、個接口)。 當(dāng)用戶在文本框中輸入字符串回車或單擊按紐(按鈕可以觸發(fā)當(dāng)用戶在文本框中輸入字符串回車或單擊按紐(按鈕可以觸發(fā)ActionEventActionEvent事件,當(dāng)按鈕獲得監(jiān)視器之后,如果激活按紐,比如用鼠標(biāo)單事件,當(dāng)按鈕獲得監(jiān)視器之后,如果激活按紐,比如用鼠標(biāo)單擊按鈕或按鈕獲得焦點時按下空格鍵,就可以觸發(fā)擊按鈕或按鈕獲得焦點時按下空格鍵,就可以觸發(fā)ActionEventActionEvent事件),事件),PoliceListenPoliceListen監(jiān)視器將字符串的長度顯示在一個文本區(qū)中。運行效果如圖監(jiān)視器將字符串的長度顯示在一個文本區(qū)中。運行效果如圖9.109.10。 2022

38、-2-5第 20 頁9.4.3 ItemEventItemEvent事件事件 1 1ItemEventItemEvent事件源事件源 : :選擇框、下拉列表都可以觸發(fā)ItemEvent事件。2 2注冊監(jiān)視器注冊監(jiān)視器: :能觸發(fā)ItemEvent事件的組件使用 addItemListener(ItemListener listen) 將實現(xiàn)ItemListener接口的類的實例注冊為事件源的監(jiān)視器。 3 3ItemListenerItemListener接口接口 : : ItemListener接口在java.awt.event包中,該接口中只有一個方法: public void itemSt

39、ateChanged(ItemEvent e) 事件源觸發(fā)ItemEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ItemEvent事件,然后調(diào)用接口中的itemStateChanged(ItemEvent e)方法對發(fā)生的事件作出處理。ItemEvent類事先創(chuàng)建的事件對象就會傳遞給該方法的參數(shù)e。 4 4 ItemEventItemEvent類中的方法類中的方法 : : getSource()方法返回發(fā)生Itemevent事件的事件源外 getItemSelectable()方法返回發(fā)生Itemevent事件的事件源。 2022-2-5第 21 頁 例子例子8(Example9_8.java , Wi

40、ndowOperation.java , OperatorListener.java , ComputerListener.java ) 例子例子8(是簡單的計算器(程序運行效果如圖計算器(程序運行效果如圖9.11),實現(xiàn)如下功能:(1)用戶在窗口(WindowOperation類負(fù)責(zé)創(chuàng)建)中的兩個文本框兩個文本框中輸入?yún)⑴c運算的兩個操作數(shù)。(2)用戶在下拉列選擇在下拉列選擇運算符觸發(fā)觸發(fā)ItemEvent事件事件,ItemEvent事件的監(jiān)視器operator(OperatorListener類負(fù)責(zé)創(chuàng)建)獲得運算符獲得運算符,并將運算符傳遞給ActionEvent事件的監(jiān)視器computer

41、(3)用戶單擊按鈕觸發(fā)觸發(fā)ActionEvent事件事件,監(jiān)視器computer(ComputerrListener類負(fù)責(zé)創(chuàng)建)給出運算結(jié)果給出運算結(jié)果。2022-2-5第 22 頁9.4.4 DocumentEventDocumentEvent事件事件 1 1DocumentEventDocumentEvent事件源事件源 : :文本區(qū)所維護的文檔能觸發(fā)DocumentEvent事件 2 2注冊監(jiān)視器注冊監(jiān)視器: :能觸發(fā)DocumentEven事件的事件源使用 addDucumentListener(DocumentListener listen) 將實現(xiàn)DocumentListener接

42、口的類的實例注冊為事件源的監(jiān)視器。 3 3DocumentListenerDocumentListener接口接口 : : DocumentListener接口在javax.swing.event包中,該接口中有三個方法: public void changedUpdate(DocumentEvent e) public void removeUpdate(DocumentEvent e) public void insertUpdate(DocumentEvent e) 事件源觸發(fā)DucumentEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的DocumentEvent事件,然后調(diào)用接口中的相應(yīng)方法對發(fā)

43、生的事件作出處理。例子例子9 9( (Example9_9.javaExample9_9.java , , WindowDocument.javaWindowDocument.java , , TextListener.javaTextListener.java , , HandleListener.javaHandleListener.java ) )將用戶在一個文本將用戶在一個文本區(qū)輸入的單詞按字典序排序后放入另一個文本區(qū)區(qū)輸入的單詞按字典序排序后放入另一個文本區(qū). . 2022-2-5第 23 頁9.4.5 MouseEventMouseEvent事件事件_1 _1 任何組件上都可以發(fā)生

44、鼠標(biāo)事件,如:鼠標(biāo)進入組件、退出組件、在組件上方單擊鼠標(biāo)、拖動鼠標(biāo)等都觸發(fā)鼠標(biāo)事件,即導(dǎo)致MouseEvent類自動創(chuàng)建一個事件對象。 1 1使用使用MouseListenerMouseListener接口可以處理以下接口可以處理以下5 5種操作觸發(fā)的鼠標(biāo)事件種操作觸發(fā)的鼠標(biāo)事件 在事件源上按下鼠標(biāo)鍵、在事件源上釋放鼠標(biāo)鍵、在事件源上擊鼠標(biāo)鍵、鼠標(biāo)進在事件源上按下鼠標(biāo)鍵、在事件源上釋放鼠標(biāo)鍵、在事件源上擊鼠標(biāo)鍵、鼠標(biāo)進入事件源、鼠標(biāo)退出事件源。入事件源、鼠標(biāo)退出事件源。 MouseEvent MouseEvent 中有下列幾個重要的方法:中有下列幾個重要的方法: getX() getX() 獲

45、取鼠標(biāo)指針在事件源坐標(biāo)系中的x-坐標(biāo)。 getY() getY() 獲取鼠標(biāo)指針在事件源坐標(biāo)系中的y-坐標(biāo)。 getModifiers() getModifiers() 獲取鼠標(biāo)的左鍵或右鍵。 getClickCount() getClickCount() 獲取鼠標(biāo)被單擊的次數(shù)。 getSource() getSource() 獲取發(fā)生鼠標(biāo)事件的事件源。 事件源注冊監(jiān)視器的方法是事件源注冊監(jiān)視器的方法是addMouseListener(MouseListener listeneraddMouseListener(MouseListener listener) )。 MouseListener

46、MouseListener接口接口中有如下方法:中有如下方法: mousePressed(MouseEvent) mousePressed(MouseEvent) 負(fù)責(zé)處理在組件上按下鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件 mouseReleased(MouseEvent) mouseReleased(MouseEvent) 負(fù)責(zé)處理在組件上釋放鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件 mouseEntered(MouseEvent) mouseEntered(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)進入組件觸發(fā)的鼠標(biāo)事件 mouseExited(MouseEvent) mouseExited(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)離開

47、組件觸發(fā)的鼠標(biāo)事件 mouseClicked(MouseEvent) mouseClicked(MouseEvent) 負(fù)責(zé)處理在組件上單擊鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件2022-2-5第 24 頁9.4.5 MouseEventMouseEvent事件事件_1 _1 例子例子10 10 Example9_10.javaExample9_10.java WindowMouse.javaWindowMouse.java MousePolice.java MousePolice.java 分別監(jiān)視按鈕、文本框和窗口上的鼠標(biāo)事件,當(dāng)發(fā)生鼠標(biāo)事件時,獲取鼠標(biāo)指針的坐標(biāo)值,注意,事件源的坐標(biāo)系的左上角是原點。 2

48、022-2-5第 25 頁9.4.5 MouseEventMouseEvent事件事件_ _3 3 2 2使用使用MouseMotionListenerMouseMotionListener接口可以處理以下兩種操作觸發(fā)的鼠標(biāo)事件,接口可以處理以下兩種操作觸發(fā)的鼠標(biāo)事件, 在事件源上拖動鼠標(biāo)、在事件源上移動鼠標(biāo)。在事件源上拖動鼠標(biāo)、在事件源上移動鼠標(biāo)。 事件源注冊監(jiān)視器的方法是事件源注冊監(jiān)視器的方法是 addMouseMotionListener(MouseMotionListener listener)。 MouseMotionListenerMouseMotionListener接口接口中有

49、如下方法:中有如下方法: mouseDragged(MouseEvent)mouseDragged(MouseEvent) 負(fù)責(zé)處理拖動鼠標(biāo)觸發(fā)的鼠標(biāo)事件。負(fù)責(zé)處理拖動鼠標(biāo)觸發(fā)的鼠標(biāo)事件。 mouseMoved(MouseEvent) mouseMoved(MouseEvent) 負(fù)責(zé)處理移動鼠標(biāo)觸發(fā)的鼠標(biāo)事件負(fù)責(zé)處理移動鼠標(biāo)觸發(fā)的鼠標(biāo)事件。例子例子1111 Example9_11.javaExample9_11.java WindowMove.javaWindowMove.java LP.javaLP.java 使用坐標(biāo)變換來實現(xiàn)組件的拖動使用坐標(biāo)變換來實現(xiàn)組件的拖動 2022-2-5第 2

50、6 頁9.4.6 焦點事件焦點事件 1 1焦點事件源焦點事件源 : :組件可以觸發(fā)焦點事件。 2 2注冊監(jiān)視器注冊監(jiān)視器: :組件可以使用 addFocusListener(FocusListener listener) 注冊焦點事件監(jiān)視器。 3 3FocusListener接口接口 : : 創(chuàng)建監(jiān)視器的類必須要實現(xiàn)FocusListener接口,該接口有兩個方法: public void focusGained(FocusEvent e) public void focusLost(FocusEvent e) 當(dāng)發(fā)生FocusEvent事件時,監(jiān)視器調(diào)用類實現(xiàn)的接口中的相應(yīng)方法。 4 4組件

51、也可調(diào)用 public boolean requestFocusInWindow() 方法可以獲得輸入焦點。 2022-2-5第 27 頁9.4.7 鍵盤事件鍵盤事件 當(dāng)一個組件處于激活狀態(tài)時,敲擊鍵盤上一個鍵就導(dǎo)致這個組件觸發(fā)鍵盤當(dāng)一個組件處于激活狀態(tài)時,敲擊鍵盤上一個鍵就導(dǎo)致這個組件觸發(fā)鍵盤事件。事件。1.1.某個組件使用某個組件使用addKeyListeneraddKeyListener方法注冊監(jiān)視器方法注冊監(jiān)視器。2.2.接接口口KeyListenerKeyListener中有如下方法:中有如下方法: public void keyPressed(KeyEvent e), public

52、 void keyTyped(KeyEvent e), public void KeyReleased(KeyEvent e) 3.3.相關(guān)方法:相關(guān)方法: public int getKeyCode()判斷哪個鍵被按下、敲擊或釋放,返回一個鍵碼值 。 getKeyChar()判斷哪個鍵被按下、敲擊或釋放,返回鍵上的字符。例子例子1212 Example9_12.javaExample9_12.java Win.javaWin.java Police.javaPolice.java通過處理鍵盤事件通過處理鍵盤事件來實現(xiàn)軟件序列號的輸入。來實現(xiàn)軟件序列號的輸入。2022-2-5第 28 頁9.4

53、.8 窗口事件窗口事件 JFrame JFrame及子類創(chuàng)建的窗口可以調(diào)用及子類創(chuàng)建的窗口可以調(diào)用 setDefaultCloseOperation(int operation);setDefaultCloseOperation(int operation);方法設(shè)置窗口的關(guān)閉方式(如前面各個例子所示)方法設(shè)置窗口的關(guān)閉方式(如前面各個例子所示). . 但是但是setDefaultCloseOperationsetDefaultCloseOperation方式可能不能滿足程序的方式可能不能滿足程序的需要,比如,用戶單擊窗口上的關(guān)閉圖標(biāo)時,可能程序需要提示需要,比如,用戶單擊窗口上的關(guān)閉圖標(biāo)時,

54、可能程序需要提示用戶是否需要保存窗口中的有關(guān)數(shù)據(jù)到磁盤等用戶是否需要保存窗口中的有關(guān)數(shù)據(jù)到磁盤等 . . 2022-2-5第 29 頁1.1.WindowListenerWindowListener接口接口. . (1) public void windowActivated(WindowEvent e) 當(dāng)窗口從非激活狀態(tài)到激活時,窗口的監(jiān)視器調(diào)用該方法。(2) public void windowDeactivated(WindowEvent e) 當(dāng)窗口激活狀態(tài)到非激活狀態(tài)時,窗口的監(jiān)視器調(diào)用該方法。(3) public void windowClosing(WindowEvent e)

55、 當(dāng)窗口正在被關(guān)閉時,窗口的監(jiān)視器調(diào)用該方法。(4) public void windowClosed(WindowEvent e) 當(dāng)窗口關(guān)閉后,窗口的監(jiān)視器調(diào)用該方法。(5) public void windowIconified(WindowEvent e) 當(dāng)窗口圖標(biāo)化時,窗口的監(jiān)視器調(diào)用該方法。(6) public void windowDeiconified(WindowEvent e) 當(dāng)窗口撤消圖標(biāo)化時,窗口的監(jiān)視器調(diào)用該方法。(7) public void windowOpened(WindowEvent e) 當(dāng)窗口打開時,窗口的監(jiān)視器調(diào)用該方法。2022-2-5第 30

56、頁2. 2. WindowAdapterWindowAdapter適配器適配器 . . 適配器適配器可以代替接口來處理事件,當(dāng)Java提供處理事件的接口中多于一個方法時,Java相應(yīng)地就提供一個適配器類,比如WindowAdapter類。適配器已經(jīng)實現(xiàn)了相應(yīng)的接口適配器已經(jīng)實現(xiàn)了相應(yīng)的接口,例如WindowAdapter類實現(xiàn)了WindowListener接口。因此,可以使用WindowAdapte的子類創(chuàng)建的對象做監(jiān)視器,在子類中重寫所需要的接口方法即可。 例子例子13(Example9_13.java ) 使用適配器做監(jiān)視器,只處理窗口關(guān)閉事件,因此只需重寫windowColsing方法即

57、可。2022-2-5第 31 頁9.4.9 匿名類實例或窗口做監(jiān)視器匿名類實例或窗口做監(jiān)視器 匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中仍然有效,當(dāng)發(fā)生事件時,監(jiān)視器就比較容易操作事件源所中仍然有效,當(dāng)發(fā)生事件時,監(jiān)視器就比較容易操作事件源所在的外嵌類中的成員在的外嵌類中的成員. .當(dāng)事件的處理比較簡單、系統(tǒng)也不復(fù)雜時,當(dāng)事件的處理比較簡單、系統(tǒng)也不復(fù)雜時,使用匿名類做監(jiān)視器是一個不錯的選擇。使用匿名類做監(jiān)視器是一個不錯的選擇。 讓事件源所在的類的實例作為監(jiān)視器,能讓事件的處理比較讓事件源所在的類的實例作為監(jiān)視器,能讓事件的處理比較方

58、便,這是因為,監(jiān)視器可以方便的操作事件源所在的類中的方便,這是因為,監(jiān)視器可以方便的操作事件源所在的類中的其他成員。當(dāng)事件的處理比較簡單,系統(tǒng)也不復(fù)雜時,讓事件其他成員。當(dāng)事件的處理比較簡單,系統(tǒng)也不復(fù)雜時,讓事件源所在的類的實例作為監(jiān)視器是一個不錯的選擇。源所在的類的實例作為監(jiān)視器是一個不錯的選擇。 例子例子14(14(Example9_14.javaExample9_14.java ) )是一個猜數(shù)字小游戲是一個猜數(shù)字小游戲 2022-2-5第 32 頁9.4.10 事件總結(jié)事件總結(jié) 1 1授權(quán)模式授權(quán)模式 Java Java的事件處理是基于授權(quán)模式,即事件源調(diào)用調(diào)用方法將的事件處理是基于

59、授權(quán)模式,即事件源調(diào)用調(diào)用方法將某個對象注冊為自己的監(jiān)視器。某個對象注冊為自己的監(jiān)視器。2 2接口回調(diào)接口回調(diào) addXXXListener(XXXListener listener)方法中的參方法中的參數(shù)是一個接口,數(shù)是一個接口,listenerlistener可以引用任何實現(xiàn)了該接口的類所創(chuàng)建可以引用任何實現(xiàn)了該接口的類所創(chuàng)建的對象,當(dāng)事件源發(fā)生事件時,接口的對象,當(dāng)事件源發(fā)生事件時,接口listenerlistener立立刻回調(diào)被類實現(xiàn)刻回調(diào)被類實現(xiàn)的接口中的某個方法。的接口中的某個方法。3.3.方法綁定方法綁定 當(dāng)事件源觸發(fā)事件發(fā)生后,監(jiān)視器準(zhǔn)確知道去調(diào)用哪個方法。當(dāng)事件源觸發(fā)事件發(fā)生

60、后,監(jiān)視器準(zhǔn)確知道去調(diào)用哪個方法。4.4.保持松耦合保持松耦合 當(dāng)事件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個方法會被執(zhí)行,但當(dāng)事件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個方法會被執(zhí)行,但無須關(guān)心到底是哪個對象去調(diào)用了這個方法,因為任何實現(xiàn)接口無須關(guān)心到底是哪個對象去調(diào)用了這個方法,因為任何實現(xiàn)接口的類的實例的類的實例( (做為監(jiān)視器做為監(jiān)視器) )都可以調(diào)用這個方法來處理事件。都可以調(diào)用這個方法來處理事件。 2022-2-5第 33 頁9. 5 使用使用MVC結(jié)構(gòu)結(jié)構(gòu) 模型模型- -視圖視圖- -控制器控制器(Model-View-ControllerModel-View-Controller),簡稱為簡稱為M

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論