java面向?qū)ο蟪绦蛟O(shè)計(jì)第2版第10章-javaswing圖形用戶界面精選課件_第1頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第2版第10章-javaswing圖形用戶界面精選課件_第2頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第2版第10章-javaswing圖形用戶界面精選課件_第3頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第2版第10章-javaswing圖形用戶界面精選課件_第4頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第2版第10章-javaswing圖形用戶界面精選課件_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java面向?qū)ο蟪绦蛟O(shè)計(jì)第2版第10章配合第2版例子源代碼一起使用Power point 制作:耿祥義 張躍平Java Swing圖形用戶界面 第1頁,共54頁。1導(dǎo)讀第2頁,共54頁。210.1 Java Swing概述 Java的java.awt包,即Java抽象窗口工具包(AWT:Abstract Window Toolkit)提供了許多用來設(shè)計(jì)GUI的組件類。 第3頁,共54頁。310.2 窗口 Java提供的JFrame類的實(shí)例是一個(gè)底層容器,即通常所稱的窗口。其他組件必須被添加到底層容器中,以便借助這個(gè)地層容器和操作系統(tǒng)進(jìn)行信息交互。 JFrame類是Container類的間接子類

2、。當(dāng)需要一個(gè)窗口時(shí),可使用JFrame或其子類創(chuàng)建一個(gè)對(duì)象。 第4頁,共54頁。410.2.1 JFrame常用方法 JFrame() 創(chuàng)建一個(gè)無標(biāo)題的窗口。JFrame(String s) 創(chuàng)建標(biāo)題為s的窗口。public void setBounds(int a,int b,int width,int height 設(shè)置窗口的初始位置是(a,b),即距屏幕左面a個(gè)像素、距屏幕上方b個(gè)像素;窗口的寬是width,高是height。public void setSize(int width,int height) 設(shè)置窗口的大小。public void setLocation(int x,in

3、t y) 設(shè)置窗口的位置,默認(rèn)位置是(0,0)。public void setVisible(boolean b) 設(shè)置窗口是否可見,窗口默認(rèn)是不可見的。public void setResizable(boolean b) 設(shè)置窗口是否可調(diào)整大小,默認(rèn)可調(diào)整大小。public void dispose() 撤消當(dāng)前窗口,并釋放當(dāng)前窗口所使用的資源。public void setExtendedState(int state) 設(shè)置窗口的擴(kuò)展?fàn)顟B(tài).public void setDefaultCloseOperation(int operation) 該方法用來設(shè)置單擊窗體右上角的關(guān)閉圖標(biāo)后,程

4、序會(huì)做出怎樣的處理。 例題10-1第5頁,共54頁。5 例題1效果圖第6頁,共54頁。610.2.2 菜單條、菜單、菜單項(xiàng) 1菜單條 JComponent類的子類JMenubar負(fù)責(zé)創(chuàng)建菜單條,JFrame類有一個(gè)將菜單條放置到窗口中的方法:setJMenuBar(JMenuBar bar);該方法將菜單條添加到窗口的頂端 2菜單:JComponent類的子類JMenu負(fù)責(zé)創(chuàng)建菜單, JMenu類的主要方法有以下幾種 JMenu() 建立一個(gè)空標(biāo)題的菜單。 JMenu(String s) 建立一個(gè)指定標(biāo)題菜單,標(biāo)題由參數(shù)s確定。 public void add(JMenuItem item)

5、向菜單增加由參數(shù)item指定的菜單選項(xiàng)。 public JMenuItem getItem(int n) 得到指定索引處的菜單選項(xiàng)。 public int getItemCount() 得到菜單選項(xiàng)的數(shù)目。3.菜單項(xiàng) JComponent類的子類JMenuItem負(fù)責(zé)創(chuàng)建菜單項(xiàng),JMenuItem類的主要方法有以下幾種: JMenuItem(String s) 構(gòu)造有標(biāo)題的菜單項(xiàng)。JMenuItem(String text, Icon icon) 構(gòu)造有標(biāo)題和圖標(biāo)的菜單項(xiàng)public void setEnabled(boolean b) 設(shè)置當(dāng)前菜單項(xiàng)是否可被選擇。public String

6、getText() 得到菜單選項(xiàng)的名字。public void setText(String name) 設(shè)置菜單選項(xiàng)的名字為參數(shù)name指定的字符串。public void setAccelerator(KeyStroke keyStroke) 為菜單項(xiàng)設(shè)置快捷鍵。4嵌入子菜單 JMenu是JMenuItem的子類,因此菜單本身也是一個(gè)菜單項(xiàng),當(dāng)把一個(gè)菜單看作菜單項(xiàng)添加到某個(gè)菜單中時(shí),稱這樣的菜單為子菜單。5菜單上的圖標(biāo):圖標(biāo)類Icon聲明一個(gè)圖標(biāo),然后使用其子類ImageIcon類創(chuàng)建一個(gè)圖標(biāo),如:Icon icon = new ImageIcon(“a.gif”); 例題10-2第7頁,

