JAVA 圖形用戶界面設(shè)計(jì).ppt
《JAVA 圖形用戶界面設(shè)計(jì).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《JAVA 圖形用戶界面設(shè)計(jì).ppt(73頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第15章圖形用戶界面設(shè)計(jì),,15.1JavaSwing概述,Java的java.awt包,即Java抽象窗口工具包(AWT:AbstractWindowToolkit)提供了許多用來(lái)設(shè)計(jì)GUI的組件類(lèi)在學(xué)習(xí)GUI編程時(shí),必須很好地理解掌握兩個(gè)概念:容器類(lèi)(Container)和組件類(lèi)(Component)。javax.swing包中JComponent類(lèi)是java.awt包中Container類(lèi)的一個(gè)直接子類(lèi)、是Component類(lèi)的一個(gè)間接子類(lèi),學(xué)習(xí)GUI編程主要是學(xué)習(xí)掌握使用Component類(lèi)的一些重要的子類(lèi)。,,Java把Component類(lèi)的子類(lèi)或間接子類(lèi)創(chuàng)建的對(duì)象稱為一個(gè)組件。Java把Container的子類(lèi)或間接子類(lèi)創(chuàng)建的對(duì)象稱為一個(gè)容器。可以向容器添加組件。Container類(lèi)提供了一個(gè)public方法:add(),一個(gè)容器可以調(diào)用這個(gè)方法將組件添加到該容器中。容器調(diào)用removeAll()方法可以移掉容器中的全部組件;調(diào)用remove(Componentc)方法可以移掉容器中參數(shù)c指定的組件。注意到容器本身也是一個(gè)組件,因此可以把一個(gè)容器添加到另一個(gè)容器中實(shí)現(xiàn)容器的嵌套。,,,15.2窗口,Java提供的JFrame類(lèi)的實(shí)例就是一個(gè)底層容器(JDialog類(lèi)的實(shí)例也是一個(gè)底層容器,見(jiàn)后面的15.6),即通常所稱的窗口。其他組件必須被添加到底層容器中,以便借助這個(gè)地層容器和操作系統(tǒng)進(jìn)行信息交互JFrame類(lèi)是Container類(lèi)的間接子類(lèi)。當(dāng)需要一個(gè)窗口時(shí),可使用JFrame或其子類(lèi)創(chuàng)建一個(gè)對(duì)象,15.2.1JFrame常用方法,JFrame()創(chuàng)建一個(gè)無(wú)標(biāo)題的窗口。JFrame(Strings)創(chuàng)建標(biāo)題為s的窗口。publicvoidsetVisible(booleanb)設(shè)置窗口是否可見(jiàn),窗口默認(rèn)是不可見(jiàn)的。publicvoiddispose()撤消當(dāng)前窗口,并釋放當(dāng)前窗口所使用的資源。publicvoidsetDefaultCloseOperation(intoperation)該方法用來(lái)設(shè)置單擊窗體右上角的關(guān)閉圖標(biāo)后,程序會(huì)做出怎樣的處理。,15.2.2菜單條、菜單、菜單項(xiàng),窗口中的菜單條、菜單、菜單項(xiàng)是我們所熟悉的組件,菜單放在菜單條里,菜單項(xiàng)放在菜單里。,,1.菜單條JComponent類(lèi)的子類(lèi)JMenubar負(fù)責(zé)創(chuàng)建菜單條,即JMenubar的一個(gè)實(shí)例就是一個(gè)菜單條。JFrame類(lèi)有一個(gè)將菜單條放置到窗口中的方法:setJMenuBar(JMenuBarbar);該方法將菜單條添加到窗口的頂端,需要注意的是,只能向窗口添加一個(gè)菜單條。,,2.菜單JComponent類(lèi)的子類(lèi)JMenu負(fù)責(zé)創(chuàng)建菜單,即JMenu的一個(gè)實(shí)例就是一個(gè)菜單。3.菜單項(xiàng)JComponent類(lèi)的子類(lèi)JMenuItem負(fù)責(zé)創(chuàng)建菜單項(xiàng),即JMenuItem的一個(gè)實(shí)例就是一個(gè)菜單項(xiàng)。,,4.嵌入子菜單JMenu是JMenuItem的子類(lèi),因此菜單本身也是一個(gè)菜單項(xiàng),當(dāng)把一個(gè)菜單看作菜單項(xiàng)添加到某個(gè)菜單中時(shí),稱這樣的菜單為子菜單。5.菜單上的圖標(biāo)圖15.3帶菜單的窗口為了使菜單項(xiàng)有一個(gè)圖標(biāo),可以用圖標(biāo)類(lèi)Icon聲明一個(gè)圖標(biāo),然后使用其子類(lèi)ImageIcon類(lèi)創(chuàng)建一個(gè)圖標(biāo),15.3常用組件與布局,可以使用JComponent的子類(lèi)JTextField創(chuàng)建文本框。文本框的特點(diǎn)是允許用戶在文本框中輸入單行文本。,15.3.1常用組件,1.文本框使用JComponent的子類(lèi)JTextField創(chuàng)建文本框,允許用戶在文本框中輸入單行文本。2.文本區(qū)使用JComponent的子類(lèi)JTexArea創(chuàng)建文本區(qū),允許用戶在文本區(qū)中輸入多行文本。3.按鈕使用JComponent的子類(lèi)JButton類(lèi)用來(lái)創(chuàng)建按鈕,允許用戶單擊按鈕。,,4.標(biāo)簽使用JComponent的子類(lèi)JLabel類(lèi)用來(lái)創(chuàng)建標(biāo)簽,標(biāo)簽為用戶提供信息提示。5.選擇框使用JComponent的子類(lèi)JCheckBox類(lèi)用來(lái)創(chuàng)建選擇框,為用戶提供多項(xiàng)選擇。選擇框的右面有個(gè)名字,并提供兩種狀態(tài),一種是選中,另一種是未選中,用戶通過(guò)單擊該組件切換狀態(tài)。6.單選按鈕使用JComponent的子類(lèi)JRadioButton類(lèi)用來(lái)創(chuàng)建單項(xiàng)選擇框,為用戶提供單項(xiàng)選擇。,,7.下拉列表使用JComponent的子類(lèi)JComboBox類(lèi)用來(lái)創(chuàng)建下拉列表,為用戶提供單項(xiàng)選擇。用戶可以在下拉列表看到第一個(gè)選項(xiàng)和它旁邊的箭頭按鈕,當(dāng)用戶單擊箭頭按鈕時(shí),選項(xiàng)列表打開(kāi)。8.密碼框可以使用JComponent的子類(lèi)JPasswordField創(chuàng)建密碼框。允許用戶在密碼框中輸入單行密碼,密碼框的默認(rèn)回顯字符是*。密碼框可以使用setEchoChar(charc)重新設(shè)置回顯字符,用戶輸入密碼時(shí),密碼框只顯示回顯字符。密碼框調(diào)用char[]getPassword()方法可以返回實(shí)際的密碼。,15.3.2常用容器,1.JPanel面板我們會(huì)經(jīng)常使用JPanel創(chuàng)建一個(gè)面板,再向這個(gè)面板添加組件,然后把這個(gè)面板添加到其它容器中。JPanel面板的默認(rèn)布局是FlowLayout布局。2.滾動(dòng)窗格JScrollPane滾動(dòng)窗格只可以添加一個(gè)組件,可以把一個(gè)組件放到一個(gè)滾動(dòng)窗格中,然后通過(guò)滾動(dòng)條來(lái)該組件。JTextArea不自帶滾動(dòng)條,因此我們就需要把文本區(qū)放到一個(gè)滾動(dòng)窗格中,,3.拆分窗格JSplitPane顧名思義,拆分窗格就是被分成兩部分的容器。拆分窗格有兩種類(lèi)型:水平拆分和垂直拆分。水平拆分窗格用一條拆分線把窗格分成左右兩部分,左面放一個(gè)組件,右面放一個(gè)組件,拆分線可以水平移動(dòng)。垂直拆分窗格用一條拆分線把窗格分成上下兩部分,上面放一個(gè)組件,下面放一個(gè)組件,拆分線可以垂直移動(dòng)。,,JSplitPane的兩個(gè)常用的構(gòu)造方法:JSplitPane(inta,Componentb,Componentc)參數(shù)a取JSplitPane的靜態(tài)常量HORIZONTAL_SPLIT或VERTICAL_SPLIT,以決定是水平還是垂直拆分。后兩個(gè)參數(shù)決定要放置的組件。當(dāng)拆分線移動(dòng)時(shí),組件不是連續(xù)變化的。JSplitPane(inta,booleanb,Componentc,Componentd)參數(shù)a取JSplitPane的靜態(tài)常量HORIZONTAL_SPLIT或VERTICAL_SPLIT,以決定是水平還是垂直拆分。參數(shù)b決定當(dāng)拆分線移動(dòng)時(shí),組件是否連續(xù)變化(true是連續(xù)),后兩個(gè)參數(shù)決定要放置的組件。,,4.JLayeredPane分層窗格如果添加到容器中的組件經(jīng)常需要處理重疊問(wèn)題,就可以考慮將組件添加到分層窗格。分層窗格分成5個(gè)層,分層窗格使用add(Jcomponentcom,intlayer);添加組件com,并指定com所在的層,其中參數(shù)layer取值JLayeredPane類(lèi)中的類(lèi)常量:DEFAULT_LAYER、PALETTE_LAYER、MODAL_LAYER、POPUP_LAYER、DRAG_LAYER,15.3.3常用布局,容器可以使用方法:setLayout(布局對(duì)象);設(shè)置自己的布局。,,1.FlowLayout布局FlowLayout類(lèi)創(chuàng)建的對(duì)象稱做FlowLayout型布局。FlowLayout型布局是JPanel型容器的默認(rèn)布局,即JPanel及其子類(lèi)創(chuàng)建的容器對(duì)象,如果不專門(mén)為其指定布局,則它們的布局就是FlowLayout型布局。FlowLayout類(lèi)的一個(gè)常用構(gòu)造方法如下:FlowLayout();該構(gòu)造方法可以創(chuàng)建一個(gè)居中對(duì)齊的布局對(duì)象,,如果一個(gè)容器con使用這個(gè)布局對(duì)象:con.setLayout(flow);那么,con可以使用Container類(lèi)提供的add方法將組件順序地添加到容器中,組件按照加入的先后順序從左向右排列,一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列,每一行中的組件都居中排列,組件之間的默認(rèn)水平和垂直間隙是5個(gè)像素。組件的大小為默認(rèn)的最佳大小,,對(duì)于添加到使用FlowLayout布局的容器中的組件,組件調(diào)用setSize(intx,inty)設(shè)置的大小無(wú)效,如果需要改變最佳大小,組件需調(diào)用:publicvoidsetPreferredSize(DimensionpreferredSize)設(shè)置大小,,FlowLayout布局對(duì)象調(diào)用setAlignment(intaligin)方法可以重新設(shè)置布局的對(duì)齊方式,其中aligin可以取值:FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHTFlowLayout布局對(duì)象調(diào)用setHgap(inthgap)方法和setVgap(intvgap)可以重新設(shè)置水平間隙和垂直間隙,,2.BorderLayout布局BorderLayout布局是Window型容器的默認(rèn)布局,例如JFrame、JDialog都是Window類(lèi)的子類(lèi),它們的默認(rèn)布局都是BorderLayout布局。BorderLayout也是一種簡(jiǎn)單的布局策略,如果一個(gè)容器使用這種布局,那么容器空間簡(jiǎn)單地劃分為東、西、南、北、中五個(gè)區(qū)域,中間的區(qū)域最大。每加入一個(gè)組件都應(yīng)該指明把這個(gè)組件加在哪個(gè)區(qū)域中,區(qū)域由BorderLayout中的靜態(tài)常量CENTER、NORTH、SOUTH、WEST、EAST表示,,每個(gè)區(qū)域只能放置一個(gè)組件,如果向某個(gè)已放置了組件的區(qū)域再放置一個(gè)組件,那么先前的組件將被后者替換掉。使用BorderLayout布局的容器最多能添加5個(gè)組件,如果容器中需要加入超過(guò)5個(gè)組件,就必須使用容器的嵌套或改用其它的布局策略。,,3.CardLayout布局使用CardLayout的容器可以容納多個(gè)組件,這些組件被層疊放如容器中,最先加入容器的是第一張(在最上面),依次向下排序。使用該布局的特點(diǎn)是,同一時(shí)刻容器只能從這些組件中選出一個(gè)來(lái)顯示,就像疊“撲克牌”,每次只能顯示其中的一張,這個(gè)被顯示的組件將占據(jù)所有的容器空間。,,假設(shè)有一個(gè)容器con,那么,使用CardLayout的一般步驟如下:創(chuàng)建CardLayout對(duì)象作為布局,使用容器的setLayout()方法為容器設(shè)置布局,容器調(diào)用add(Strings,Componentb)將組件b加入容器,并給出了顯示該組件的代號(hào)s。組件的代號(hào)是一個(gè)字符串,和組件的名字沒(méi)有必然聯(lián)系,但是,不同的組件代號(hào)必須互不相同。最先加入con的是第一張,依次排序。創(chuàng)建的布局card用CardLayout類(lèi)提供的show()方法,顯示容器con中組件代號(hào)為s的組件:card.show(con,s);,,3.GridLayout布局GridLayout是使用較多的布局編輯器,其基本布局策略是把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來(lái)的小格中。GridLayout比較靈活,劃分多少網(wǎng)格由程序自由控制,而且組件定位也比較精確,使用GridLayout布局編輯器的一般步驟如下:使用GridLayout的構(gòu)造方法GridLayout(intm,intn)創(chuàng)建布局對(duì)象,指定劃分網(wǎng)格的行數(shù)m和列數(shù)n,使用GridLayout布局的容器調(diào)用方法add(Componentc)將組件c加入容器,組件進(jìn)入容器的順序?qū)凑盏谝恍械谝粋€(gè)、第一行第二個(gè)、…第一行最后一個(gè)、第二行第一個(gè)、…最后一行第一個(gè)、…最后一行最后一個(gè)。,,使用GridLayout布局的容器最多可添加mn個(gè)組件。GridLayout布局中每個(gè)網(wǎng)格都是相同大小并且強(qiáng)制組件與網(wǎng)格的大小相同。,,5.BoxLayout布局用BoxLayout類(lèi)可以創(chuàng)建一個(gè)布局對(duì)象,稱為盒式布局。BoxLayout在javax.swing.border包中。javax.swing包提供了Box類(lèi),該類(lèi)也是Container類(lèi)的一個(gè)子類(lèi),創(chuàng)建的容器稱作一個(gè)盒式容器,盒式容器的的默認(rèn)布局是盒式布局,而且不允許更改盒式容器的布局。因此,在策劃程序的布局時(shí),可以利用容器的嵌套,將某個(gè)容器嵌入幾個(gè)盒式容器,達(dá)到你的布局目的。,,使用盒式布局的容器將組件排列在一行或一列,這取決于創(chuàng)建盒式布局對(duì)象時(shí),是否指定了是行排列還是列排列。使用BoxLayou的構(gòu)造方法BoxLayout(Containercon,,intaxis)可以創(chuàng)建一個(gè)盒式布局對(duì)象,,行型盒式布局容器中添加的組件的上沿在同一水平線上。列型盒式布局容器中添加的組件的左沿在同一垂直線上。容器的目的是向其添加組件,并根據(jù)需要設(shè)置合理的布局。如果需要一個(gè)盒式布局的容器,可以使用Box類(lèi)的類(lèi)(靜態(tài))方法createHorizontalBox()獲得一個(gè)具有行型盒式布局的盒式容器;使用Box類(lèi)的類(lèi)(靜態(tài))方法createVerticalBox()獲得一個(gè)具有列型盒式布局的盒式容器。如果想控制盒式布局容器中組件之間的距離,就需要使用水平支撐組件或垂直支撐組件。,,Box類(lèi)調(diào)用靜態(tài)方法createHorizontalStrut(intwidth)可以得到一個(gè)不可見(jiàn)的水平Struct對(duì)象,稱做水平支撐。該水平支撐的高度為0,寬度是width。Box類(lèi)調(diào)用靜態(tài)方法createVertialStrut(intheight)可以得到一個(gè)不可見(jiàn)的垂直Struct對(duì)象,稱做垂直支撐。參數(shù)height決定垂直支撐的高度,垂直支撐的寬度為0。一個(gè)行型盒式布局的容器,可以在組件之間插入水平支撐來(lái)控制組件之間的距離。一個(gè)列型盒式布局的容器,可以在組件之間插入垂直支撐來(lái)控制組件之間的距離,,6.null布局可以把一個(gè)容器的布局設(shè)置為null布局(空布局)??詹季秩萜骺梢詼?zhǔn)確地定位組件在容器的位置和大小。setBounds(inta,intb,intwidth,intheight)方法是所有組件都擁有的一個(gè)方法,組件調(diào)用該方法可以設(shè)置本身的大小和在容器中的位置。,15.4處理事件,15.4.1事件處理模式1.事件源能夠產(chǎn)生事件的對(duì)象都可以成為事件源,如文本框、按鈕、下拉式列表等。也就是說(shuō),事件源必須是一個(gè)對(duì)象,而且這個(gè)對(duì)象必須是Java認(rèn)為能夠發(fā)生事件的對(duì)象。,,2.監(jiān)視器。我們需要一個(gè)對(duì)象對(duì)事件源進(jìn)行監(jiān)視,以便對(duì)發(fā)生的事件作出處理。事件源通過(guò)調(diào)用相應(yīng)的方法將某個(gè)對(duì)象注冊(cè)為自己的監(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è)方法來(lái)處理事件。那么監(jiān)視器去調(diào)用哪個(gè)方法呢?我們已經(jīng)知道,對(duì)象可以調(diào)用創(chuàng)建它的那個(gè)類(lèi)中的方法,那么它到底調(diào)用該類(lèi)中的哪個(gè)方法呢?Java規(guī)定:為了讓監(jiān)視器這個(gè)對(duì)象能對(duì)事件源發(fā)生的事件進(jìn)行處理,創(chuàng)建該監(jiān)視器對(duì)象的類(lèi)必須聲明實(shí)現(xiàn)相應(yīng)的接口,即必須在類(lèi)體中重寫(xiě)接口中所有方法,那么當(dāng)事件源發(fā)生事件時(shí),監(jiān)視器就自動(dòng)調(diào)用被類(lèi)重寫(xiě)的某個(gè)接口方法。,,,15.4.2ActionEvent事件,1.ActionEvent事件源文本框、按紐、菜單項(xiàng)、密碼框和單選按紐都可以觸發(fā)ActionEvent事件,即都可以成為ActionEvent事件的事件源。比如,對(duì)于注冊(cè)了監(jiān)視器的文本框,在文本框獲得輸入焦點(diǎn)后,如果用戶按回車(chē)鍵,Java運(yùn)行環(huán)境就自動(dòng)用ActionEvent類(lèi)創(chuàng)建一個(gè)對(duì)象,即觸發(fā)ActionEvent事件;對(duì)于注冊(cè)了監(jiān)視器的按紐,如果用戶按單擊按紐,就會(huì)觸發(fā)ActionEvent事件;對(duì)于注冊(cè)了監(jiān)視器的菜單項(xiàng),如果用戶按選中該菜單項(xiàng),就會(huì)觸發(fā)ActionEvent事件;如果用戶按選擇了某個(gè)單選按紐,就會(huì)觸發(fā)ActionEvent事件。,,2.注冊(cè)監(jiān)視器能觸發(fā)ActionEvent事件的組件使用addActiomListener(ActionListenerlisten)將實(shí)現(xiàn)ActionListener接口的類(lèi)的實(shí)例注冊(cè)為事件源的監(jiān)視器。,,3.ActionListener接口ActionListener接口在java.awt.event包中,該接口中只有一個(gè)方法:publicvoidactionPerformed(ActinEvente)事件源觸發(fā)ActionEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ActionEvent事件,然后調(diào)用接口中的方法:actionPerformed(ActinEvente)對(duì)發(fā)生的事件作出處理。當(dāng)監(jiān)視器調(diào)用actionPerformed(ActinEvente)方法時(shí),ActionEvent類(lèi)事先創(chuàng)建的事件對(duì)象就會(huì)傳遞給該方法的參數(shù)e。,,4.ActionEvent類(lèi)中的方法ActionEvent類(lèi)有如下常用的方法:publicObjectgetSource()publicStringgetActionCommand(),15.4.3ItemEvent事件,1.ItemEvent事件源選擇框、下拉列表都可以觸發(fā)ItemEvent事件。選擇框提供兩種狀態(tài),一種是選中,另一種是未選中,對(duì)于注冊(cè)了監(jiān)視器的選擇框,當(dāng)用戶的操作使得選擇框從未選中狀態(tài)變成選中狀態(tài)或從選中狀態(tài)變成未選中狀態(tài)時(shí)就觸發(fā)ItemEvent事件;同樣,對(duì)于注冊(cè)了監(jiān)視器的下拉列表,如果用戶按選中下拉列表中的某個(gè)選項(xiàng),就會(huì)觸發(fā)ItemEvent事件。,,2.注冊(cè)監(jiān)視器能觸發(fā)ItemEvent事件的組件使用addItemListener(ItemListenerlisten)將實(shí)現(xiàn)ItemListener接口的類(lèi)的實(shí)例注冊(cè)為事件源的監(jiān)視器。,,3.ItemListener接口ItemListener接口在java.awt.event包中,該接口中只有一個(gè)方法:publicvoiditemStateChanged(ItemEvente)事件源觸發(fā)ItemEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ItemEvent事件,然后調(diào)用接口中的方法:itemStateChanged(ItemEvente)對(duì)發(fā)生的事件作出處理。當(dāng)監(jiān)視器調(diào)用itemStateChanged(ItemEvente)方法時(shí),ItemEvent類(lèi)事先創(chuàng)建的事件對(duì)象就會(huì)傳遞給該方法的參數(shù)e。ItemEvent事件對(duì)象除了可以使用getSource()方法返回發(fā)生Itemevent事件的事件源外,也可以使用getItemSelectable()方法返回發(fā)生Itemevent事件的事件源。,15.4.4DocumentEvent事件,1.DocumentEvent事件源文本區(qū)含有一個(gè)實(shí)現(xiàn)Document接口的實(shí)例,該實(shí)例被稱做文本區(qū)所維護(hù)的文檔,文本區(qū)調(diào)用getDocument()方法返回所維護(hù)的文檔。文本區(qū)所維護(hù)的文檔能觸發(fā)DocumentEvent事件。需要特別注意的是,DocumentEvent不在java.awt.event包中,而是在javax.swing.event包中。用戶在文本區(qū)中進(jìn)行文本編輯操作,使得文本區(qū)中的文本區(qū)內(nèi)容發(fā)生變化,將導(dǎo)致文本區(qū)所維護(hù)的文檔模型中的數(shù)據(jù)發(fā)生變化,從而導(dǎo)致文本區(qū)所維護(hù)的文檔觸發(fā)DocumentEvent事件。,,2.注冊(cè)監(jiān)視器能觸發(fā)DocumentEven事件的事件源使用addDucumentListener(DocumentListenerlisten)將實(shí)現(xiàn)DocumentListener接口的類(lèi)的實(shí)例注冊(cè)為事件源的監(jiān)視器。,,3.DocumentListener接口DocumentListener接口在java.swing.event包中,該接口中有三個(gè)方法:publicvoidchangedUpdate(DocumentEvente)publicvoidremoveUpdate(DocumentEvente)publicvoidinsertUpdate(DocumentEvente)事件源觸發(fā)DucumentEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的DocumentEvent事件,然后調(diào)用接口中的相應(yīng)方法對(duì)發(fā)生的事件作出處理。,15.4.5MouseEvent事件,1.使用MouseListener接口處理鼠標(biāo)事件使用MouseListener接口可以處理以下5種操作觸發(fā)的鼠標(biāo)事件:在事件源上按下鼠標(biāo)鍵。在事件源上釋放鼠標(biāo)鍵。在事件源上擊鼠標(biāo)鍵。鼠標(biāo)進(jìn)入事件源。鼠標(biāo)退出事件源。,,MouseEvent中有下列幾個(gè)重要的方法:getX()獲取鼠標(biāo)指針在事件源坐標(biāo)系中的x-坐標(biāo)。getY()獲取鼠標(biāo)指針在事件源坐標(biāo)系中的y-坐標(biāo)。getModifiers()獲取鼠標(biāo)的左鍵或右鍵。鼠標(biāo)的左鍵和右鍵分別使用InputEvent類(lèi)中的常量BUTTON1_MASK和BUTTON3_MASK來(lái)表示。getClickCount()獲取鼠標(biāo)被單擊的次數(shù)。getSource()獲取發(fā)生鼠標(biāo)事件的事件源。,,事件源注冊(cè)監(jiān)視器的方法是addMouseListener(MouseListenerlistener)。MouseListener接口中有如下方法:mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent),,2.使用MouseMotionListener接口處理鼠標(biāo)事件使用MouseMotionListener接口可以處理以下兩種操作觸發(fā)的鼠標(biāo)事件。在事件源上拖動(dòng)鼠標(biāo)在事件源上移動(dòng)鼠標(biāo)鼠標(biāo)事件的類(lèi)型是MouseEvent,即當(dāng)發(fā)生鼠標(biāo)事件時(shí),MouseEvent類(lèi)自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。,,事件源注冊(cè)監(jiān)視器的方法是addMouseMotionListener(監(jiān)視器MotionListenerlistener)。MouseMotionListener接口中有如下方法。mouseDragged(MouseEvent)mouseMoved(MouseEvent),15.4.6焦點(diǎn)事件,組件可以觸發(fā)焦點(diǎn)事件。組件可以使用addFocusListener(FocusListenerlistener)注冊(cè)焦點(diǎn)事件監(jiān)視器。當(dāng)組件獲得焦點(diǎn)監(jiān)視器后,如果組件從無(wú)輸入焦點(diǎn)變成有輸入焦點(diǎn)或從有輸入焦點(diǎn)變成無(wú)輸入焦點(diǎn)都會(huì)觸發(fā)FocusEvent事件。,,創(chuàng)建監(jiān)視器的類(lèi)必須要實(shí)現(xiàn)FocusListener接口,該接口有兩個(gè)方法:publicvoidfocusGained(FocusEvente)publicvoidfocusLost(FocusEvente),,用戶通過(guò)單擊組件可以使得該組件有輸入焦點(diǎn),同時(shí)也使得其它組件變成無(wú)輸入焦點(diǎn)。一個(gè)組件也可調(diào)用publicbooleanrequestFocusInWindow()方法可以獲得輸入焦點(diǎn)。,15.4.7鍵盤(pán)事件,當(dāng)按下、釋放或敲擊鍵盤(pán)上一個(gè)鍵時(shí)就觸發(fā)了鍵盤(pán)事件,在Java事件模式中,必須要有發(fā)生事件的事件源。當(dāng)一個(gè)組件處于激活狀態(tài)時(shí),敲擊鍵盤(pán)上一個(gè)鍵就導(dǎo)致這個(gè)組件觸發(fā)鍵盤(pán)事件。使用KeyListener接口處理鍵盤(pán)事件,該中有如下3個(gè)方法。publicvoidkeyPressed(KeyEvente)publicvoidkeyTyped(KeyEvente)publicvoidKeyReleased(KeyEvente),15.4.8匿名類(lèi)實(shí)例或窗口做監(jiān)視器,讓事件源所在的類(lèi)的實(shí)例作為監(jiān)視器,能讓事件的處理比較方便,這是因?yàn)?,監(jiān)視器可以方便的操作事件源所在的類(lèi)中的其他成員。當(dāng)事件的處理比較簡(jiǎn)單,系統(tǒng)也不復(fù)雜時(shí),讓事件源所在的類(lèi)的實(shí)例作為監(jiān)視器是一個(gè)不錯(cuò)的選擇。但是,當(dāng)事件的處理比較復(fù)雜時(shí),使用當(dāng)前窗口會(huì)讓系統(tǒng)缺乏彈性,因?yàn)槊慨?dāng)修改處理事件的代碼時(shí)都將導(dǎo)致事件源所在的類(lèi)的代同時(shí)被編譯,反之也是。,15.4.9事件總結(jié),1.授權(quán)模式Java的事件處理是基于授權(quán)模式,即事件源調(diào)用調(diào)用方法將某個(gè)對(duì)象注冊(cè)為自己的監(jiān)視器。2.接口回調(diào)Java語(yǔ)言使用接口回調(diào)技術(shù)實(shí)現(xiàn)處理事件的過(guò)程。addXXXListener(XXXListenerlistener)方法中的參數(shù)是一個(gè)接口,listener可以引用任何實(shí)現(xiàn)了該接口的類(lèi)所創(chuàng)建的對(duì)象,當(dāng)事件源發(fā)生事件時(shí),接口listener立刻回調(diào)被類(lèi)實(shí)現(xiàn)的接口中的某個(gè)方法。,,3.方法綁定從方法綁定角度看,Java將某種事件的處理綁定到對(duì)應(yīng)的接口,即綁定到接口中的方法,也就是說(shuō),當(dāng)事件源觸發(fā)事件發(fā)生后,監(jiān)視器準(zhǔn)確知道去調(diào)用哪個(gè)方法。,,4.保持松藕合監(jiān)視器和事件源應(yīng)當(dāng)保持是一種松藕合關(guān)系,也就是說(shuō)盡量讓事件源所在的類(lèi)和監(jiān)視器是組合關(guān)系,盡量不要讓事件源所在的類(lèi)的實(shí)例、以及它的子類(lèi)的實(shí)例或內(nèi)部類(lèi)、匿名類(lèi)的實(shí)例做監(jiān)視器。也就是說(shuō),當(dāng)事件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個(gè)方法會(huì)被執(zhí)行,但無(wú)須關(guān)心到底是哪個(gè)對(duì)象去調(diào)用了這個(gè)方法,因?yàn)槿魏螌?shí)現(xiàn)接口的類(lèi)的實(shí)例(做為監(jiān)視器)都可以調(diào)用這個(gè)方法來(lái)處理事件。,15.5使用MVC結(jié)構(gòu),MVC是一種通過(guò)三個(gè)不同部分構(gòu)造一個(gè)軟件或組件的理想辦法:模型(model)用于存儲(chǔ)數(shù)據(jù)的對(duì)象。視圖(view)為模型提供數(shù)據(jù)顯示的對(duì)象??刂破鳎╟ontroller)處理用戶的交互操作,對(duì)于用戶的操作作出響應(yīng),讓模型和視圖進(jìn)行必要的交互,即通過(guò)視圖修改、獲取模型中的數(shù)據(jù);當(dāng)模型中的數(shù)據(jù)變化時(shí),讓視圖更新顯示。,15.6對(duì)話框,JDialog類(lèi)和JFrame都是Window的子類(lèi),二者的實(shí)例都是底層容器,但二者有相似之處也有不同的地方,主要區(qū)別是,JDialog類(lèi)創(chuàng)建的對(duì)話框必須要依賴于某個(gè)窗口。對(duì)話框分為無(wú)模式和有模式兩種。如果一個(gè)對(duì)話框是有模式的對(duì)話框,那么當(dāng)這個(gè)對(duì)話框處于激活狀態(tài)時(shí),只讓程序響應(yīng)對(duì)話框內(nèi)部的事件,而且將堵塞其它線程的執(zhí)行,用戶不能再激活對(duì)話框所在程序中的其它窗口,直到該對(duì)話框消失不可見(jiàn)。無(wú)模式對(duì)話框處于激活狀態(tài)時(shí),能再激活其它窗口,也不堵塞其它線程的執(zhí)行。,15.6.1消息對(duì)話框,消息對(duì)話框是有模式對(duì)話框,進(jìn)行一個(gè)重要的操作動(dòng)作之前,最好能彈出一個(gè)消息對(duì)話框??梢杂胘avax.swing包中的JOptionPane類(lèi)的靜態(tài)方法:publicstaticvoidshowMessageDialog(ComponentparentComponent,Stringmessage,Stringtitle,intmessageType)創(chuàng)建一個(gè)消息對(duì)話框,15.6.2輸入對(duì)話框,輸入對(duì)話框含有供用戶輸入文本的文本框、一個(gè)確認(rèn)和取消按鈕,是有模式對(duì)話框。當(dāng)輸入對(duì)話框可見(jiàn)時(shí),要求用戶輸入一個(gè)字符串。javax.swing包中的JOptionPane類(lèi)的靜態(tài)方法:publicstaticStringshowInputDialog(ComponentparentComponent,Objectmessage,Stringtitle,intmessageType)可以創(chuàng)建一個(gè)輸入對(duì)話框,15.6.3確認(rèn)對(duì)話框,確認(rèn)對(duì)話框是有模式對(duì)話框,可以用javax.swing包中的JOptionPane類(lèi)的靜態(tài)方法:publicstaticintshowConfirmDialog(ComponentparentComponent,Objectmessage,Stringtitle,intoptionType)得到一個(gè)確認(rèn)對(duì)話框,15.6.4顏色對(duì)話框,可以用javax.swing包中的JColorChooser類(lèi)的靜態(tài)方法:publicstaticColorshowDialog(Componentcomponent,Stringtitle,ColorinitialColor)創(chuàng)建一個(gè)有模式的顏色對(duì)話框,15.6.5文件對(duì)話框,文件對(duì)話框是一個(gè)從文件中選擇文件的界面。javax.swing包中的JFileChooser類(lèi)可以創(chuàng)建文件對(duì)話框,使用該類(lèi)的構(gòu)造方法JFileChooser()創(chuàng)建初始不可見(jiàn)的有模式的文件對(duì)話框。然后文件對(duì)話框調(diào)用下述2個(gè)方法:showSaveDialog(Componenta);showOpenDialog(Componenta);都可以使得對(duì)話框可見(jiàn),只是呈現(xiàn)的外觀有所不同,showSaveDialog方法提供保存文件的界面,showOpenDialog方法提供打開(kāi)文件的界面,15.6.6自定義對(duì)話框,創(chuàng)建對(duì)話框與創(chuàng)建窗口類(lèi)似,通過(guò)建立JDialog的子類(lèi)來(lái)建立一個(gè)對(duì)話框類(lèi),然后這個(gè)類(lèi)的一個(gè)實(shí)例,即這個(gè)子類(lèi)創(chuàng)建的一個(gè)對(duì)象,就是一個(gè)對(duì)話框。對(duì)話框是一個(gè)容器,它的默認(rèn)布局是BorderLayout,對(duì)話框可以添加組件,實(shí)現(xiàn)與用戶的交互操作,,以下是構(gòu)造對(duì)話框的2個(gè)常用構(gòu)造方法。JDialog()構(gòu)造一個(gè)無(wú)有標(biāo)題的初始不可見(jiàn)的對(duì)話框,對(duì)話框依賴一個(gè)默認(rèn)的不可見(jiàn)的窗口,該窗口由Java運(yùn)行環(huán)境提供。JDialog(JFrameowner)構(gòu)造一個(gè)無(wú)標(biāo)題的初始不可見(jiàn)的無(wú)模式的對(duì)話框,owner是對(duì)話框所依賴的窗口,如果owner取null,對(duì)話框依賴一個(gè)默認(rèn)的不可見(jiàn)的窗口,該窗口由Java運(yùn)行環(huán)境提供。,15.7發(fā)布GUI程序,可以使用jar.exe把一些文件壓縮成一個(gè)JAR文件,來(lái)發(fā)布我們的應(yīng)用程序。我們可以把java應(yīng)用程序中涉及到的類(lèi)壓縮成一個(gè)JAR文件,比如Tom.jar,然后使用java解釋器(使用參數(shù)-jar)執(zhí)行這個(gè)壓縮文件,或用鼠標(biāo)雙擊該文件,執(zhí)行這個(gè)壓縮文件。java-jarTom.jar,,假設(shè)D:\test目錄中的應(yīng)用程序有兩個(gè)類(lèi)A、B,其中A是主類(lèi)。生成一個(gè)Jar文件的步驟如下:1.首先用文本編輯器(比如Windows下的記事本)編寫(xiě)一個(gè)清單文件。Mymoon.mf:Manifest-Version:1.0Main-Class:ACreated-By:1.6,,2.生成JAR文件D:\test\jarcfmTom.jarMymoon.mfA.classB.class如果目錄test下的字節(jié)碼文件剛好是應(yīng)用程序需要的全部字節(jié)碼文件,也可以如下生成JAR文件:D:\test\jarcfmTom.jarMymoon.mf*.class,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- JAVA 圖形用戶界面設(shè)計(jì) 圖形 用戶 界面設(shè)計(jì)
鏈接地址:http://zhongcaozhi.com.cn/p-3337272.html