Java基礎(chǔ)教程(第3版)_第11章_組件及事件處理_第1頁
Java基礎(chǔ)教程(第3版)_第11章_組件及事件處理_第2頁
Java基礎(chǔ)教程(第3版)_第11章_組件及事件處理_第3頁
Java基礎(chǔ)教程(第3版)_第11章_組件及事件處理_第4頁
Java基礎(chǔ)教程(第3版)_第11章_組件及事件處理_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2022/4/23第 1 頁注意:開始用功了注意:開始用功了!2022/4/23第 2 頁Java 基礎(chǔ)教程(第基礎(chǔ)教程(第3版)版) 第第11章章配合例子源代碼一起使用例子源代碼一起使用Power point 制作:耿祥義 張躍平組件及事件處理組件及事件處理 2022/4/23第 3 頁主要內(nèi)容主要內(nèi)容2022/4/23第 4 頁11.1 Java SwingJava Swing概述概述 javax.swingjavax.swing包中包中JComponentJComponent類是類是java.awtjava.awt包中包中ContainerContainer類的一個(gè)直接子類、是類的一個(gè)直

2、接子類、是ComponentComponent類的一個(gè)間接子類,學(xué)習(xí)類的一個(gè)間接子類,學(xué)習(xí)GUIGUI編程主要是學(xué)習(xí)掌握使用編程主要是學(xué)習(xí)掌握使用ComponentComponent類的一些重要的子類。類的一些重要的子類。以下是以下是GUIGUI編程經(jīng)常提到的基本知識(shí)點(diǎn)編程經(jīng)常提到的基本知識(shí)點(diǎn) 。(1)Java把把Component類的子類類的子類或間接子類創(chuàng)建的對(duì)象稱為一個(gè)或間接子類創(chuàng)建的對(duì)象稱為一個(gè)組件組件。(2)Java把把Container的子類的子類或間接子類創(chuàng)建的對(duì)象稱為一個(gè)或間接子類創(chuàng)建的對(duì)象稱為一個(gè)容容器器。(3)可以可以向容器添加組件向容器添加組件。Container類提供了

3、一個(gè)類提供了一個(gè)public方法:方法:add( ),一個(gè)容器可以調(diào)用這個(gè)方法將組件添加到該容器中。一個(gè)容器可以調(diào)用這個(gè)方法將組件添加到該容器中。(4)容器調(diào)用容器調(diào)用removeAll()方法可以移掉容器中的全部組件;調(diào)方法可以移掉容器中的全部組件;調(diào)用用remove(Component c)方法可以移掉容器中參數(shù)方法可以移掉容器中參數(shù)c指定的組指定的組件。件。(5) 容器本身也是一個(gè)組件,因此可以把容器本身也是一個(gè)組件,因此可以把一個(gè)容器添加到另一個(gè)一個(gè)容器添加到另一個(gè)容器容器中實(shí)現(xiàn)容器的嵌套。中實(shí)現(xiàn)容器的嵌套。2022/4/23第 5 頁圖圖11.1 11.1 ComponentComp

4、onent類的部分子類類的部分子類 2022/4/23第 6 頁11.2 窗口窗口 Java提供的提供的JFrame類的實(shí)例是一個(gè)底層容器,即類的實(shí)例是一個(gè)底層容器,即通常所稱的窗口。通常所稱的窗口。 其他組件必須被添加到底層容器中,以便借助這其他組件必須被添加到底層容器中,以便借助這個(gè)地層容器和操作系統(tǒng)進(jìn)行信息交互。個(gè)地層容器和操作系統(tǒng)進(jìn)行信息交互。 JFrameJFrame類是類是ContainerContainer類的間接子類。當(dāng)需要一個(gè)類的間接子類。當(dāng)需要一個(gè)窗口時(shí),可使用窗口時(shí),可使用JFrameJFrame或其子類創(chuàng)建一個(gè)對(duì)象?;蚱渥宇悇?chuàng)建一個(gè)對(duì)象。 2022/4/23第 7 頁1

5、1.2.1 JFrameJFrame常用方法常用方法 JFrame() 創(chuàng)建一個(gè)無標(biāo)題的窗口。創(chuàng)建一個(gè)無標(biāo)題的窗口。JFrame(String s) 創(chuàng)建標(biāo)題為創(chuàng)建標(biāo)題為s s的窗口。的窗口。public void setVisible(boolean b) 設(shè)置窗口是否可見,窗口默認(rèn)是不可見的。public void dispose() 撤消當(dāng)前窗口,并釋放當(dāng)前窗口所使用的資源。public void setDefaultCloseOperation(int operation) 該方法用來設(shè)置單擊窗體右上角的關(guān)閉圖標(biāo)后,程序會(huì)做出怎樣的處理。 其中的參數(shù)operation取JFrame類中

6、的下列int型static常量,程序根據(jù)參數(shù)operation取值做出不同的處理:DO_NOTHING_ON_CLOSE 什么也不做。 HIDE_ON_CLOSE 隱藏當(dāng)前窗口。DISPOSE_ON_CLOSE 隱藏當(dāng)前窗口,并釋放窗體占有的其它資源。EXIT_ON_CLOSE 結(jié)束窗口所在的應(yīng)用程序。 例子例子1 1中,在主類的中,在主類的mainmain方法中,用方法中,用JFrameJFrame創(chuàng)創(chuàng)建了建了2 2個(gè)窗口。個(gè)窗口。程序運(yùn)行效程序運(yùn)行效果如圖果如圖11.211.2。 2022/4/23第 8 頁11.2.2 菜單條、菜單、菜單項(xiàng)菜單條、菜單、菜單項(xiàng) 1 1菜單條菜單條 JCo