7、共54頁。7 例題2效果圖第8頁,共54頁。810. 3 常用組件與布局 本節(jié)列出一些常用的組件,讀者可以查閱類庫文檔,了解這些組件的屬性以及常用方法,也可以在命令行窗口反編譯組件即時(shí)查看組件所具有的屬性及常用方法,例如: C:javap javax.swing.JComponent C:javap javax.swing.JButton 第9頁,共54頁。910.3.1 常用組件 1文本框:由JComponent的子類JTextField創(chuàng)建文本框。2文本區(qū):由JComponent的子類JTexArea創(chuàng)建文本區(qū)。3按鈕:由JComponent的子類JButton類用來創(chuàng)建按鈕。4標(biāo)簽:由J

8、Component的子類JLabel類用來創(chuàng)建標(biāo)簽。5選擇框:由JComponent的子類JCheckBox類用來創(chuàng)建選擇框。6單選按鈕:由JComponent的子類JRadioButton類用來創(chuàng)建單項(xiàng)選擇框。7下拉列表:由JComponent的子類JComboBox類用來創(chuàng)建下拉列表。8密碼框:由JComponent的子類JPasswordField創(chuàng)建密碼框。 密碼框可以使用setEchoChar(char c)重新設(shè)置回顯字符 。 密碼框調(diào)用char getPassword()方法可以返回實(shí)際的密碼。例子3(Example10_3.java , ComponentInWindow.ja

9、va )包含有上面提到的常用組件。 第10頁,共54頁。10 例題3效果圖第11頁,共54頁。1110.3.2 常用容器 JComponent是Container的子類,因此JComponent子類創(chuàng)建的組件也都是容器。容器經(jīng)常用來添加組件。Jframe是底層容器,本節(jié)提到的容器被習(xí)慣地稱做中間容器,中間容器必須被添加到底層容器中才能發(fā)揮作用。 1JPanel 面板:使用JPanel創(chuàng)建面板,再向這個(gè)面板添加組件,然后把這個(gè)面板添加到其它容器中.JPanel面板的默認(rèn)布局是FlowLayout布局。 2滾動(dòng)窗格JScrollPane:可以將文本區(qū)放到一個(gè)滾動(dòng)窗格中。 JScorollPane

10、scroll=new JScorollPane(new JTextArea(); 3拆分窗格JSplitPane:窗格有兩種類型水平拆分和垂直拆分JSplitPane的兩個(gè)常用的構(gòu)造方法: JSplitPane(int a,Component b,Component c) JSplitPane(int a, boolean b,Component c,Component d) 4JLayeredPane分層窗格:分層窗格使用add(Jcomponent com, int layer);添加組件com,并指定com所在的層 public void setLayer(Component c,int

11、 layer)可以重新設(shè)置組件c所在的層public int getLayer(Component c)可以獲取組件c所在的層數(shù)。 第12頁,共54頁。1210.3.3 常用布局_1 容器可以使用方法setLayout(布局對(duì)象);設(shè)置自己的布局,控制組件在容器中的位置。 1FlowLayout布局 : 1)創(chuàng)建布局對(duì)象 FlowLayout flow=new FlowLayout(); 2)容器con使用布局對(duì)象con.setLayout(flow); 3)con可以使用Container類提供的add方法將組件順序地添加到容器中; FlowLayout布局對(duì)象調(diào)用相應(yīng)的方法可以重新設(shè)置布局

12、的對(duì)齊方式等. 2BorderLayout布局 : BorderLayout 布局是Window型容器的默認(rèn)布局 。 使用BorderLayout布局的容器con,可以使用add方法將一個(gè)組件b添加到中心區(qū)域:con.add(b,BorderLayout.CENTER); 或 con.add(BorderLayour.CENTER,b); 第13頁,共54頁。1310.3.3 常用布局_2 3CardLayout 布局 : 使用CardLayout的一般步驟如下: 1)創(chuàng)建CardLayout對(duì)象 CardLayout card=new CardLayout(); 2)為容器設(shè)置布局 con.

13、setLayout(card); 3)容器調(diào)用add(String s,Component b)將組件b加入容器,并給出了顯示該組件的代號(hào)s。 4)布局對(duì)象card用CardLayout類提供的show()方法,顯示容器con中組件代號(hào)為s的組件:card.show(con,s);4GridLayout布局 : GridLayout布局策略是把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來的小格中。 GridLayout布局編輯器的一般步驟如下: 1)創(chuàng)建布局對(duì)象,指定劃分網(wǎng)格的行數(shù)m和列數(shù)n GridLayout grid=new new GridLayout(10,8); 2)

14、使用GridLayout布局的容器調(diào)用方法add(Component c)將組件c加入容器。 例題4 利用GriderLayout布局模擬的國際象棋棋盤,效果如圖10.5。 第14頁,共54頁。14 例題4效果圖第15頁,共54頁。1510.3.3 常用布局_3 5BoxLayout布局:使用盒式布局的容器將組件排列在一行或一列 .BoxLayout布局的一般步驟如下: 1)創(chuàng)建布局對(duì)象,使用BoxLayou的構(gòu)造方法BoxLayout(Container con, int axis)可以創(chuàng)建一個(gè)盒式布局對(duì)象. 2)可以使用Box類的類(靜態(tài))方法 createHorizontalBox()獲

15、得一個(gè)具有行型盒式布局的盒式容器;使用Box類的類(靜態(tài))方法 createVerticalBox()獲得一個(gè)具有列型盒式布局的盒式容器。 3)控制盒式布局容器中組件之間的距離 Box類調(diào)用靜態(tài)方法createHorizontalStrut(int width)可以得到一個(gè)不可見的水平Struct對(duì)象,稱做水平支撐.Box類調(diào)用靜態(tài)方法createVertialStrut(int height)可以得到一個(gè)不可見的垂直Struct對(duì)象,稱做垂直支撐。 例子5 代碼鏈接 兩個(gè)列型盒式容器boxV1、boxV2和一個(gè)行型盒式容器baseBox。 在列型盒式容器的組件之間添加垂直支撐,控制組件之間的

16、距離,將boxV1、boxV2添加到baseBox中,并在它倆之間添加了水平支撐。程序運(yùn)行效果如圖10.6。 6null布局 : 空布局容器可以準(zhǔn)確地定位組件在容器的位置和大小。組件調(diào)用setBounds(int a,int b,int width,int height)方法可以設(shè)置本身的大小和在容器中的位置。第16頁,共54頁。16 例題5效果圖第17頁,共54頁。1710. 4 處理事件 學(xué)習(xí)組件除了要熟悉組件的屬性和功能外,一個(gè)更重要的方面是學(xué)習(xí)怎樣處理組件上發(fā)生的界面事件。當(dāng)用戶在文本框中鍵入文本后按回車鍵、單擊按鈕、在一個(gè)下拉式列表中選擇一個(gè)條目等操作時(shí),都發(fā)生界面事件。 程序有時(shí)需

17、對(duì)發(fā)生的事件作出反應(yīng),來實(shí)現(xiàn)特定的任務(wù),例如,用戶單擊一個(gè)名字叫“確定”或名字叫“取消”的按鈕,程序可能需要作出不同的處理。 第18頁,共54頁。1810.4.1 事件處理模式 1事件源 :能夠產(chǎn)生事件的對(duì)象都可以成為事件源 . 2監(jiān)視器 :事件源通過調(diào)用相應(yīng)的方法將某個(gè)對(duì)象注冊(cè)為自己的監(jiān)視器。對(duì)于文本框,這個(gè)方法是: addActionListener(監(jiān)視器); 事件源注冊(cè)監(jiān)視器之后,相應(yīng)的操作就會(huì)導(dǎo)致相應(yīng)的事件的發(fā)生,并通知監(jiān)視器,監(jiān)視器就會(huì)作出相應(yīng)的處理。 3處理事件的接口: 監(jiān)視器負(fù)責(zé)處理事件源發(fā)生的事件。監(jiān)視器是一個(gè)對(duì)象,為了處理事件源發(fā)生的事件,監(jiān)視器這個(gè)對(duì)象會(huì)自動(dòng)調(diào)用一個(gè)方法來