7、mponent類的子類JMenubar負(fù)責(zé)創(chuàng)建菜單條,JFrame類有一個(gè)將菜單條放置到窗口中的方法:setJMenuBar(JMenuBar bar);該方法將菜單條添加到窗口的頂端 2 2菜單菜單:JComponent類的子類JMenu負(fù)責(zé)創(chuàng)建菜單,即JMenu的一個(gè)實(shí)例就是一個(gè)菜單 。3.3.菜單項(xiàng)菜單項(xiàng) JComponent類的子類JMenuItem負(fù)責(zé)創(chuàng)建菜單項(xiàng),即JMenuItem的一個(gè)實(shí)例就是一個(gè)菜單項(xiàng)。 4 4嵌入子菜單嵌入子菜單 JMenu是JMenuItem的子類,因此菜單本身也是一個(gè)菜單項(xiàng),當(dāng)把一個(gè)菜單看作菜單項(xiàng)添加到某個(gè)菜單中時(shí),稱這樣的菜單為子菜單。5 5菜單上的圖標(biāo)

8、菜單上的圖標(biāo) 為了使菜單項(xiàng)有一個(gè)圖標(biāo),可以用圖標(biāo)類Icon聲明一個(gè)圖標(biāo),然后使用其子類ImageIcon類創(chuàng)建一個(gè)圖標(biāo),如:Icon icon = new ImageIcon(a.gif);然后菜單項(xiàng)調(diào)用setIcon(Icon icon) 方法將圖標(biāo)設(shè)置為icon。2022/4/23第 9 頁例子例子2 2 例子例子2 2中我們?cè)谥黝惖闹形覀冊(cè)谥黝惖膍ainmain方法中,用方法中,用JFrameJFrame的子的子類創(chuàng)建一個(gè)含有菜單的窗口。類創(chuàng)建一個(gè)含有菜單的窗口。Example11_2.javaExample11_2.java,WindowMenu.java WindowMenu.jav

9、a 效果如圖效果如圖11.311.3。 2022/4/23第 10 頁11.3 常用組件與布局常用組件與布局 11.3.1常用組件常用組件 1.1.文本框文本框使用JComponent的子類JTextField創(chuàng)建文本框。2.2.文本區(qū)文本區(qū)由JComponent的子類JTexArea創(chuàng)建文本區(qū)。3.3.按鈕按鈕由JComponent的子類JButton類用來創(chuàng)建按鈕。4.4.標(biāo)簽標(biāo)簽由JComponent的子類JLabel類用來創(chuàng)建標(biāo)簽。5.5.選擇框選擇框由JComponent的子類JCheckBox類用來創(chuàng)建選擇框。6.6.單選按鈕單選按鈕由JComponent的子類JRadioButt

10、on類用來創(chuàng)建單項(xiàng)選擇框。7.7.下拉列表下拉列表由JComponent的子類JComboBox類用來創(chuàng)建下拉列表。8.8.密碼框密碼框由JComponent的子類JPasswordField創(chuàng)建密碼框。 例子例子3 3 Example11_3.javaExample11_3.java ComponentInWindow.javaComponentInWindow.java 包包含有上面提到的常用組件。含有上面提到的常用組件。效效果如圖果如圖11.4 . 11.4 . 2022/4/23第 11 頁11.3.2 常用容器常用容器 JComponentJComponent是是ContainerC

11、ontainer的子類,因此的子類,因此JComponentJComponent子類創(chuàng)建的組件也都是子類創(chuàng)建的組件也都是容器。相對(duì)于容器。相對(duì)于JframeJframe底層容器,本節(jié)提到的容器被習(xí)慣地稱做中間容器,中間底層容器,本節(jié)提到的容器被習(xí)慣地稱做中間容器,中間容器必須被添加到底層容器中才能發(fā)揮作用。容器必須被添加到底層容器中才能發(fā)揮作用。 1.1.JPanelJPanel面板面板: :使用JPanel創(chuàng)建面板,再向這個(gè)面板添加組件,然后把這個(gè)面板添加到其它容器中。JPanel面板的默認(rèn)布局是FlowLayout布局。 2.2.滾動(dòng)窗格滾動(dòng)窗格JScrollPane:JScrollPan

12、e:可以將文本區(qū)放到一個(gè)滾動(dòng)窗格中。 JScorollPane scroll=new JScorollPane(new JTextArea(); 3.3.拆分窗格拆分窗格JSplitPaneJSplitPane: :窗格有兩種類型:水平拆分和垂直拆分 JSplitPane JSplitPane的兩個(gè)常用的構(gòu)造方法:的兩個(gè)常用的構(gòu)造方法: JSplitPane(int a,Component b,Component c) JSplitPane(int a, boolean b,Component c,Component d) 4.4.JLayeredPaneJLayeredPane分層窗格分層窗

13、格: :分層窗格使用分層窗格使用add(Jcomponent com, int layer);添加組件com,并指定com所在的層 public void setLayer(Component c,int layer)可以重新設(shè)置組件c所在的層public int getLayer(Component c)可以獲取組件c所在的層數(shù)。 2022/4/23第 12 頁11.3.3 常用布局常用布局_ _ FlowLayoutFlowLayout布局布局 容器可以使用方法容器可以使用方法setLayout(布局對(duì)象布局對(duì)象);設(shè)置自己的布局設(shè)置自己的布局, ,控制組控制組件在容器中的位置。件在容器中

14、的位置。 1 1FlowLayoutFlowLayout布局布局 FlowLayout FlowLayout類創(chuàng)建的對(duì)象稱做類創(chuàng)建的對(duì)象稱做FlowLayoutFlowLayout型布局。型布局。FlowLayoutFlowLayout型布局是型布局是JPanelJPanel型容器的默認(rèn)布局。型容器的默認(rèn)布局。FlowLayoutFlowLayout類的類的一個(gè)常用構(gòu)造方法一個(gè)常用構(gòu)造方法 FlowLayout(); 使用方法:使用方法: 1)1)創(chuàng)建創(chuàng)建布局對(duì)象布局對(duì)象 FlowLayout flow=new FlowLayout(); 2)容器容器concon使用布局對(duì)象使用布局對(duì)象con