18、處理事件。 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è)接口方法(如圖10.7)。第19頁,共54頁。19 事件處理模式效果圖第20頁,共54頁。2010.4.2 ActionEvent事件 1 ActionEvent事件源 : 文本框、按紐、菜單項(xiàng)、密碼框和單選按紐都可以觸發(fā)ActionEvent事件,即都可以成為ActionEvent事件的事件源。 2注冊(cè)監(jiān)視器: 能觸發(fā)ActionEvent事件的組件使用 addActionListener(ActionListener

19、listen) 將實(shí)現(xiàn)ActionListener接口的類的實(shí)例注冊(cè)為事件源的監(jiān)視器。 3ActionListener接口 : ActionListener接口在java.awt.event包中,該接口中只有一個(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。 4ActionEvent類中的方法 :

20、 public Object getSource() 調(diào)用該方法可以獲取發(fā)生ActionEvent事件的事件源對(duì)象的引用。 public String getActionCommand() 調(diào)用該方法可以獲取發(fā)生ActionEvent事件時(shí),和該事件相關(guān)的一個(gè)命令字符串。 第21頁,共54頁。21 例題6 例子6中,文本框text是JTextField的實(shí)例,text的監(jiān)視器listener是實(shí)現(xiàn)ActionLiener接口的PoliceListen類創(chuàng)建的對(duì)象。在text中輸入數(shù)字字符串并回車,監(jiān)視器負(fù)責(zé)將text中的字符串轉(zhuǎn)化為數(shù),然后計(jì)算這個(gè)數(shù)的平方,并在命令行窗口輸出平方。例子6中的t

21、ext對(duì)象和監(jiān)視器listener都是WindowNumber類創(chuàng)建的窗口中的成員。程序運(yùn)行效果如圖10.8(a)和10.8(b)。代碼鏈接第22頁,共54頁。22 例題7 例子7對(duì)例子6進(jìn)行了改進(jìn),WindowNumber創(chuàng)建的窗口中有2個(gè)文本框,用戶在可編輯的文本框中輸入數(shù)字、回車確認(rèn),另一個(gè)不可編輯的文本框顯示這個(gè)數(shù)的平方。例子7程序運(yùn)行效果如圖10.9。代碼鏈接第23頁,共54頁。2310.4.3 ItemEvent事件 1ItemEvent事件源 :選擇框、下拉列表都可以觸發(fā)ItemEvent事件。2注冊(cè)監(jiān)視器:能觸發(fā)ItemEvent事件的組件使用 addItemListener(

22、ItemListener listen) 將實(shí)現(xiàn)ItemListener接口的類的實(shí)例注冊(cè)為事件源的監(jiān)視器。 3ItemListener接口 : ItemListener接口在java.awt.event包中,該接口中只有一個(gè)方法: public void itemStateChanged(ItemEvent e) 事件源觸發(fā)ItemEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ItemEvent事件,然后調(diào)用接口中的itemStateChanged(ItemEvent e)方法對(duì)發(fā)生的事件作出處理。ItemEvent類事先創(chuàng)建的事件對(duì)象就會(huì)傳遞給該方法的參數(shù)e。 4 ItemEvent類中的方法 :

23、getSource()方法返回發(fā)生Itemevent事件的事件源外 getItemSelectable()方法返回發(fā)生Itemevent事件的事件源。 第24頁,共54頁。24 例題8代碼鏈接例子8 是簡(jiǎn)單的計(jì)算器(程序運(yùn)行效果如圖10.10),實(shí)現(xiàn)如下功能:(1)用戶在窗口(WindowOperation類負(fù)責(zé)創(chuàng)建)中的兩個(gè)文本框中輸入?yún)⑴c運(yùn)算的兩個(gè)操作數(shù)。(2)用戶在下拉列選擇運(yùn)算符觸發(fā)ItemEvent事件,ItemEvent事件的監(jiān)視器operator(OperatorListener類負(fù)責(zé)創(chuàng)建)獲得運(yùn)算符,并將運(yùn)算符傳遞給ActionEvent事件的監(jiān)視器computer(3)用戶單

24、擊按鈕觸發(fā)ActionEvent事件,監(jiān)視器computer(ComputerrListener類負(fù)責(zé)創(chuàng)建)給出運(yùn)算結(jié)果。第25頁,共54頁。2510.4.4 DocumentEvent事件 1DocumentEvent事件源 :文本區(qū)所維護(hù)的文檔能觸發(fā)DocumentEvent事件 2注冊(cè)監(jiān)視器:能觸發(fā)DocumentEven事件的事件源使用 addDucumentListener(DocumentListener listen) 將實(shí)現(xiàn)DocumentListener接口的類的實(shí)例注冊(cè)為事件源的監(jiān)視器。 3DocumentListener接口 : DocumentListener接口在ja

25、vax.swing.event包中,該接口中有三個(gè)方法: 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)方法對(duì)發(fā)生的事件作出處理。第26頁,共54頁。26 例題9代碼鏈接 例子9中,有兩個(gè)文本區(qū)。當(dāng)用戶在一個(gè)文本區(qū)中輸入若干英文單詞時(shí)(用空格、逗號(hào)或回車做為單詞之間的分隔符),

26、另一個(gè)文本區(qū)同時(shí)對(duì)用戶輸入的英文單詞按字典序排序,也就是說隨著用戶輸入的變化,另一個(gè)文本區(qū)不斷地更新排序。程序運(yùn)行效果如圖10.11。第27頁,共54頁。2710.4.5 MouseEvent事件_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使用MouseListener接口可以處理以下5種操作觸發(fā)的鼠標(biāo)事件 在事件源上按下鼠標(biāo)鍵、在事件源上釋放鼠標(biāo)鍵、在事件源上擊鼠標(biāo)鍵、鼠標(biāo)進(jìn)入事件源、鼠標(biāo)退出事件源。 MouseEvent 中有下列幾個(gè)重要的方法: getX() 獲取鼠標(biāo)指

27、針在事件源坐標(biāo)系中的x-坐標(biāo)。 getY() 獲取鼠標(biāo)指針在事件源坐標(biāo)系中的y-坐標(biāo)。 getModifiers() 獲取鼠標(biāo)的左鍵或右鍵。 getClickCount() 獲取鼠標(biāo)被單擊的次數(shù)。 getSource() 獲取發(fā)生鼠標(biāo)事件的事件源。 事件源注冊(cè)監(jiān)視器的方法是addMouseListener(MouseListener listener)。 MouseListener接口中有如下方法: mousePressed(MouseEvent) 負(fù)責(zé)處理在組件上按下鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件 mouseReleased(MouseEvent) 負(fù)責(zé)處理在組件上釋放鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件 mouse

28、Entered(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)進(jìn)入組件觸發(fā)的鼠標(biāo)事件 mouseExited(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)離開組件觸發(fā)的鼠標(biāo)事件 mouseClicked(MouseEvent) 負(fù)責(zé)處理在組件上單擊鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件第28頁,共54頁。28 例題10代碼鏈接 例子10中,分別監(jiān)視按鈕、文本框和窗口上的鼠標(biāo)事件,當(dāng)發(fā)生鼠標(biāo)事件時(shí),獲取鼠標(biāo)指針的坐標(biāo)值,注意,事件源的坐標(biāo)系的左上角是原點(diǎn)。第29頁,共54頁。2910.4.5 MouseEvent事件_2 2使用MouseMotionListener接口可以處理以下兩種操作觸發(fā)的鼠標(biāo)事件, 在事件源上拖動(dòng)鼠標(biāo)、在事

29、件源上移動(dòng)鼠標(biāo)。 事件源注冊(cè)監(jiān)視器的方法是 addMouseMotionListener(MouseMotionListener listener) MouseMotionListener接口中有如下方法: mouseDragged(MouseEvent) 負(fù)責(zé)處理拖動(dòng)鼠標(biāo)觸發(fā)的鼠標(biāo)事件。 mouseMoved(MouseEvent) 負(fù)責(zé)處理移動(dòng)鼠標(biāo)觸發(fā)的鼠標(biāo)事件。第30頁,共54頁。30 例題11代碼鏈接 例子11使用坐標(biāo)變換來實(shí)現(xiàn)組件的拖動(dòng) 。第31頁,共54頁。3110.4.6 焦點(diǎn)事件 1焦點(diǎn)事件源 :組件可以觸發(fā)焦點(diǎn)事件。 2注冊(cè)監(jiān)視器:組件可以使用 addFocusListene

30、r(FocusListener listener) 注冊(cè)焦點(diǎn)事件監(jiān)視器。 3FocusListener接口 : 創(chuàng)建監(jiān)視器的類必須要實(shí)現(xiàn)FocusListener接口,該接口有兩個(gè)方法: public void focusGained(FocusEvent e) public void focusLost(FocusEvent e) 當(dāng)發(fā)生FocusEvent事件時(shí),監(jiān)視器調(diào)用類實(shí)現(xiàn)的接口中的相應(yīng)方法。 4組件也可調(diào)用 public boolean requestFocusInWindow() 方法可以獲得輸入焦點(diǎn)。 第32頁,共54頁。3210.4.7 鍵盤事件 當(dāng)一個(gè)組件處于激活狀態(tài)時(shí),敲

31、擊鍵盤上一個(gè)鍵就導(dǎo)致這個(gè)組件觸發(fā)鍵盤事件。1.某個(gè)組件使用addKeyListener方法注冊(cè)監(jiān)視器。2.接口KeyListener中有如下方法: public void keyPressed(KeyEvent e), public void keyTyped(KeyEvent e), public void KeyReleased(KeyEvent e) 3.相關(guān)方法: public int getKeyCode()判斷哪個(gè)鍵被按下、敲擊或釋放,返回一個(gè)鍵碼值 。 getKeyChar()判斷哪個(gè)鍵被按下、敲擊或釋放,返回鍵上的字符。 參考表10.1 鍵碼表 第33頁,共54頁。33 例題1