15、.setLayout(flow); con con可以使用可以使用ContainerContainer類提供的類提供的add()add()方法方法將組件順序地添加將組件順序地添加到容器中,相關(guān)方法如下:到容器中,相關(guān)方法如下: public void setPreferredSize(Dimension preferredSize) 實(shí)例button.setPreferredSize(new Dimension(20,20); setAlignment(int aligin) aligin取值FlowLayout.LEFT等 setHgap(int hgap) setVgap(int vgap

16、) 2022/4/23第 13 頁11.3.3 常用布局常用布局_ _ BorderLayoutBorderLayout布局布局 2 2BorderLayoutBorderLayout布局布局 : : BorderLayout BorderLayout 布局是布局是WindowWindow型容器的默認(rèn)布局型容器的默認(rèn)布局 。 如果一個(gè)容器使用如果一個(gè)容器使用BorderLayoutBorderLayout布局,那么容器空間簡單地布局,那么容器空間簡單地劃分為東、西、南、北、中五個(gè)區(qū)域,中間的區(qū)域最大。劃分為東、西、南、北、中五個(gè)區(qū)域,中間的區(qū)域最大。 每加入一個(gè)組件都應(yīng)該指明把這個(gè)組件加在哪個(gè)

17、區(qū)域中,區(qū)每加入一個(gè)組件都應(yīng)該指明把這個(gè)組件加在哪個(gè)區(qū)域中,區(qū)域由域由BorderLayoutBorderLayout中的靜態(tài)常量中的靜態(tài)常量CENTERCENTER、NORTHNORTH、SOUTHSOUTH、WESTWEST、EASTEAST表示,例如表示,例如使用使用BorderLayoutBorderLayout布局的容器布局的容器concon,可以使用可以使用addadd方法將一個(gè)組件方法將一個(gè)組件b b添加到中心區(qū)域:添加到中心區(qū)域: con.add ( b, BorderLayout.CENTER); 或或 con.add( BorderLayour.CENTER, b); 20

18、22/4/23第 14 頁11.3.3 常用布局常用布局_ _ CardLayout CardLayout 布局布局 3 3CardLayout CardLayout 布局布局 用用CardLayout CardLayout 的容器可以容納多個(gè)組件,這些組件被層疊的容器可以容納多個(gè)組件,這些組件被層疊放如容器中,最先加入容器的是第一張放如容器中,最先加入容器的是第一張( (在最上面在最上面),),依次向下排依次向下排序。序。 使用使用CardLayoutCardLayout的一般步驟如下:的一般步驟如下: 1) 1)創(chuàng)建創(chuàng)建CardLayoutCardLayout對(duì)象對(duì)象 CardLayout

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

20、irst(con) card.last(con) card.next(con) card.previous(con) 2022/4/23第 15 頁11.3.3 常用布局常用布局_ _ GridLayoutGridLayout布局布局4 4GridLayoutGridLayout布局布局 : : GridLayoutGridLayout布局策略是把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,布局策略是把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來的小格中。組件就位于這些劃分出來的小格中。 GridLayoutGridLayout布局編輯器的一般步布局編輯器的一般步驟如下:驟如下: 1)

21、1)創(chuàng)建布局對(duì)象,指定劃分網(wǎng)格的行數(shù)創(chuàng)建布局對(duì)象,指定劃分網(wǎng)格的行數(shù)m m和列數(shù)和列數(shù)n n GridLayout grid=new new GridLayout(10,8); 2) 2)使用使用GridLayoutGridLayout布局的容器調(diào)用方法布局的容器調(diào)用方法add(Component c)將組件將組件c c加加入容器。入容器。 下 面下 面 例 子例 子 4 利 用利 用 GriderLayou布局模擬布局模擬的國際象棋棋盤的國際象棋棋盤 。2022/4/23第 16 頁11.3.3 常用布局常用布局_ _nullnull布局布局 5 5nullnull布局布局 空布局容器可以準(zhǔn)

22、確地定位組件在容器的位置和大小??詹季秩萜骺梢詼?zhǔn)確地定位組件在容器的位置和大小。 組件調(diào)用組件調(diào)用setBounds(int a,int b,int width,int height)方法可以設(shè)置本身的大小和在容器中的位置。方法可以設(shè)置本身的大小和在容器中的位置。 例如,例如,p p是某個(gè)容器是某個(gè)容器p.setLayout(null);把把p p的布局設(shè)置為空布的布局設(shè)置為空布局。局。 向空布局的容器向空布局的容器p p添加一個(gè)組件添加一個(gè)組件c c需要兩個(gè)步驟。需要兩個(gè)步驟。 1 1)容器)容器p p使用使用add(c)方法添加組件,方法添加組件, 2 2)組件)組件c c再調(diào)用再調(diào)用se

23、tBounds(int a,int b,int width,int height)方法設(shè)置該組件在容器方法設(shè)置該組件在容器p p中的位置和本身的大小。中的位置和本身的大小。 2022/4/23第 17 頁11. 4 處理事件處理事件 學(xué)習(xí)組件除了要熟悉組件的屬性和功能外,一個(gè)更重要的方學(xué)習(xí)組件除了要熟悉組件的屬性和功能外,一個(gè)更重要的方面是學(xué)習(xí)怎樣面是學(xué)習(xí)怎樣處理組件上發(fā)生的界面事件處理組件上發(fā)生的界面事件。當(dāng)用戶在文本框中鍵。當(dāng)用戶在文本框中鍵入文本后按回車鍵、單擊按鈕、在一個(gè)下拉式列表中選擇一個(gè)條入文本后按回車鍵、單擊按鈕、在一個(gè)下拉式列表中選擇一個(gè)條目等操作時(shí),都發(fā)生界面事件。目等操作時(shí)

24、,都發(fā)生界面事件。 程序有時(shí)需對(duì)發(fā)生的事件作出反應(yīng),來實(shí)現(xiàn)特定的任務(wù),例程序有時(shí)需對(duì)發(fā)生的事件作出反應(yīng),來實(shí)現(xiàn)特定的任務(wù),例如,如,用戶單擊一個(gè)名字叫用戶單擊一個(gè)名字叫“確定確定”或名字叫或名字叫“取消取消”的按鈕,程的按鈕,程序可能需要作出不同的處理序可能需要作出不同的處理。 2022/4/23第 18 頁11.4.1 事件處理模式事件處理模式 1 1事件源事件源 : :能夠產(chǎn)生事件的對(duì)象都可以成為事件源 . 2 2監(jiān)視器監(jiān)視器 : :事件源通過調(diào)用相應(yīng)的方法將某個(gè)對(duì)象注冊(cè)為自己的監(jiān)視器。對(duì)于文本框,這個(gè)方法是:addActionListener(addActionListener(監(jiān)視器監(jiān)

25、視器);); 事件源注冊(cè)監(jiān)視器之后,相應(yīng)的操作就會(huì)導(dǎo)致相應(yīng)的事件的發(fā)生,并通知監(jiān)視器,監(jiān)視器就會(huì)作出相應(yīng)的處理。 3 3處理事件的接口處理事件的接口: : 監(jiān)視器負(fù)責(zé)處理事件源發(fā)生的事件。監(jiān)視器是一個(gè)對(duì)象,為了處理事件源發(fā)生的事件,監(jiān)視器這個(gè)對(duì)象會(huì)自動(dòng)調(diào)用一個(gè)方法來處理事件。 Java規(guī)定:為了讓監(jiān)視器這個(gè)對(duì)象能對(duì)事件源發(fā)生的事件進(jìn)行處理,創(chuàng)建該監(jiān)視器對(duì)象的類必須聲明實(shí)現(xiàn)相應(yīng)的接口,那么當(dāng)事件源發(fā)生事件時(shí),監(jiān)視器就自動(dòng)調(diào)用被類重寫的某個(gè)接口方法(如圖11.6)。2022/4/23第 19 頁11.4.2 ActionEventActionEvent事件事件 1 1 ActionEvent Ac

26、tionEvent事件源事件源 : : 文 本 框 、 按 紐 、 菜 單 項(xiàng) 、 密 碼 框 和 單 選 按 紐 都 可 以 觸 發(fā)ActionEvent事件,即都可以成為ActionEvent事件的事件源。 2 2注冊(cè)監(jiān)視器注冊(cè)監(jiān)視器: : 能觸發(fā)ActionEvent事件的組件使用 addActionListener(ActionListener listen) 將實(shí)現(xiàn)ActionListener接口的類的實(shí)例注冊(cè)為事件源的監(jiān)視器。 3 3ActionListenerActionListener接口接口 : : ActionListener接口在java.awt.event包中,該接口中

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

28、onCommand() 調(diào)用該方法可以獲取發(fā)生ActionEvent事件時(shí),和該事件相關(guān)的一個(gè)命令字符串。2022/4/23第 20 頁 例子例子5 5 例子5處理文本框上觸發(fā)的ActionEvent事件。在文本框text中輸入字符串回車,監(jiān)視器負(fù)責(zé)計(jì)算字符串的長度,并在命令行窗口顯示字符串的長度。Example11_5.javaExample11_5.java ,HandleStringListen.javaHandleStringListen.java WindowActionEvent.javaWindowActionEvent.java 例子5程序運(yùn)行效果如圖11.7和11.8。 20

29、22/4/23第 21 頁 例子例子6 6 例子6中的監(jiān)視器:PoliceListen改進(jìn)了例子5中的HandleStringListen,當(dāng)用戶在文本框中輸入字符串回車或單擊按紐,PoliceListen監(jiān)視器將字符串的長度顯示在一個(gè)文本區(qū)中。Example11_6.javaExample11_6.java ,WindowActionEvent.javaWindowActionEvent.java,PoliceListen.javaPoliceListen.java例子6程序運(yùn)行效果如圖11.9。2022/4/23第 22 頁11.4.3 ItemEventItemEvent事件事件 1 1

30、ItemEventItemEvent事件源事件源 : :選擇框、下拉列表都可以觸發(fā)ItemEvent事件。2 2注冊(cè)監(jiān)視器注冊(cè)監(jiān)視器: :能觸發(fā)ItemEvent事件的組件使用 addItemListener(ItemListener listen) 將實(shí)現(xiàn)ItemListener接口的類的實(shí)例注冊(cè)為事件源的監(jiān)視器。 3 3ItemListenerItemListener接口接口 : : ItemListener接口在java.awt.event包中,該接口中只有一個(gè)方法: public void itemStateChanged(ItemEvent e) 事件源觸發(fā)ItemEvent事件后,