32、2代碼鏈接 例子12通過處理鍵盤事件來實(shí)現(xiàn)軟件序列號(hào)的輸入。當(dāng)文本框獲得輸入焦點(diǎn)后,用戶敲擊鍵盤將使得當(dāng)前文本框觸發(fā)KeyEvent事件,在處理事件時(shí),程序檢查文本框中光標(biāo)的位置,如果光標(biāo)已經(jīng)到達(dá)指定位置,就將輸入焦點(diǎn)轉(zhuǎn)移到下一個(gè)文本框。程序運(yùn)行效果如圖10.12。第34頁,共54頁。3410.4.8 窗口事件 JFrame及子類創(chuàng)建的窗口可以調(diào)用 setDefaultCloseOperation(int operation);方法設(shè)置窗口的關(guān)閉方式,Operation取JFrame的static常量:DO_NOTHING_ON_CLOSE(什么也不做)HIDE_ON_CLOSE(隱藏當(dāng)前窗口

33、)DISPOSE_ON_CLOSE(隱藏當(dāng)前窗口,并釋放窗體占有的其它資源)EXIT_ON_CLOSE(結(jié)束窗口所在的應(yīng)用程序) 但是setDefaultCloseOperation方式可能不能滿足程序的需要,比如,用戶單擊窗口上的關(guān)閉圖標(biāo)時(shí),可能程序需要提示用戶是否需要保存窗口中的有關(guān)數(shù)據(jù)到磁盤等 . 這些要通過處理事件來滿足程序的要求。需要注意的是,如果準(zhǔn)備處理窗口事件,必須事先保證窗口的默認(rèn)關(guān)閉方式為DO_NOTHING_ON_CLOSE(什么也不做)。 第35頁,共54頁。351WindowEvent事件源 (1) public void windowActivated(WindowE

34、vent e) 當(dāng)窗口從非激活狀態(tài)到激活時(shí),窗口的監(jiān)視器調(diào)用該方法。(2) public void windowDeactivated(WindowEvent e) 當(dāng)窗口激活狀態(tài)到非激活狀態(tài)時(shí),窗口的監(jiān)視器調(diào)用該方法。(3) public void windowClosing(WindowEvent e) 當(dāng)窗口正在被關(guān)閉時(shí),窗口的監(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)化時(shí),窗口的監(jiān)視

35、器調(diào)用該方法。(6) public void windowDeiconified(WindowEvent e) 當(dāng)窗口撤消圖標(biāo)化時(shí),窗口的監(jiān)視器調(diào)用該方法。(7) public void windowOpened(WindowEvent e) 當(dāng)窗口打開時(shí),窗口的監(jiān)視器調(diào)用該方法。2.WindowListener接口. JFrame是Window的子類,凡是Window子類創(chuàng)建的對(duì)象都可以發(fā)生WindowEvent事件,即窗口事件。第36頁,共54頁。363. WindowAdapter適配器 . 適配器可以代替接口來處理事件,當(dāng)Java提供處理事件的接口中多于一個(gè)方法時(shí),Java相應(yīng)地就提供

36、一個(gè)適配器類,比如WindowAdapter類。適配器已經(jīng)實(shí)現(xiàn)了相應(yīng)的接口,例如WindowAdapter類實(shí)現(xiàn)了WindowListener接口。因此,可以使用WindowAdapte的子類創(chuàng)建的對(duì)象做監(jiān)視器,在子類中重寫所需要的接口方法即可。 例子13(Example10_13.java ) 使用適配器做監(jiān)視器,只處理窗口關(guān)閉事件,因此只需重寫windowColsing方法即可。第37頁,共54頁。3710.4.9 匿名類實(shí)例或窗口做監(jiān)視器 1匿名類的實(shí)例做監(jiān)視器: 匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中仍然有效,當(dāng)發(fā)生事件時(shí),監(jiān)視器就比較容易操作事件源所在的外嵌類中的成員.

37、當(dāng)事件的處理比較簡(jiǎn)單、系統(tǒng)也不復(fù)雜時(shí),使用匿名類做監(jiān)視器是一個(gè)不錯(cuò)的選擇。2窗口做監(jiān)視器: 讓事件源所在的類的實(shí)例作為監(jiān)視器,能讓事件的處理比較方便,這是因?yàn)椋O(jiān)視器可以方便的操作事件源所在的類中的其他成員。當(dāng)事件的處理比較簡(jiǎn)單,系統(tǒng)也不復(fù)雜時(shí),讓事件源所在的類的實(shí)例作為監(jiān)視器是一個(gè)不錯(cuò)的選擇。 例子14Example10_14.java 是一個(gè)猜數(shù)字小游戲 第38頁,共54頁。3810.4.10 事件總結(jié) 1授權(quán)模式 Java的事件處理是基于授權(quán)模式,即事件源調(diào)用調(diào)用方法將某個(gè)對(duì)象注冊(cè)為自己的監(jiān)視器。2接口回調(diào) addXXXListener(XXXListener listener)方法中的