31、監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ItemEvent事件,然后調(diào)用接口中的itemStateChanged(ItemEvent e)方法對(duì)發(fā)生的事件作出處理。ItemEvent類事先創(chuàng)建的事件對(duì)象就會(huì)傳遞給該方法的參數(shù)e。 4 4 ItemEventItemEvent類中的方法類中的方法 : : getSource()方法返回發(fā)生Itemevent事件的事件源外 getItemSelectable()方法返回發(fā)生Itemevent事件的事件源。 2022/4/23第 23 頁 例子例子7 7 例子7中,下拉列表中的選項(xiàng)是當(dāng)前目錄下Java文件的名字,用戶選擇下拉列表的選項(xiàng)后,監(jiān)視器負(fù)責(zé)在文本區(qū)中顯示文件的內(nèi)容

32、。Example11_7.javaExample11_7.java, , WindowItemEvent.javaWindowItemEvent.java, , PoliceListen.javaPoliceListen.java程序運(yùn)行效果如圖11.10。 2022/4/23第 24 頁11.4.4 DocumentEventDocumentEvent事件事件 1 1DocumentEventDocumentEvent事件源事件源 : :文本區(qū)所維護(hù)的文檔能觸發(fā)DocumentEvent事件 2 2注冊(cè)監(jiān)視器注冊(cè)監(jiān)視器: :能觸發(fā)DocumentEven事件的事件源使用 addDucumen

33、tListener(DocumentListener listen) 將實(shí)現(xiàn)DocumentListener接口的類的實(shí)例注冊(cè)為事件源的監(jiān)視器。 3 3DocumentListenerDocumentListener接口接口 : : DocumentListener接口在javax.swing.event包中,該接口中有三個(gè)方法: public void changedUpdate(DocumentEvent e) public void removeUpdate(DocumentEvent e) public void insertUpdate(DocumentEvent e) 事件源觸發(fā)事

34、件源觸發(fā)DucumentEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的DocumentEvent事件,然后調(diào)用接口中的相應(yīng)方法對(duì)發(fā)生的事件作出處事件,然后調(diào)用接口中的相應(yīng)方法對(duì)發(fā)生的事件作出處理。理。 2022/4/23第 25 頁 例子例子8 8 例子8中,有兩個(gè)文本區(qū)。當(dāng)用戶在一個(gè)文本區(qū)中輸入若干英文單詞時(shí),另一個(gè)文本區(qū)同時(shí)對(duì)用戶輸入的英文單詞按字典序排序,也就是說隨著用戶輸入的變化,另一個(gè)文本區(qū)不斷地更新排序。Example11_8.javaExample11_8.java, WindowTextSort.javaWindowTextSort.java, , Police

35、Listen.javaPoliceListen.java程序運(yùn)行效果如圖11.11。 2022/4/23第 26 頁11.4.5 MouseEventMouseEvent事件事件_1 _1 任何組件上都可以發(fā)生鼠標(biāo)事件,如:鼠標(biāo)進(jìn)入組件、退出組件、在組件上方單擊鼠標(biāo)、拖動(dòng)鼠標(biāo)等都觸發(fā)鼠標(biāo)事件,即導(dǎo)致MouseEvent類自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。 1 1使用使用MouseListenerMouseListener接口可以處理以下接口可以處理以下5 5種操作觸發(fā)的鼠標(biāo)事件種操作觸發(fā)的鼠標(biāo)事件 在事件源上按下鼠標(biāo)鍵、在事件源上釋放鼠標(biāo)鍵、在事件源上擊鼠標(biāo)鍵、在事件源上按下鼠標(biāo)鍵、在事件源上釋放鼠標(biāo)鍵、

36、在事件源上擊鼠標(biāo)鍵、鼠標(biāo)進(jìn)入事件源、鼠標(biāo)退出事件源。鼠標(biāo)進(jìn)入事件源、鼠標(biāo)退出事件源。 MouseEvent MouseEvent 中有下列幾個(gè)重要的方法:中有下列幾個(gè)重要的方法: getX() getX() 獲取鼠標(biāo)指針在事件源坐標(biāo)系中的x-坐標(biāo)。 getY() getY() 獲取鼠標(biāo)指針在事件源坐標(biāo)系中的y-坐標(biāo)。 更多方法見更多方法見page 211page 211 事件源注冊(cè)監(jiān)視器的方法是事件源注冊(cè)監(jiān)視器的方法是addMouseListener(MouseListener listeneraddMouseListener(MouseListener listener) )。 MouseL

37、istener MouseListener接口接口中有如下方法:中有如下方法: mousePressed(MouseEvent) mousePressed(MouseEvent) 負(fù)責(zé)處理在組件上按下鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件 mouseReleased(MouseEvent) mouseReleased(MouseEvent) 負(fù)責(zé)處理在組件上釋放鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件 .其余方法見page 211 例子例子9 9中中( (Example11_9.java Example11_9.java , , WindowMouse.javaWindowMouse.java, , MousePolice.jav

38、aMousePolice.java) )分別監(jiān)視按鈕、文本框和窗口上的鼠標(biāo)事件,當(dāng)發(fā)生鼠標(biāo)事件時(shí),獲取鼠標(biāo)指分別監(jiān)視按鈕、文本框和窗口上的鼠標(biāo)事件,當(dāng)發(fā)生鼠標(biāo)事件時(shí),獲取鼠標(biāo)指針的坐標(biāo)值,注意,事件源的坐標(biāo)系的左上角是原點(diǎn)。針的坐標(biāo)值,注意,事件源的坐標(biāo)系的左上角是原點(diǎn)。 2022/4/23第 27 頁11.4.5 MouseEventMouseEvent事件事件_ _2 22 2使用使用MouseMotionListenerMouseMotionListener接口可以處理以下兩種操作觸發(fā)的鼠標(biāo)事件,接口可以處理以下兩種操作觸發(fā)的鼠標(biāo)事件, 在事件源上拖動(dòng)鼠標(biāo)、在事件源上移動(dòng)鼠標(biāo)。在事件源上

39、拖動(dòng)鼠標(biāo)、在事件源上移動(dòng)鼠標(biāo)。 事件源注冊(cè)監(jiān)視器的方法是事件源注冊(cè)監(jiān)視器的方法是 addMouseMotionListener(MouseMotionListener listener) MouseMotionListenerMouseMotionListener接口接口中有如下方法:中有如下方法: mouseDragged(MouseEvent) 負(fù)責(zé)處理拖動(dòng)鼠標(biāo)觸發(fā)的鼠標(biāo)事件。 mouseMoved(MouseEvent) 負(fù)責(zé)處理移動(dòng)鼠標(biāo)觸發(fā)的鼠標(biāo)事件。例子例子1010 Example11_10.javaExample11_10.java WindowMove.javaWindowMov

40、e.java LP.javaLP.java 使用坐標(biāo)變換來實(shí)現(xiàn)組件的拖動(dòng)使用坐標(biāo)變換來實(shí)現(xiàn)組件的拖動(dòng) 2022/4/23第 28 頁11.4.6 焦點(diǎn)事件焦點(diǎn)事件 1 1焦點(diǎn)事件源焦點(diǎn)事件源 : :組件可以觸發(fā)焦點(diǎn)事件。 2 2注冊(cè)監(jiān)視器注冊(cè)監(jiān)視器: :組件可以使用 addFocusListener(FocusListener listener) 注冊(cè)焦點(diǎn)事件監(jiān)視器。 3 3FocusListener接口接口 : : 創(chuàng)建監(jiān)視器的類必須要實(shí)現(xiàn)FocusListener接口,該接口有兩個(gè)方法: public void focusGained(FocusEvent e) public void f

41、ocusLost(FocusEvent e) 當(dāng)發(fā)生FocusEvent事件時(shí),監(jiān)視器調(diào)用類實(shí)現(xiàn)的接口中的相應(yīng)方法。 4 4組件也可調(diào)用 public boolean requestFocusInWindow() 方法可以獲得輸入焦點(diǎn)。 2022/4/23第 29 頁11.4.7 鍵盤事件鍵盤事件 當(dāng)一個(gè)組件處于激活狀態(tài)時(shí),敲擊鍵盤上一個(gè)鍵就導(dǎo)致這個(gè)組件觸發(fā)鍵盤當(dāng)一個(gè)組件處于激活狀態(tài)時(shí),敲擊鍵盤上一個(gè)鍵就導(dǎo)致這個(gè)組件觸發(fā)鍵盤事件。事件。1.1.某個(gè)組件使用某個(gè)組件使用addKeyListeneraddKeyListener方法注冊(cè)監(jiān)視器方法注冊(cè)監(jiān)視器。2.2.接接口口KeyListenerKe

42、yListener中有如下方法:中有如下方法: public void keyPressed(KeyEvent e), public void keyTyped(KeyEvent e), public void KeyReleased(KeyEvent e) 3.3.相關(guān)方法:相關(guān)方法: public int getKeyCode()判斷哪個(gè)鍵被按下、敲擊或釋放,返回一個(gè)鍵碼值 。 getKeyChar()判斷哪個(gè)鍵被按下、敲擊或釋放,返回鍵上的字符。例子例子1111 Example11_11.javaExample11_11.java Win.javaWin.java Police.java

43、Police.java通過處理鍵盤事件通過處理鍵盤事件來實(shí)現(xiàn)軟件序列號(hào)的輸入。來實(shí)現(xiàn)軟件序列號(hào)的輸入。2022/4/23第 30 頁11.4.8 匿名類實(shí)例或窗口做監(jiān)視器匿名類實(shí)例或窗口做監(jiān)視器 匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中仍然有效,當(dāng)發(fā)生事件時(shí),監(jiān)視器就比較容易操作事件源所在的仍然有效,當(dāng)發(fā)生事件時(shí),監(jiān)視器就比較容易操作事件源所在的外嵌類中的成員外嵌類中的成員. .當(dāng)事件的處理比較簡單、系統(tǒng)也不復(fù)雜時(shí),使當(dāng)事件的處理比較簡單、系統(tǒng)也不復(fù)雜時(shí),使用匿名類做監(jiān)視器是一個(gè)不錯(cuò)的選擇。用匿名類做監(jiān)視器是一個(gè)不錯(cuò)的選擇。 讓事

44、件源所在的類的實(shí)例作為監(jiān)視器,能讓事件的處理比較讓事件源所在的類的實(shí)例作為監(jiān)視器,能讓事件的處理比較方便,這是因?yàn)?,監(jiān)視器可以方便的操作事件源所在的類中的其方便,這是因?yàn)?,監(jiān)視器可以方便的操作事件源所在的類中的其他成員。他成員。 例子例子12(12(Example11_12.javaExample11_12.java ) )是一個(gè)猜數(shù)字小游戲是一個(gè)猜數(shù)字小游戲 2022/4/23第 31 頁11.4.9 事件總結(jié)事件總結(jié) 1 1授權(quán)模式授權(quán)模式 Java Java的事件處理是基于授權(quán)模式,即事件源調(diào)用調(diào)用方法將的事件處理是基于授權(quán)模式,即事件源調(diào)用調(diào)用方法將某個(gè)對(duì)象注冊(cè)為自己的監(jiān)視器。某個(gè)對(duì)象