38、參數(shù)是一個(gè)接口,listener可以引用任何實(shí)現(xiàn)了該接口的類所創(chuàng)建的對(duì)象,當(dāng)事件源發(fā)生事件時(shí),接口listener立刻回調(diào)被類實(shí)現(xiàn)的接口中的某個(gè)方法。3.方法綁定 當(dāng)事件源觸發(fā)事件發(fā)生后,監(jiān)視器準(zhǔn)確知道去調(diào)用哪個(gè)方法。4.保持松耦合 當(dāng)事件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個(gè)方法會(huì)被執(zhí)行,但無須關(guān)心到底是哪個(gè)對(duì)象去調(diào)用了這個(gè)方法,因?yàn)槿魏螌?shí)現(xiàn)接口的類的實(shí)例(做為監(jiān)視器)都可以調(diào)用這個(gè)方法來處理事件。 第39頁,共54頁。3910. 5 使用MVC結(jié)構(gòu) 模型-視圖-控制器(Model-View-Controller),簡(jiǎn)稱為MVC。 MVC是一種先進(jìn)的設(shè)計(jì)結(jié)構(gòu),其目的是以會(huì)話形式提供方便的GUI支持。

39、 MVC是一種通過三個(gè)不同部分構(gòu)造一個(gè)軟件或組件的理想辦法:模型(model) 用于存儲(chǔ)數(shù)據(jù)的對(duì)象。視圖(view) 為模型提供數(shù)據(jù)顯示的對(duì)象??刂破?controller)處理用戶的交互操作,對(duì)于用戶的操作作出響應(yīng),讓模型和視圖進(jìn)行必要的交互,即通過視圖修改、獲取模型中的數(shù)據(jù);當(dāng)模型中的數(shù)據(jù)變化時(shí),讓視圖更新顯示。 第40頁,共54頁。40 例題15代碼鏈接 首先編寫一個(gè)封裝三角形的類(模型角色) 然后再編寫一個(gè)窗口。要求窗口使用三文本框和一個(gè)文本區(qū)為三角形對(duì)象中的數(shù)據(jù)提供視圖,其中三個(gè)文本框用來顯示和更新三角形對(duì)象的三個(gè)邊的長(zhǎng)度;文本區(qū)對(duì)象用來顯示三角形的面積。 窗口中有一個(gè)按鈕(控制器角

40、色),用戶單擊該按鈕后,程序用3個(gè)文本框中的數(shù)據(jù)分別作為三角形的三個(gè)邊的長(zhǎng)度,并將計(jì)算出的三角形的面積顯示在文本區(qū)中。程序運(yùn)行效果如圖10.14。第41頁,共54頁。41 10. 6 樹組件與表格組件 10.6.1 樹組件 1DefaultMutableTreeNode節(jié)點(diǎn) DefaultMutableTreeNode類的兩個(gè)常用的構(gòu)造方法是:2樹上的TreeSelectionEvent事件 使用addTreeSelectionListener(TreeSelectionListener listener)方法獲得一個(gè)監(jiān)視器。當(dāng)用鼠標(biāo)單擊樹上的節(jié)點(diǎn)時(shí),系統(tǒng)將自動(dòng)用TreeSelectionEv

41、ent創(chuàng)建一個(gè)事件對(duì)象,通知樹的監(jiān)視器,監(jiān)視器將自動(dòng)調(diào)用TreeSelectionListener接口中的方法。 創(chuàng)建監(jiān)視器的類必須實(shí)現(xiàn)TreeSelectionListener接口,此接口中的方法是 public void valueChanged(TreeSelectionEvent e) 。 樹使用getLastSelectedPathComponent()方法獲取選中的節(jié)點(diǎn)。DefaultMutableTreeNode(Object userObject)DefaultMutableTreeNode(Object userObject,boolean allowChildren)第42

42、頁,共54頁。42 例題16代碼鏈接 例16中節(jié)點(diǎn)中存放的對(duì)象由Goods類(描述商品)創(chuàng)建,當(dāng)用戶選中節(jié)點(diǎn)時(shí),窗口中的文本區(qū)顯示節(jié)點(diǎn)中存放的對(duì)象的有關(guān)信息,程序運(yùn)行效果如圖10.15。 第43頁,共54頁。4310.6.2 表格組件 表格組件以行和列的形式顯示數(shù)據(jù),允許對(duì)表格中的數(shù)據(jù)進(jìn)行編輯。表格的模型功能強(qiáng)大、靈活并易于執(zhí)行。表格是最復(fù)雜的組件,對(duì)于初學(xué)者,這里只介紹默認(rèn)的表格模型。 JTable有7個(gè)構(gòu)造方法,這里介紹常用的三個(gè)。 JTable() 創(chuàng)建默認(rèn)的表格模型。 JTable(int a,int b) 創(chuàng)建a行,b列的默認(rèn)模型表格 JTable (Object data,Obje

43、ct columnName) 創(chuàng)建默認(rèn)表格模型對(duì)象,并且顯示由data指定的二維數(shù)組的值,其列名由數(shù)組columnName指定。 通過對(duì)表格中的數(shù)據(jù)進(jìn)行編輯,可以修改表格中二維數(shù)組data中對(duì)應(yīng)的數(shù)據(jù)數(shù)據(jù)。在表格中輸入或修改數(shù)據(jù)后,需按回車或用鼠標(biāo)單擊表格的單元格確定所輸入或修改的結(jié)果。當(dāng)表格需要刷新顯示時(shí),讓表格調(diào)用repaint方法。第44頁,共54頁。44 例題17代碼鏈接 例子17是一個(gè)成績(jī)單錄入程序(效果如圖10.16),客戶通過一個(gè)表格的單元格輸入學(xué)生的數(shù)學(xué)和英語成績(jī)。單擊按鈕后,將總成績(jī)放入相應(yīng)的表格單元中。因?yàn)镺bject類是所有類的默認(rèn)父類,所以在表格中輸入一個(gè)數(shù)值時(shí)被認(rèn)為是