45、注冊(cè)為自己的監(jiān)視器。2 2接口回調(diào)接口回調(diào) addXXXListener(XXXListener listener)方法中的參方法中的參數(shù)是一個(gè)接口,數(shù)是一個(gè)接口,listenerlistener可以引用任何實(shí)現(xiàn)了該接口的類所創(chuàng)建可以引用任何實(shí)現(xiàn)了該接口的類所創(chuàng)建的對(duì)象,當(dāng)事件源發(fā)生事件時(shí),接口的對(duì)象,當(dāng)事件源發(fā)生事件時(shí),接口listenerlistener立立刻回調(diào)被類實(shí)現(xiàn)刻回調(diào)被類實(shí)現(xiàn)的接口中的某個(gè)方法。的接口中的某個(gè)方法。3.3.方法綁定方法綁定 當(dāng)事件源觸發(fā)事件發(fā)生后,監(jiān)視器準(zhǔn)確知道去調(diào)用哪個(gè)方法。當(dāng)事件源觸發(fā)事件發(fā)生后,監(jiān)視器準(zhǔn)確知道去調(diào)用哪個(gè)方法。4.4.保持松耦合保持松耦合 當(dāng)事

46、件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個(gè)方法會(huì)被執(zhí)行,但當(dāng)事件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個(gè)方法會(huì)被執(zhí)行,但無須關(guān)心到底是哪個(gè)對(duì)象去調(diào)用了這個(gè)方法,因?yàn)槿魏螌?shí)現(xiàn)接口無須關(guān)心到底是哪個(gè)對(duì)象去調(diào)用了這個(gè)方法,因?yàn)槿魏螌?shí)現(xiàn)接口的類的實(shí)例的類的實(shí)例( (做為監(jiān)視器做為監(jiān)視器) )都可以調(diào)用這個(gè)方法來處理事件。都可以調(diào)用這個(gè)方法來處理事件。 2022/4/23第 32 頁11. 5 使用使用MVC結(jié)構(gòu)結(jié)構(gòu) 模型模型- -視圖視圖- -控制器控制器(Model-View-ControllerModel-View-Controller),簡稱為簡稱為MVCMVC。 MVC MVC是一種先進(jìn)的設(shè)計(jì)結(jié)構(gòu),其目的是以會(huì)話

47、形式提供方便的是一種先進(jìn)的設(shè)計(jì)結(jié)構(gòu),其目的是以會(huì)話形式提供方便的GUIGUI支持。支持。 MVCMVC是一種通過三個(gè)不同部分構(gòu)造一個(gè)軟件或組件的理想辦法:是一種通過三個(gè)不同部分構(gòu)造一個(gè)軟件或組件的理想辦法: 模型模型( (model)model) 用于存儲(chǔ)數(shù)據(jù)的對(duì)象。用于存儲(chǔ)數(shù)據(jù)的對(duì)象。 視圖視圖( (view)view) 為模型提供數(shù)據(jù)顯示的對(duì)象。為模型提供數(shù)據(jù)顯示的對(duì)象。 控制器控制器( (controller)controller)處理用戶的交互操作,對(duì)于用戶的操作作處理用戶的交互操作,對(duì)于用戶的操作作出響應(yīng),讓模型和視圖進(jìn)行必要的交互,即通過視圖修改、獲取出響應(yīng),讓模型和視圖進(jìn)行必要的

48、交互,即通過視圖修改、獲取模型中的數(shù)據(jù);當(dāng)模型中的數(shù)據(jù)變化時(shí),讓視圖更新顯示。模型中的數(shù)據(jù);當(dāng)模型中的數(shù)據(jù)變化時(shí),讓視圖更新顯示。 2022/4/23第 33 頁 例子例子1313 例子13 Example11_13.javaExample11_13.java , , WindowTriangle.javaWindowTriangle.java , , Triangle.javaTriangle.java 程序運(yùn)行效果如圖11.14。 2022/4/23第 34 頁11. 6 對(duì)話框?qū)υ捒?JDialogJDialog類和類和JFrameJFrame都是都是WindowWindow的子類,二者

49、的實(shí)的子類,二者的實(shí)例都是底層容器。例都是底層容器。 JDialogJDialog類創(chuàng)建的對(duì)話框必須要依賴于某個(gè)窗口。類創(chuàng)建的對(duì)話框必須要依賴于某個(gè)窗口。 對(duì)話框分為無模式和有模式兩種。對(duì)話框分為無模式和有模式兩種。 有模式的對(duì)話框:有模式的對(duì)話框:當(dāng)這個(gè)對(duì)話框處于激活狀態(tài)時(shí),當(dāng)這個(gè)對(duì)話框處于激活狀態(tài)時(shí),只讓程序響應(yīng)對(duì)話框內(nèi)部的事件,而且將堵塞其它線程只讓程序響應(yīng)對(duì)話框內(nèi)部的事件,而且將堵塞其它線程的執(zhí)行,用戶不能再激活對(duì)話框所在程序中的其它窗口,的執(zhí)行,用戶不能再激活對(duì)話框所在程序中的其它窗口,直到該對(duì)話框消失不可見。直到該對(duì)話框消失不可見。 無模式對(duì)話框:無模式對(duì)話框:當(dāng)這個(gè)對(duì)話框處于激活

50、狀態(tài)時(shí),能當(dāng)這個(gè)對(duì)話框處于激活狀態(tài)時(shí),能再激活其它窗口,也不堵塞其它線程的執(zhí)行。再激活其它窗口,也不堵塞其它線程的執(zhí)行。 2022/4/23第 35 頁11.6.1 消息對(duì)話框消息對(duì)話框 消息對(duì)話框是有模式對(duì)話框,進(jìn)行一個(gè)重要的操作動(dòng)作之前消息對(duì)話框是有模式對(duì)話框,進(jìn)行一個(gè)重要的操作動(dòng)作之前,最好能彈出一個(gè)消息對(duì)話框。可以用最好能彈出一個(gè)消息對(duì)話框??梢杂胘avax.swingjavax.swing包中的包中的JOptionPaneJOptionPane類類的靜態(tài)方法的靜態(tài)方法: : public static void showMessageDialog( Component parentC

51、omponent, String message, String title, int messageType)創(chuàng)建一個(gè)消息對(duì)話框。創(chuàng)建一個(gè)消息對(duì)話框。 例子例子14(14(Example11_14.javaExample11_14.java, , WindowMess.javaWindowMess.java) )中,要求用戶中,要求用戶在文本框中只能輸入數(shù)字后回車在文本框中只能輸入數(shù)字后回車確認(rèn),當(dāng)輸入非數(shù)字字符后回車確認(rèn),當(dāng)輸入非數(shù)字字符后回車確認(rèn)時(shí),彈出消息對(duì)話框。程序確認(rèn)時(shí),彈出消息對(duì)話框。程序中消息對(duì)話框的中消息對(duì)話框的運(yùn)行效果如圖運(yùn)行效果如圖11.1511.15。 2022/4/2

52、3第 36 頁11.6.2 輸入對(duì)話框輸入對(duì)話框 例子例子15(15(Example11_15.javaExample11_15.java , , WindowInput.javaWindowInput.java ) )中,用戶在單中,用戶在單擊按鈕彈出輸入對(duì)話框,用戶在輸擊按鈕彈出輸入對(duì)話框,用戶在輸入對(duì)話框中輸入一個(gè)數(shù)字,如果單入對(duì)話框中輸入一個(gè)數(shù)字,如果單擊輸入對(duì)話框上的確定按鈕,程序擊輸入對(duì)話框上的確定按鈕,程序?qū)⒂?jì)算個(gè)數(shù)字的平方。程序中輸入將計(jì)算個(gè)數(shù)字的平方。程序中輸入對(duì)話框的對(duì)話框的運(yùn)行效果如圖運(yùn)行效果如圖11.16 .11.16 . 輸入對(duì)話框含有供用戶輸入文本的文本框、一個(gè)確輸

53、入對(duì)話框含有供用戶輸入文本的文本框、一個(gè)確認(rèn)和取消按鈕,是有模式對(duì)話框認(rèn)和取消按鈕,是有模式對(duì)話框 。 可以用可以用javax.swingjavax.swing包中的包中的JOptionPaneJOptionPane類類的靜態(tài)方的靜態(tài)方法:法: public static String showInputDialog(Component parentComponent, Object message, String title, int messageType) 創(chuàng)建一個(gè)輸入對(duì)話框。創(chuàng)建一個(gè)輸入對(duì)話框。2022/4/23第 37 頁11.6.3 確認(rèn)對(duì)話框確認(rèn)對(duì)話框 確認(rèn)對(duì)話框是有模式對(duì)話框。

54、確認(rèn)對(duì)話框是有模式對(duì)話框。 可以用可以用javax.swingjavax.swing包中的包中的JOptionPaneJOptionPane類的靜態(tài)方法類的靜態(tài)方法: :public static int showConfirmDialog(Component parentComponent,public static int showConfirmDialog(Component parentComponent, Object message, Object message, String title, String title, int optionType) int optionType

55、) 得到一個(gè)確認(rèn)對(duì)話框。得到一個(gè)確認(rèn)對(duì)話框。例子例子1616( (Example11_16.javaExample11_16.java , , WindowEnter.javaWindowEnter.java ) ),用戶在文用戶在文本框中輸入帳戶名稱,按回車后,將彈出一個(gè)確認(rèn)對(duì)話框本框中輸入帳戶名稱,按回車后,將彈出一個(gè)確認(rèn)對(duì)話框。 2022/4/23第 38 頁11.6.4 顏色對(duì)話框顏色對(duì)話框 可以用可以用javax.swingjavax.swing包中的包中的JColorChooserJColorChooser類類的靜態(tài)的靜態(tài)方法方法: : public static Color sh

56、owDialog(Component component, String title, Color initialColor)創(chuàng)建一個(gè)有模式的顏色對(duì)話框創(chuàng)建一個(gè)有模式的顏色對(duì)話框 。 例子例子17(17(Example11_17.javaExample11_17.java , , WindowColor.javaWindowColor.java ) )中,當(dāng)中,當(dāng)用戶單擊按鈕時(shí),彈出一個(gè)顏色對(duì)話框,然后根據(jù)用戶選擇的顏用戶單擊按鈕時(shí),彈出一個(gè)顏色對(duì)話框,然后根據(jù)用戶選擇的顏色來改變窗口的顏色。程序中顏色對(duì)話框的運(yùn)行效果如圖色來改變窗口的顏色。程序中顏色對(duì)話框的運(yùn)行效果如圖11.1811.18。 2022/4/23第 39 頁11.6.5 文件對(duì)話框文件對(duì)話框 javax.swing javax.swing包中的包中的JFileChooserJFileChooser類類可以創(chuàng)建文件對(duì)可以創(chuàng)建文件對(duì)話框,使用該類的構(gòu)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論