44、一個(gè)Object對(duì)象。Object類有一個(gè)很有用的方法:toString(),它可以得到對(duì)象的字符串表示 。 第45頁,共54頁。4510. 7 按鈕綁定到鍵盤_1 1AbstractAction類與特殊的監(jiān)視器 Java對(duì)監(jiān)視按鈕的鍵盤操作的監(jiān)視器的要求:要求創(chuàng)建監(jiān)視器的類必須實(shí)現(xiàn)ActionListener接口的子接口Action。 如果按鈕通過addActionListener()方法注冊(cè)的監(jiān)視器和程序?yàn)榘粹o的鍵盤操作指定的監(jiān)視器是同一個(gè)監(jiān)視器,那么用戶直接敲擊某個(gè)鍵就可代替用鼠標(biāo)單擊該按鈕所產(chǎn)生的效果,這也就是人們通常理解的按鈕的鍵盤綁定。 抽象類javax.swing.Abstrac

45、tAction類已經(jīng)實(shí)現(xiàn)了Action接口,因?yàn)榇蟛糠謶?yīng)用不需要實(shí)現(xiàn)Action中的其他方法,因此編寫AbstractAction類的子類時(shí),只要重寫public void actionPerform(ActionEvent e) 方法即可。 為按鈕的鍵盤操作指定了監(jiān)視器后,用戶只要敲擊相應(yīng)的鍵,監(jiān)視器就執(zhí)行actionPerformed()方法。第46頁,共54頁。4610. 7 按鈕綁定到鍵盤_2 2指定監(jiān)視器的步驟 以下假設(shè)按鈕是button,listener是AbstractAction類的子類的實(shí)例。(1)獲取輸入映射按鈕首先調(diào)用 public final InputMap getI

46、nputMap(int condition) 方法返回一個(gè)InputMap對(duì)象,其中參數(shù)condition取值JComponent類的下列static常量:WHEN_FOCUSED(僅在擊鍵發(fā)生、同時(shí)組件具有焦點(diǎn)時(shí)才調(diào)用操作),WHEN_IN_FOCUSED_WINDOW(當(dāng)擊鍵發(fā)生、同時(shí)組件具有焦點(diǎn)時(shí),或者組件處于具有焦點(diǎn)的窗口中時(shí)調(diào)用操作。注意,只要窗口中的任意組件具有焦點(diǎn),就調(diào)用向此組件注冊(cè)的操作),WHEN_ANCESTOR_OF_FOCUSED_COMPONENT(當(dāng)擊鍵發(fā)生、同時(shí)組件具有焦點(diǎn)時(shí),或者該組件是具有焦點(diǎn)的組件的祖先時(shí)調(diào)用該操作)。例如:InputMap inputmap

47、 = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);(2)綁定按鈕的鍵盤操作 返回的輸入映射首先調(diào)用方法public void put(KeyStroke keyStroke,Object actionMapKey)將敲擊鍵盤上的某鍵指定為按鈕的鍵盤操作,并為該操作指定一個(gè)Object類型的映射關(guān)鍵字,例如:inputmap.put(KeyStroke.getKeyStroke(A),dog);(3)為按鈕的鍵盤操作指定監(jiān)視器 按鈕調(diào)用方法public final ActionMap getActionMap()返回一個(gè)ActionMap對(duì)象:ActionMap actionmap = button.getActionMap();然后該對(duì)象actionmap調(diào)用方法public void put(Object key,Action action) 為按鈕的鍵盤操作指定監(jiān)視器,例如:actionmap.put(dog,listener);第47頁,共54頁。47 例題18代碼鏈接例子18中,用鼠標(biāo)單擊按鈕或敲擊鍵盤的A鍵,程序?qū)⒁苿?dòng)按鈕。 第48頁,共54頁。4810. 7 按鈕綁定到鍵盤_3 3注意事項(xiàng) 實(shí)際上,為按鈕的鍵盤操作指定的監(jiān)視器和按鈕本身使用addActionLister方法注冊(cè)的監(jiān)

溫馨提示

  • 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)論