




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
基于Swing的圖形用戶界面設(shè)計1.AWT組件與SWING組件
2.JFrame窗體、布局設(shè)計
3.文本、按鈕與標(biāo)簽組件、復(fù)選框與單選按鈕
4.中間容器
5.列表組件、表格組件、樹組件和進(jìn)度條組件
6.窗口事件、鼠標(biāo)事件、焦點事件和鍵盤事件
7.對話框、菜單組件11AWT組件與SWING組件概述Java早期進(jìn)行用戶界面設(shè)計時,使用java.awt包中提供的類?!癆WT”就是AbstractWindowToolkit(抽象窗口工具包)的縮寫。Java2(JDK1.2)推出之后,增加了一個新的javax.swing包,該包提供了功能更為強(qiáng)大的用來設(shè)計GUI界面的類。如果Java運行環(huán)境低于1.2版本,就不能運行含有SWING組件的程序。
2JComponent類的部分子類以及Jframe,JDialog類
3容器類(Container)和組件類(Component)4容器---可以容納GUI部件(按某種布局)----窗體(JFrame)、面板(JPanel)組件---部署在容器中,實現(xiàn)某種交互。----文本框(JTextField)、按鈕(JButton)、標(biāo)簽(JLabel)等容器類方法:add(),一個容器可以調(diào)用這個方法將組件添加到該容器中。removeAll():可以移掉容器中的全部組件,remove(Componentc):可以移掉容器中參數(shù)指定的組件。
validate()方法:每當(dāng)容器添加新的組件或移掉組件時,應(yīng)該讓容器調(diào)用該方法,以保證容器中的組件能正確顯示出來。容器本身也是一個組件,因此可以把一個容器添加到另一個容器中實現(xiàn)容器的嵌套。圖形用戶界面編程的一般步驟創(chuàng)建窗體(設(shè)置窗體大小、位置,讓窗體可見)創(chuàng)建GUI(GraphicalUserInterface)組件(按鈕,文本框,標(biāo)簽,列表等)將組件加入窗體這個容器布局設(shè)置,加入組件處理事件(比如單擊按鈕)JFrame窗體javax.swing.JFrame類是java.awt.Frame(窗體)類的子類當(dāng)應(yīng)用程序需要一個窗口時,可使用JFrame或其子類創(chuàng)建一個對象。窗口默認(rèn)地被系統(tǒng)添加到顯示器屏幕上。構(gòu)造方法:JFrame()創(chuàng)建一個無標(biāo)題的窗口。JFrame(Strings)創(chuàng)建一個標(biāo)題為s的窗口。JFrame類常用方法:publicvoidsetBounds(inta,intb,intwidth,intheight)設(shè)置出現(xiàn)在屏幕上時的初始位置為(a,b),即距屏幕左面a個像素、距屏幕上方b個像素;窗口的寬是width,高是height。publicvoidsetSize(intwidth,intheight)設(shè)置窗口的大小,在屏幕出現(xiàn)默認(rèn)位置是(0,0)。publicvoidsetVisible(booleanb)設(shè)置窗口是可見還是不可見,窗口默認(rèn)是不可見的。publicvoidsetResizable(booleanb)設(shè)置窗口是否可調(diào)整大小,窗口默認(rèn)是可調(diào)整大小的。JFrame類常用方法publicvoidsetDefaultCloseOperation(intoperation)該方法用來設(shè)置單擊窗體右上角的關(guān)閉圖標(biāo)后,程序會做出怎樣的處理。其中的參數(shù)operation取下列有效值:DO_NOTHING_ON_CLOSE什么也不做HIDE_ON_CLOSE隱藏當(dāng)前窗口DISPOSE_ON_CLOSE隱藏當(dāng)前窗口,并釋放窗體占有的其他資源EXIT_ON_CLOSE結(jié)束窗體所在的應(yīng)用程序這4個常量都是JFrame類中的static常量,單擊關(guān)閉圖標(biāo)后,程序根據(jù)operation取值做出不同的處理。JFrameDemo01.java布局設(shè)計當(dāng)把組件添加到容器中時,希望控制組件在容器中的位置,這就需要學(xué)習(xí)布局設(shè)計的知識。常見布局:
java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout布局類;
java.swing.border包中的BoxLayout布局類。容器可以調(diào)用方法setLayout(布局對象);設(shè)置自己的布局。比如setLayout(newCardLayout());對于JFrame窗口,默認(rèn)布局是BorderLayout布局。1.FlowLayout布局FlowLayout屬于流式布局管理器,使用此種布局方式,所有組件會像流水一樣依次進(jìn)行排列。其常用構(gòu)造方法如下:
publicFlowLayout()構(gòu)造一個新的FlowLayout,它是居中對齊的,默認(rèn)的水平和垂直間隙是5個單位。publicFlowLayout(int
align)構(gòu)造一個新的FlowLayout,它具有指定的對齊方式,默認(rèn)的水平和垂直間隙是5個單位。align參數(shù)的值必須是以下值之一:FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADING或FlowLayout.TRAILING。publicFlowLayout(int
align,int
hgap,int
vgap)
創(chuàng)建一個新的流布局管理器,它具有指定的對齊方式以及指定的水平和垂直間隙。
10FlowLayout的常用方法publicvoidsetAlignment(int
align)設(shè)置布局的對齊方式。publicvoidsetHgap(int
hgap)設(shè)置組件之間以及組件與Container的邊之間的水平間隙。publicvoidsetVgap(int
vgap)設(shè)置組件之間以及組件與Container的邊之間的垂直間隙。publicintgetHgap()獲取組件之間以及組件與Container的邊之間的水平間隙。publicintgetVgap()獲取組件之間以及組件與Container的邊之間的垂直間隙。例:FlowLayoutDemo0111BorderLayout布局BorderLayout布局是Window容器的默認(rèn)布局。JFrame、JDialog都是Window類的間接子類,它們的內(nèi)容面板的默認(rèn)布局都是BorderLayout布局。如果一個容器使用這種布局,那么容器空間簡單地劃分為東、西、南、北、中五個區(qū)域。每加入一個組件都應(yīng)該指明把這個組件添加在哪個區(qū)域中,區(qū)域由BorderLayout中的靜態(tài)常量CENTER、NORTH、SOUTH、WEST、EAST表示。例如,一個使用BorderLayout布局的容器con,可以使用add()方法將一個組件b添加到中心區(qū)域:con.add(b,BorderLayout.CENTER);或con.add(BorderLayour.CENTER,b);注:如果不指定區(qū)域,則默認(rèn)加入到CENTER;添加到某個區(qū)域的組件將占據(jù)整個這個區(qū)域.每個區(qū)域只能放置一個組件,如果向某個已放置了組件的區(qū)域再放置一個組件,那么先前的組件將被后者替換。注:使用BorderLayout布局的容器最多能添加5個組件,如果組件超過5個,就必須使用容器的嵌套或改用其他布局策略。例BorderLayoutDemo01.java13CardLayout布局使用CardLayout容器可以容納多個組件,但同一時刻容器只能從這些組件中選出一個來顯示,就像一疊“撲克牌”每次只能顯示最上面的一張一樣,這個被顯示的組件將占據(jù)所有的容器空間。JTabbedPane(窗格,中間容器)的默認(rèn)布局是CardLayout布局,并且自帶一些選項卡,這些選項卡與用戶添加到JTabbedPane窗格中的組件相對應(yīng),單擊該選項卡,JTabbedPane窗格將顯示對應(yīng)的組件。選項卡窗格自帶的選項卡默認(rèn)地在該選項卡窗格的頂部,從左向右依次排列,選項卡的順序和所對應(yīng)的組件的順序相同。使用JTabbedPane窗格的構(gòu)造方法publicJTabbedPane(inttabPlacement)創(chuàng)建的選項卡窗格的選項卡的位置由參數(shù)tabPlacement指定,該參數(shù)的有效值為JTabbedPane.TOP、JTtabbedPane.BOTTOM、JTabbedPane.LEFT和JTabbedPane.RIGHT。JTabbedPane窗格可以使用add(Stringtext,Componentc);方法將組件c添加到JTabbedPane窗格中,并指定和組件c對應(yīng)的選項卡的文本提示是text。例:CardLayoutDemo01,在選項卡窗格中添加了5個按鈕(帶有圖標(biāo)),并設(shè)置了相對應(yīng)的選項卡的文本提示,然后將選項卡窗格添加到窗體的內(nèi)容面板中(效果如圖10.6所示)。1516GridLayout布局GridLayout是使用較多的布局編輯器,其基本布局策略是把容器劃分成若干行若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來的小格中。使用GridLayout布局編輯器的一般步驟如下:(1)使用GridLayout的構(gòu)造方法GridLayout(intm,intn)創(chuàng)建布局對象,指定劃分網(wǎng)格的行數(shù)m和列數(shù)n,如GridLayoutgrid=newGridLayout(10,8);(2)使用GridLayout布局的容器調(diào)用方法add()將組件加入容器,組件進(jìn)入容器的順序?qū)凑盏谝恍械谝粋€、第一行第二個…第一行最后一個、第二行第一個…最后一行第一個…最后一行最后一個。例如GridLayoutDemo01:使用GridLayout布局的容器最多可添加m×n個組件。GridLayout布局中每個網(wǎng)格都是相同大小,并且強(qiáng)制組件與網(wǎng)格的大小相同。為了克服這個缺點,可以使用容器嵌套。例如,一個容器使用GridLayout布局,將容器分為三行一列的網(wǎng)格,那么可以把另一個容器添加到某個網(wǎng)格中;而添加的這個容器又可以設(shè)置為GridLayout布局、FlowLayout布局、CarderLayout布局或BorderLayout布局等。利用這種嵌套方法,可以設(shè)計出符合一定需要的布局.BoxLayout布局用BoxLayout類可以創(chuàng)建一個布局對象,稱為盒式布局。BoxLayout在java.swing.border包中。javaswing包提供了Box類,該類也是Container類的一個子類,創(chuàng)建的容器稱為一個盒式容器。盒式容器的默認(rèn)布局是盒式布局,而且不允許更改盒式容器的布局。因此,在策劃程序的布局時,可以利用容器的嵌套,將某個容器嵌入幾個盒式容器,達(dá)到布局目的。BoxLayou的構(gòu)造方法BoxLayout(Containercon,intaxis)可以創(chuàng)建一個盒式布局對象,并指定容器con使用該布局對象,參數(shù)axis的有效值是BoxLayout.X_AXIS和BoxLayout.Y_AXIS。Box類的類(靜態(tài))方法createHorizontalBox()可以獲得一個具有行型盒式布局的盒式容器;Box類的類(靜態(tài))方法createVerticalBox()可以獲得一個具有列型盒式布局的盒式容器??刂坪惺讲季秩萜髦薪M件之間的距離,需要使用水平支撐或垂直支撐。Box類調(diào)用靜態(tài)方法createHorizontalStrut(intwidth)可以得到一個不可見的水平Struct類型對象.稱為水平支撐.該水平支撐的高度為0,寬度是width。Box類調(diào)用靜態(tài)方法createVertialStrut(intheight)可以得到一個不可見的垂直Struct類型對象,稱為垂直支撐.參數(shù)height決定垂直支撐的高度,垂直支撐的寬度為0。
例BoxLayoutDemo01.java中(效果如圖10.7所示),有兩個列型盒式容器boxV1、boxV2和一個行型盒式容器baseBox。在列型盒式容器的組件之間添加垂直支撐,控制組件之間的距離,將boxV1、boxV2添加到baseBox中,并在它們之間添加水平支撐。21null布局可以把一個容器的布局設(shè)置為null布局(空布局)。setLayout(null)空布局容器可以準(zhǔn)確地定位組件在容器的位置和大小。setBounds(inta,intb,intwidth,intheight)方法是所有組件都擁有的一個方法,組件調(diào)用該方法可以設(shè)置本身的大小和在容器中的絕對位置。空布局的容器添加組件步驟:1.
把容器p的布局設(shè)置為空布局p.setLayout(null);
2.向空布局的容器p添加一個組件c需要兩個步驟。首先使用add(c)方法向容器添加組件,然后組件c再調(diào)用setBounds(inta,intb,intwidth,intheight)方法設(shè)置該組件在容器中的位置和本身的大小。組件都是一個矩形結(jié)構(gòu),方法中的參數(shù)a和b是被添加的組件c的左上角在容器中的位置坐標(biāo),即該組件距容器左面a個像素,距容器上方b個像素;weidth和height是組件c的寬和高。中間容器_JPanel面板JPanel面板可以使用JPanel創(chuàng)建一個面板,再向這個面板添加組件,然后把這個面板添加到底層容器或其他中間容器中。JPanel面板的默認(rèn)布局是FlowLayout布局。JPanel類構(gòu)造方法Jpanel()可以構(gòu)造一個面板容器對象。JPanelDemo01中間容器_JScrollPaneJScrollPane滾動窗格可以把一個組件放到一個滾動窗格中,然后通過滾動條來觀察這個組件。JScorollPane的構(gòu)造方法JScorollPane(componentc)可以構(gòu)造一個滾動窗格。JScrollPaneDemo01中間容器-JSplitPane拆分窗格拆分窗格有兩種類型水平拆分和垂直拆分。水平拆分窗口用一條拆分線把容器分成左右兩部分,左面放一個組件,右面放一個組件,拆分線可以水平移動。垂直拆分窗格由一條拆分線分成上下兩部分,上面放一個組件,下面放一個組件,拆分線可以垂直移動。構(gòu)造方法JSplitPane(inta,Componentb,Componentc)可以構(gòu)造一個拆分窗格,參數(shù)a取JSplitPane的靜態(tài)常量HORIZONTAL_SPLIT或VERTICAL_SPLIT,以決定是水平還是垂直拆分。后兩個參數(shù)決定要放置的組件。拆分窗格調(diào)用setDividerLocation(doubleposition)設(shè)置拆分線的位置。JSplitPaneDemo01
文本組件--JTextFieldJTextField創(chuàng)建的一個對象就是一個文本框。用戶可以在文本框輸入單行的文本。
J構(gòu)造方法:
JTextField(intx)
創(chuàng)建指定長度的單行文本框?qū)ο蟆?/p>
JTextField(Strings)
創(chuàng)建文本框?qū)ο?,則文本框的初始字符串為s,可以在文本框中輸入若干個字符。27JTextField常用方法
publicvoidsetText(Strings)
設(shè)置文本框中的文本為參數(shù)s指定的文本,文本框中先前的文本將被清除。
publicStringgetText()
獲取文本框中的文本。
publicvoidsetEditable(booleanb)
指定文本框的可編輯性。創(chuàng)建的文本框默認(rèn)是可編輯的。
publicvoidsetHorizontalAlignment(intalignment)
設(shè)置文本在文本框中的對齊方式,alignment的有效值為JTextField.LEFT、JTextField.CENTER和JTextField.RIGHT。28文本組件-JPasswordField使用JTextField的子類JPasswordField可以建立一個密碼框?qū)ο?。publicvoidsetEchoChar(charc)設(shè)置回顯字符(默認(rèn)的回顯字符是'*'),publicchar[]
getPassword()方法返回密碼框中的密碼。29文本組件--JTextAreaJTextArea類專門用來建立文本區(qū),用戶可以在文本區(qū)輸入多行的文本.
JTextArea(introws,intcolumns)
構(gòu)造一個可見行和可見列分別是rows和columns的文本區(qū)。
setLineWrap(booleanb)
決定輸入的文本能否在文本區(qū)的右邊界自動換行;
getText()獲取文本setText(Strings)替換文本區(qū)的文本
append(Strings)
在尾加文本
insert(Strings,intx)
在文本區(qū)的指定位置處插入文本30JTextArea常用方法replaceRange(StringnewString,intstart,intend)
將文本區(qū)start至end處的文本替換為新文本newString
setCaretPosition(intposition)設(shè)置文本區(qū)中輸入光標(biāo)的置(position不能大于文本區(qū)中字符的個數(shù))
copy()和cut()方法將文本區(qū)中選中的內(nèi)容復(fù)制或剪切到系統(tǒng)的剪貼板
paste()
將系統(tǒng)剪貼板上的文本數(shù)據(jù)粘貼在文本區(qū)中。
setSelectionStart(intselectionStart)和
setSelectionEnd(intselectionEnd)設(shè)置選中的文本
select(intselectionStart,intselectionEnd)和
selectAll()選中部分或全部文本31
按鈕與標(biāo)簽組件1.JButton按鈕組件JButton類是專門用來建立按鈕的,即JButton類創(chuàng)建的一個對象就是一個按鈕。JButton類常用的構(gòu)造方法如下:public
JButton(Stringtext)
創(chuàng)建名字是text的按鈕。publicJButton(Iconicon)
創(chuàng)建帶有圖標(biāo)icon的按鈕。publicJButton(Stringtext,Iconicon)
創(chuàng)建名字是text且?guī)в袌D標(biāo)icon的按鈕32JButton組件的常用方法◆publicvoidsetText(Stringtext)重新設(shè)置當(dāng)前按鈕的名字,名字由參數(shù)text指定。◆publicStringgetText()
獲取當(dāng)前按鈕上的名字。◆publicvoidsetIcon(Iconicon)
重新設(shè)置當(dāng)前按鈕上的圖標(biāo)?!魀ublicIcongetIcon()
獲取當(dāng)前按鈕上的圖標(biāo)◆publicvoidsetHorizontalTextPosition(inttextPosition)
設(shè)置按鈕名字相對按鈕上圖標(biāo)的水平位置。33
2.JLabel標(biāo)簽
JLabel類負(fù)責(zé)創(chuàng)建標(biāo)簽對象,標(biāo)簽用來顯示信息。JLabel類的構(gòu)造方法如下:publicJLabel(Strings)創(chuàng)建名字是s的標(biāo)簽,s在標(biāo)簽中靠左對齊。publicJLabel(Strings,intaligment)參數(shù)aligment決定標(biāo)簽中的文字在標(biāo)簽中的水平對齊方式。aligment的取值是JLabel.CENTER、JLabel.LEFT或JLabel.RIGHT。publicJLabel(Iconicon)創(chuàng)建具有圖標(biāo)icon的標(biāo)簽,icon在標(biāo)簽中靠左對齊。publicJLabel(Strings,Iconicon,intaligment)創(chuàng)建名字是s,具有圖標(biāo)icon的標(biāo)簽。參數(shù)aligment決定標(biāo)簽中的文字和圖標(biāo)作為一個整體在標(biāo)簽中的水平對齊方式(名字總是在圖標(biāo)的右面)。34JLabel類的常用方法
StringgetText()
獲取標(biāo)簽的名字。
voidsetText(Strings)
設(shè)置標(biāo)簽的名字是s。
IcongetIcon()
獲取標(biāo)簽的圖標(biāo)。
voidsetIcon(Iconicon)
設(shè)置標(biāo)簽的圖標(biāo)是icon。
voidsetHorizontalTextPosition(inta)
參數(shù)a確定名字相對于標(biāo)簽上的圖標(biāo)的位置。a的取值是JLabel.LEFT或JLabel.RIGHT。
voidsetVerticalTextPosition(inta)
參數(shù)a確定名字相對于JLabel上的圖標(biāo)的位置。參數(shù)a取值是JLabel.BOTTOM或JLabel.TOP。35事件與監(jiān)聽器如果要使一個圖形界面變的有意義,就必須加入事件處理。當(dāng)一個按鈕按下時,在文本框中按回車鍵完成輸入時,按鈕和文本框內(nèi)容的狀態(tài)都會發(fā)生變化,此時就會產(chǎn)生一個事件,而如果要處理此事件,則需要事件的監(jiān)聽者不斷的監(jiān)聽事件的變化,并根據(jù)這些事件進(jìn)行響應(yīng)的處理。在Swing編程中,依然使用了AWT的事件處理方式,所有的事件類(基本上任意的一個組件都有對應(yīng)的事件)都是EventObject的子類。36ActionEvent事件在學(xué)習(xí)處理事件時,讀者必須很好地掌握事件源、監(jiān)視器、處理事件的接口這三個概念。JTextField、JPasswordField和JButton觸發(fā)ActionEvent事件,通過處理文本框這個具體的組件上的事件,來掌握處理事件的基本原理。371)處理事件-----事件源事件源:能夠產(chǎn)生事件的對象都可以稱為事件源,如文本框、按鈕、下拉式列表等。也就是說,事件源必須是一個對象,而且這個對象必須是Java認(rèn)為能夠發(fā)生事件的對象。事件:用戶對事件源進(jìn)行了某種操作,進(jìn)而觸發(fā)了指定的事件。比如單擊按鈕,在文本框中按回車鍵等。2)處理事件-----監(jiān)視器監(jiān)視器:我們需要一個對象對事件源進(jìn)行監(jiān)視,以便對發(fā)生的事件做出處理。AWT定義了各種類型的事件,每一種事件都有相應(yīng)的事件監(jiān)視者接口,在接口中描述了處理相應(yīng)事件應(yīng)實現(xiàn)的基本行為。若事件類名為XxxEvent,則事件監(jiān)聽接口的命名為XxxListener,給事件源注冊監(jiān)視器的方法為addXxxListener(XxxListenerlistener)AWT事件接口及處理方法描述信息接口名稱方法(事件)點擊按鈕、點擊菜單項、文本框按回車等動作ActionListeneractionPerformed(ActionEvent)選擇了可選項的項目ItemListeneritemStateChanged(ItemEvent)文本部件內(nèi)容改變TextListenertextValueChanged(TextEvent)移動了滾動條等部件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠標(biāo)移動MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠標(biāo)點擊等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)以上接口和類均在java.awt.event的包中定義鍵盤輸入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)部件收到或失去焦點FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)部件移動、縮放、顯示/隱藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加/刪除部件ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)當(dāng)前版本:20045更新日期:2016.05.24查看詳情:2)處理事件-----監(jiān)視器事件源通過調(diào)用相應(yīng)的方法將某個對象作為自己的監(jiān)視器。例如,對于按鈕,這個方法是:addActionListener(ActioListenerlistener)當(dāng)單擊了有監(jiān)視器的按鈕時,Java運行系統(tǒng)就自動用ActionEvent類創(chuàng)建了一個對象,即發(fā)生了ActionEvent事件。也就是說,事件源獲得監(jiān)視器之后,相應(yīng)的操作就會導(dǎo)致事件的發(fā)生,并通知監(jiān)視器,監(jiān)視器就會做出相應(yīng)的處理。3)處理事件-----接口ActionListener作為監(jiān)聽器,負(fù)責(zé)處理事件源發(fā)生的事件,但它本身是一個接口:publicinterfaceActionListenerextendsEventListener{voidactionPerformed(ActionEvente)//抽象方法,處理事件}3)處理事件-----接口ActionListener是接口,因此必須將一個實現(xiàn)了ActionListener接口的類創(chuàng)建的對象傳遞給addActionListener方法的參數(shù),使得該對象成為事件源的監(jiān)視器。創(chuàng)建監(jiān)視器的類必須提供處理事件的特定方法,即實現(xiàn)接口中的actionPerformed(ActionEvente)方法。classTestimplementsActionListener{publicvoidactionPerformed(ActionEvente){//事件的處理過程}}Java采用接口回調(diào)技術(shù)來處理事件,當(dāng)事件源發(fā)生事件時,接口立刻通知監(jiān)視器自動調(diào)用實現(xiàn)的某個接口方法,接口方法規(guī)定了怎樣處理事件的操作。接口回調(diào)這一過程對程序是不可見的,Java在設(shè)計組件事件時已經(jīng)設(shè)置好了這一回調(diào)過程,程序只需讓事件源獲得正確的監(jiān)視器,即將實現(xiàn)了正確接口的對象的引用傳遞給方法addActionListener(ActionListenerlistener)中的參數(shù)listener事件處理模式
事件處理模式如圖10.9所示.46誰作為監(jiān)聽者合適?
(1)事件源對象的容器類作為監(jiān)聽者
btn1.addActionListener(this);importjava.awt.event.*;publicclassTestextendsJFrameimplementsActionListener{publicTest(){...
btn1.addActionListener(this);...}
publicvoidactionPerformed(ActionEvente){…}…}誰作為監(jiān)聽者合適?
(2)用內(nèi)嵌類實現(xiàn)
btn1.addActionListener(newProcess());publicclassTestextendsJFrame{publicTest(){...
btn1.addActionListener(newProcess());....}
classProcessimplementsActionListener{publicvoidactionPerformed(ActionEvente){…}}}誰作為監(jiān)聽者合適?
(3)用匿名內(nèi)嵌類實現(xiàn)
btn1.addActionListener(newActionListener();publicclassTestextendsJFrame{publicTest(){...
btn1.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){…}});...}…}ActionEvent類中的方法當(dāng)多個事件源擁有同一個監(jiān)視器時,在事件處理過程中需要區(qū)分事件源,可以采取的方法有:publicObjectgetSource()返回發(fā)生ActionEvent事件的對象的引用。publicStringgetActionCommand()獲取發(fā)生ActionEvent事件時,和該事件相關(guān)的一個命令字符串對于文本框,當(dāng)發(fā)生ActionEvent事件時,用戶在文本框中輸入的文本字符串就是和該事件相關(guān)的一個命令字符串。對于按鈕,該命令字符串就是按鈕上顯示的字符
Esource.java50ActionEventDemo01中,窗口中有一個文本框text,text的事件監(jiān)視器由PoliceStation類負(fù)責(zé)創(chuàng)建。當(dāng)用戶在text中輸入字符串回車后,監(jiān)視器負(fù)責(zé)在命令行輸出該字符串以及它的長度(效果如圖10.10所示)。
ActionEventDemo02中,titleText和passwordText有監(jiān)視器。當(dāng)在titleText中輸入字符串回車后,監(jiān)視器負(fù)責(zé)將窗體的標(biāo)題更改為當(dāng)前titleText中的文本。當(dāng)在passwordText中輸入密碼回車后,監(jiān)視器負(fù)責(zé)將密碼顯示在titleText中(效果如圖10.11所示)。
ActionEventDemo03使用匿名對象作為inputText的監(jiān)視器,當(dāng)在inputText中輸入一個數(shù)字字符串后,監(jiān)視器負(fù)責(zé)計算這個數(shù)的平方,并將結(jié)果放入showText中(效果如圖10.12所示)。51
例子10-8,9,10運行效果圖10.10,10.11,10.1252事件適配器類Java中為那些含多個方法的監(jiān)聽者接口提供了事件適配器類,對應(yīng)XxxListener接口,這個類命名為XxxAdapter,在該類中以空方法體實現(xiàn)了相應(yīng)接口的所有方法。比如:WindowListener接口中包含了7個抽象方法,對應(yīng)的適配器類就是WindowAdapter,該類中以空方法的方式實現(xiàn)了相應(yīng)接口的所有方法。程序員設(shè)計可通過繼承適配器類來編寫監(jiān)聽者類,在類中只需給出關(guān)心的方法,即重寫關(guān)心的方法。MyFrame.javaJTextArea的DucumentEvent事件
文本區(qū)可以觸發(fā)DucumentEvent事件,DucumentEven類在javax.swing.event包中。用戶在文本區(qū)組件的UI代表的視圖中進(jìn)行文本編輯操作,使得文本區(qū)中的文本內(nèi)容發(fā)生變化,將導(dǎo)致該文本區(qū)所維護(hù)的文檔模型中的數(shù)據(jù)發(fā)生變化,從而導(dǎo)致DucumentEvent事件的發(fā)生。文本區(qū)調(diào)用addDucumentListener(DucumentListenerlistener)向文本區(qū)維護(hù)的文檔注冊監(jiān)視器。監(jiān)視器需實現(xiàn)DucumentListener接口,該接口中有3個方法:publicvoidchangedUpdate(DocumentEvente)publicvoidremoveUpdate(DocumentEvente)publicvoidinsertUpdate(DocumentEvente)getDocument()返回維護(hù)的文檔,該文檔是實現(xiàn)了Document接口類的一個實例。
54例Example10_12中,有兩個文本區(qū)和一個文本框。當(dāng)用戶在文本區(qū)inputText進(jìn)行編輯操作時,文本區(qū)showText將顯示第一個文本區(qū)中所有和指定模式匹配的字符串。用戶可以事先在一個文本框patternText中輸入指定的模式,比如,輸入:[^\s\d\p{Punct}]+,即通過該模式獲得文本區(qū)inputText中的全部單詞,效果如圖10.14所示。JCheckBox復(fù)選框復(fù)選框提供兩種狀態(tài)一種是選中,另一種是未選中,用戶通過單擊該組件切換狀態(tài)。JCheckBox類構(gòu)造方法:
publicJCheckBox()創(chuàng)建一個沒有名字的復(fù)選框,初始狀態(tài)是未選中。publicJCheckBox(Stringtext)創(chuàng)建一個名字是text的復(fù)選框,初始狀態(tài)是未選中。publicJCheckBox(Iconicon)創(chuàng)建一個帶有默認(rèn)圖標(biāo)icon但沒有名字的復(fù)選框,初始狀態(tài)是未選中。publicJCheckBox(Stringtext,Iconicon)創(chuàng)建一個帶有默認(rèn)圖標(biāo)和名字text的復(fù)選框,初始狀態(tài)是未選中。publicvoidsetIcon(IcondefaultIcon)設(shè)置復(fù)選框上的默認(rèn)圖標(biāo)。56復(fù)選框常用方法publicvoidsetSelectedIcon(IconselectedIcon)
設(shè)置復(fù)選框選中狀態(tài)下的圖標(biāo)。該方法可能經(jīng)常被使用,因為如果不明顯地設(shè)置選中狀態(tài)時的圖標(biāo),復(fù)選框無論是選中狀態(tài)還是未選種狀態(tài)總是顯示復(fù)選框上的默認(rèn)圖標(biāo),用戶很難知道復(fù)選框是處于怎樣的狀態(tài)。
publicbooleanisSelected()
如果復(fù)選框處于選中狀態(tài)該方法返回true,否則返回false。如果復(fù)選框沒有指定默認(rèn)圖標(biāo),復(fù)選框就顯示為一個“小方框”,如果是選中狀態(tài),“小方框”里面就有個小對號。57復(fù)選框ItemEvent事件當(dāng)復(fù)選框獲得監(jiān)視器之后,復(fù)選框從未選中狀態(tài)變成選中狀態(tài)或從選中狀態(tài)變成未選中狀態(tài)時就發(fā)生ItemEvent事件,ItemEvent類將自動創(chuàng)建一個事件對象。發(fā)生ItemEvent事件的事件源獲得監(jiān)視器的方法是addItemListener(ItemListenerlistener)處理ItemEvent事件的接口是ItemListener,創(chuàng)建監(jiān)視器的類必須實現(xiàn)ItemListener接口,該接口中只有一個接口方法publicvoiditemStateChanged(ItemEvente),對發(fā)生的事件做出處理。58ItemEvent事件對象的方法publicObjectgetSource()獲得產(chǎn)生事件的事件源。publicItemSelectablegetItemSelectable()返回事件的產(chǎn)生程序。注意:ItemSelectable是個接口。JCheckBox是該接口的實現(xiàn)類。59例Example10_14處理了復(fù)選框上的ItemEvent事件,當(dāng)復(fù)選框被選中時,窗口中心顯示一個帶圖標(biāo)的標(biāo)簽,否則隱藏這個帶圖標(biāo)的標(biāo)簽,效果如圖10.16所示。60JRadioButton單選按鈕一組單選按鈕同一時刻只能有一個被選中。當(dāng)創(chuàng)建了若干個單選按鈕后,應(yīng)使用ButtonGroup類再創(chuàng)建一個對象,然后利用這個對象把這若干個單選按鈕歸組。歸到同一組的單選按鈕每一時刻只能選一。單選按鈕和復(fù)選框一樣,也觸發(fā)ItemEvent事件。
ButtonGroupfruit=newButtonGroup();JRadioButtonbutton1=newJRadioButton("小學(xué)"),button2=newJRadioButton("中學(xué)"),button3=newJRadioButton("大學(xué)");fruit.add(button1);fruit.add(button2);fruit.add(button3);61
列表組件用戶可以在下拉列表看到第一個選項和它旁邊的箭頭按鈕,當(dāng)用戶單擊箭頭按鈕時,選項列表打開。下拉列表的常用方法如下:publicJComboBox()創(chuàng)建一個沒有選項下拉列表。publicvoidaddItem(ObjectanObject)增加選項。publicintgetSelectedIndex()返回當(dāng)前下拉列表中被選中的選項的索引,索引的起始值是0。publicObjectgetSelectedItem()返回當(dāng)前下拉列表中被選中的選項。publicvoidremoveItemAt(intanIndex)從下拉列表的選項中刪除索引值是anIndex的選項。publicvoidremoveAllItems()刪除全部選項。publicvoidaddItemListener(ItemListener)向下拉列表增加ItemEvent事件的監(jiān)視器。
62下拉式列表事件源可以發(fā)生ItemEvent事件。當(dāng)下拉列表獲得監(jiān)視器后,用戶在下拉列表的選項中選中某個選項時就發(fā)生ItemEvent事件,ItemEvent類將自動創(chuàng)建一個事件對象。
例Example10_15,列表的選項是Java源文件的名字。當(dāng)選擇一個選項后,程序在一個文本區(qū)里顯示所選擇的Java源文件的全部內(nèi)容,效果如圖10.17所示。63表格組件使用JTable可以創(chuàng)建一個表格對象??梢允褂肑Table的下列構(gòu)造方法創(chuàng)建表格。JTable(Objectdata[][],ObjectcolumnName[])表格的視圖將以行和列的形式顯示數(shù)組data每個單元中對象的字符串表示,也就是說,表格視圖中對應(yīng)著data單元中對象的字符串表示。參數(shù)columnName用來指定表格的列名。用戶在表格單元中輸入的數(shù)據(jù)都被認(rèn)為是一個Object對象,用戶通過表格視圖對表格單元中的數(shù)據(jù)進(jìn)行編輯,以修改二維數(shù)組data中對應(yīng)的數(shù)據(jù),在表格視圖中輸入或修改數(shù)據(jù)后,需按回車鍵或用鼠標(biāo)單擊表格的單元格確定所輸入或修改的結(jié)果。當(dāng)表格需要刷新顯示時,調(diào)用repaint()方法。64
例Example10_16是一個商品銷售核算錄入程序,客戶通過一個表格視圖的單元格輸入每件商品的名稱、單價和銷售量。單擊“每件商品銷售額”按鈕,表格視圖每行的最后一個單元將顯示該商品的總銷售額;單擊“總銷售額”按鈕,表格視圖將計算最后一列值的和,同時表格增加一行,該行的最后一個單元顯示總銷售額,效果如圖10.18所示。65樹組件_1.樹與節(jié)點JTree類的實例稱為樹組件。樹組件也是常用的組件之一,它由節(jié)點構(gòu)成。要想構(gòu)造一個樹組件,必須事先創(chuàng)建出稱為節(jié)點的對象。任何實現(xiàn)MutableTreeNode接口的類創(chuàng)建的對象都可以成為樹上的節(jié)點,樹中最基本的對象是節(jié)點,它表示在給定層次結(jié)構(gòu)中的數(shù)據(jù)項。樹以垂直方式顯示數(shù)據(jù),每行顯示一個節(jié)點。樹中只有一個根節(jié)點,所有其他節(jié)點從這里引出。除根節(jié)點外,其他節(jié)點分為兩類一類是帶子節(jié)點的分支節(jié)點,另一類是不帶子節(jié)點的葉節(jié)點。每一個節(jié)點關(guān)聯(lián)著一個描述該節(jié)點的文本標(biāo)簽和圖像圖標(biāo)。文本標(biāo)簽是節(jié)點中對象的字符串表示,圖標(biāo)指明該節(jié)點是否是葉節(jié)點。樹組件的節(jié)點中可以存放對象,javax.swing.tree包提供的DefaultMutableTreeNode類是實現(xiàn)了MutableTreeNode接口的類,可以使用這個類創(chuàng)建樹上的節(jié)點。66樹組件的常用方法DefaultMutableTreeNode類的兩個常用的構(gòu)造方法是:DefaultMutableTreeNode(ObjectuserObject)創(chuàng)建的節(jié)點默認(rèn)可以有子節(jié)點DefaultMutableTreeNode(ObjectuserObject,booleanallowChildren)add()添加其他節(jié)點作為它的子節(jié)點。setAllowsChildren(booleanb)方法
設(shè)置是否允許有子節(jié)點。getUserObject()方法得到節(jié)點中存放的對象。JTree(TreeNoderoot)JTree的構(gòu)造方法創(chuàng)建根節(jié)點是root的樹。TreeNode是接口67樹組件_2.樹上的TreeSelectionEvent事件
樹組件可以觸發(fā)TreeSelectionEvent事件,樹使用addTreeSelectionListener(TreeSelectionListenerlistener)方法獲得一個監(jiān)視器。當(dāng)用鼠標(biāo)單擊樹上的節(jié)點時,系統(tǒng)將自動用TreeSelectionEvent類創(chuàng)建一個事件對象,通知樹的監(jiān)視器,監(jiān)視器將自動調(diào)用TreeSelectionListener接口中的方法。創(chuàng)建監(jiān)視器的類必須實現(xiàn)TreeSelectionListener接口,此接口中的方法是:publicvoidvalueChanged(TreeSelectionEvente)getLastSelectedPathComponent()樹使用該方法獲取選中的節(jié)點。
◆
68例Example10_17,節(jié)點中存放的對象由Student類創(chuàng)建,當(dāng)用戶選中節(jié)點時,窗口中的文本區(qū)顯示節(jié)點中存放的對象的有關(guān)信息,效果如圖10.19所示。69進(jìn)度條組件_1.JProgressBar類JProgressBar類可以創(chuàng)建進(jìn)度條組件。該組件能用一種顏色動態(tài)地填充自己,以便顯示某任務(wù)完成的百分比。三個常用的構(gòu)造函數(shù)JProgessBar()、JProgressBar(intmin,intmax)和JProgressBar(intorient,intmin,intmax)。參數(shù)orient取值為JProgressBar.HORIZONTAL或JProgressBar.VERTICAL,決定進(jìn)度條是水平填充還是垂直填充。
70進(jìn)度條可調(diào)用方法pulicvoidsetsetValue(intn)進(jìn)度條默認(rèn)用一種顏色水平填充自己setMinimum(intmin)和setMaximum(intmax)可以改變最大和最小這兩個值。setSize()
設(shè)置進(jìn)度條大。進(jìn)度條的最大值max是指將進(jìn)度條平均分成max份。如果進(jìn)度條的最小值是min,那么使用setValue(intn)方法時,n不能小于min。setStringPainted(booleana)
設(shè)置是否使用百分?jǐn)?shù)或字符串來表示進(jìn)度條的進(jìn)度情況intgetValue()
獲取進(jìn)度值71例10-18(效果如圖10.20所示)用進(jìn)度條模擬顯示線程的計算速度,一個線程用遞歸算法輸出Fibinacci序列的前50項,另一個線程使用循環(huán)輸出Fibinacci序列的前100項(Fibinacci序列的前兩項是1,以后每項是前兩項的和)。72進(jìn)度條組件_2.帶進(jìn)度條的輸入流我們最熟悉進(jìn)度條的一種用法是讀取文件時出現(xiàn)一個表示讀取進(jìn)度的進(jìn)度條。這也是進(jìn)度條的用武之地。如果讀取文件時希望看見文件的讀取進(jìn)度,可以使用javax.swing包提供的輸入流類ProgressMonitorInputStream。它的構(gòu)造方法是:ProgressMonitorInputStream(Conmponentc,Strings,InputStream);它創(chuàng)建的輸入流在讀取文件時會彈出一個顯示讀取速度的進(jìn)度條,進(jìn)度條在參數(shù)c指定的組件的正前方顯示,若該參數(shù)取null,則在屏幕的正前方顯示。
73例Example10_19使用帶進(jìn)度條的輸入流讀取文件的內(nèi)容,效果如圖10.21所示。74組件的常見方法
JComponent類是所有組件的父類,本節(jié)介紹JComponent類的幾個常用方法。組件都是矩形形狀,組件本身有一個默認(rèn)的坐標(biāo)系,組件的左上角的坐標(biāo)值是(0,0)。如果一個組件的寬是20,高是10,那么該坐標(biāo)系中,x坐標(biāo)的最大值是20,y坐標(biāo)的最大值是10,如圖10.22所示。75設(shè)置組件的顏色publicvoidsetBackground(Colorc)設(shè)置組件的背景色。
publicvoidsetForeground(Colorc)設(shè)置組件的前景色。
publicColorgetBackground()獲取組件的背景色。
publicColorgetForeground()獲取組件的前景色。上述方法中都涉及到Color類。Color類是java.awt包中的類,該類創(chuàng)建的對象稱為顏色對象。publicColor(intred,intgreen,ingblue)Color類的構(gòu)造方法,可以創(chuàng)建一個顏色對象,其中red、green、blue的取值在0~255之間。另外,Color類中還有red、blue、green、orange、cyan、yellow、pink等靜態(tài)常量,都是顏色對象。76組件的常見方法_2.組件透明組件默認(rèn)是不透明的。
publicvoidsetOpaque(booleanisOpaque)設(shè)置組件是否不透明,當(dāng)參數(shù)isOpaque取false時組件被設(shè)置為透明,取true時組件被設(shè)置為不透明。
publicbooleanisOpaque()當(dāng)組件不透明時該方法返回true,否則返回false。77組件的常見方法_3.組件的邊框組件默認(rèn)邊框是一個黑邊的矩形。publicvoidsetBorder(Borderborder)設(shè)置組件的邊框。publicBordergetBorder()返回邊框。組件調(diào)用setBorder()方法來設(shè)置邊框,該方法的參數(shù)是一個接口,因此必須向該參數(shù)傳遞一個實現(xiàn)接口Border類的實例,如果傳遞一個null,組件將取消邊框??梢允褂肂orderFactory類的類方法返回一個實現(xiàn)接口Border類的實例,如BorderFactory類的類方法createBevelBorder(inttype,Colorhighlight,Colorshadow)將會得到一個具有“斜角”的邊框,參數(shù)type取值為BevelBorder.LOWERED或BevelBorder.RAISED。
78組件的字體publicvoidsetFont(Fontf)組件調(diào)用該方法設(shè)置組件上的字體?!魀ublicFontgetFont()組件調(diào)用該方法獲取組件上的字體?!鬸ava.awt包中的Font類創(chuàng)建的對象稱為字體對象。Font類的構(gòu)造方法是:
publicFont(Stringname,intstyle,intsize);創(chuàng)建字體對象其中name是字體的名字,如果系統(tǒng)不支持字體的名字,將取默認(rèn)的名字創(chuàng)建字體對象。style決定字體的樣式,是一個整數(shù),有效取值是:Font.BOLD、Font.PLAIN、Font.ITALIC、Font.ROMAN_BASELINE、Font.CENTER_BASELINE、Font.HANGING_BASELINE或Font.TRUETYPE_FONT?!?9組件的字體◆GraphicsEnviroment類是java.awt包中的抽象類,不能用構(gòu)造方法創(chuàng)建對象,Java運行環(huán)境準(zhǔn)備好了這個對象,只需讓GraphicsEnvironment類調(diào)用它的類方法獲取這個對象的引用即可publicGraphicsEnvironmentstaticgetLocalGraphicsEnvironment()◆
String[]getAvailableFontFamilyNames()GraphicsEnvironment對象調(diào)用該方法獲取計算機(jī)上所有可用的字體名稱,并存放到字符串?dāng)?shù)組中。
例10-20中,下拉列表listFont中列出全部可用字體名字,在下拉列表listFont中選擇字體名字后,文本區(qū)用相應(yīng)的字體顯示特定的文本“北京奧運”(效果如圖10.23所示)。80
例子10-20運行效果圖10.2381組件的大小與位置publicvoidsetSize(intwidth,intheight)設(shè)置組件的大小,參數(shù)width指定組件的寬度,height指定組件的高度。◆publicvoidsetLocation(intx,inty)設(shè)置組件在容器中的位置,包含該組件的容器都有默認(rèn)的坐標(biāo)系,容器的坐標(biāo)系的左上角的坐標(biāo)是(0,0),參數(shù)x和y指定該組件的左上角在容器的坐標(biāo)系中的坐標(biāo),即組件距容器的左邊界x個像素,距容器的上邊界y個像素?!魀ublicDimensiongetSize()返回一個Dimension對象的引用,該對象實體中含有名字是width和height的成員變量,方法返回的Dimmension對象的width的值就是組件的寬度、height的值就是當(dāng)前組件的高度?!魀ublicPointgetLocation(intx,inty)返回一個Point對象的引用,該對象實體中含有名字是x和y的成員變量,方法返回的Point對象x和y的值就是組件的左上角在容器的坐標(biāo)系中的x坐標(biāo)和y坐標(biāo)?!?2組件的大小與位置◆publicvoidsetBounds(intx,inty,intwidth,intheight)
設(shè)置組件在容器中的位置和組件的大小。該方法相當(dāng)于setSize()方法和setLocation()方法的組合?!魀ublicRectanglegetBounds()
返回一個Rectangle對象的引用,該對象實體中含有名字是x、y、width和height的成員變量,方法返回的Rectangle對象x和y的值就是當(dāng)前組件左上角在容器坐標(biāo)系中的x坐標(biāo)和y坐標(biāo),width和height的值就是當(dāng)前組件的寬度和高度。83組件的激活與可見性
◆publicvoidsetEnabled(booleanb)
設(shè)置組件是否可被激活。當(dāng)參數(shù)b取值true時,組件可以被激活,當(dāng)參數(shù)b取值false時,組件不可激活。默認(rèn)情況下,組件是可以被激活的。
◆publicvoidsetVisible(boolean)
設(shè)置組件在該容器中的可見性。當(dāng)參數(shù)b取值true時,組件在容器中可見,當(dāng)參數(shù)b取值false時,組件在容器中不可見。除了Window組件外,其他類型組件默認(rèn)是可見的。84鼠標(biāo)事件_1.鼠標(biāo)事件的觸發(fā)
組件是可以觸發(fā)鼠標(biāo)事件的事件源。怎樣才能導(dǎo)致組件觸發(fā)鼠標(biāo)事件呢?用戶的下列7種操作都可以使得組件觸發(fā)鼠標(biāo)事件:◆鼠標(biāo)指針從組件之外進(jìn)入?!羰髽?biāo)指針從組件內(nèi)退出?!羰髽?biāo)指針停留在組件上時,按下鼠標(biāo)?!羰髽?biāo)指針停留在組件上時,釋放鼠標(biāo)?!羰髽?biāo)指針停留在組件上時,單擊鼠標(biāo)?!粼诮M件上拖動鼠標(biāo)指針?!粼诮M件上運動鼠標(biāo)指針。鼠標(biāo)事件的類型是MouseEvent,即組件觸發(fā)鼠標(biāo)事件時,MouseEvent類自動創(chuàng)建一個事件對象。85鼠標(biāo)事件_2.MouseListener接口Java分別使用MouseListener接口與MouseMotionListener接口兩個接口來處理鼠標(biāo)事件。如果事件源使用addMouseListener(MouseListenerlistener)獲取監(jiān)視器,那么用戶的下列5種操作可使得事件源觸發(fā)鼠標(biāo)事件:◆鼠標(biāo)指針從組件之外進(jìn)入?!羰髽?biāo)指針從組件內(nèi)退出。◆鼠標(biāo)指針停留在組件上面時,按下鼠標(biāo)?!羰髽?biāo)指針停留在組件上面時,釋放鼠標(biāo)?!羰髽?biāo)指針停留在組件上面時,單擊或連續(xù)單擊鼠標(biāo)。86MouseListener接口創(chuàng)建監(jiān)視器的類必須實現(xiàn)MouseListener接口,該接口有5個方法:◆mousePressed(MouseEvent)負(fù)責(zé)處理鼠標(biāo)按下觸發(fā)的鼠標(biāo)事件?!鬽ouseReleased(MouseEvente)負(fù)責(zé)處理鼠標(biāo)釋放觸發(fā)的鼠標(biāo)事件?!鬽ouseEntered(MouseEvente)負(fù)責(zé)處理鼠標(biāo)進(jìn)入組件觸發(fā)的鼠標(biāo)事件?!鬽ouseExited(MouseEvente)負(fù)責(zé)處理鼠標(biāo)退出組件觸發(fā)的鼠標(biāo)事件。◆mouseClicked(MouseEvente)負(fù)責(zé)處理鼠標(biāo)單擊或連擊觸發(fā)的鼠標(biāo)事件。.MouseMotionListener接口
Java分別使用MouseListener接口與MouseMotionListener接口兩個接口來處理鼠標(biāo)事件。如果事件源使用
addMouseMotionListener(MouseMotionListenerlistener)獲取監(jiān)視器,那么用戶的下列兩種操作可使得事件源觸發(fā)鼠標(biāo)事件:◆在組件上拖動鼠標(biāo)指針?!粼诮M件上運動鼠標(biāo)指針。88MouseMotionListener接口創(chuàng)建監(jiān)視器的類必須實現(xiàn)MouseMotionListener接口,該接口有兩個方法:◆mouseDragged(MouseEvente)負(fù)責(zé)處理鼠標(biāo)拖動事件,即在事件源上拖動鼠標(biāo)時,監(jiān)視器將自動調(diào)用接口中的這個方法對事件做出處理。◆mouseMoved(MouseEvente)負(fù)責(zé)處理鼠標(biāo)移動事件,即在事件源上運動鼠標(biāo)時,監(jiān)視器將自動調(diào)用接口中的這個方法對事件做出處理。由于處理鼠標(biāo)事件的接口中的方法多于一個,Java提供了相應(yīng)的適配器類,分別是MouseAdapter和MouseMotionAdapter,這兩個類分別實現(xiàn)了MouseListener接口和MouseMotionListener接口。.MouseEvent類在處理鼠標(biāo)事件時,程序經(jīng)常關(guān)心鼠標(biāo)在當(dāng)前組件坐標(biāo)系中的位置,以及觸發(fā)鼠標(biāo)事件使用的是鼠標(biāo)的左鍵或右鍵等信息。MouseEvent類中有下列幾個重要的方法:◆getX()返回觸發(fā)當(dāng)前鼠標(biāo)事件時,鼠標(biāo)指針在事件源坐標(biāo)系中的x坐標(biāo)?!鬵etY()返回觸發(fā)當(dāng)前鼠標(biāo)事件時,鼠標(biāo)指針在事件源坐標(biāo)系中的y坐標(biāo)?!鬵etModifiers()返回一個整數(shù)值,如果是通過鼠標(biāo)左鍵觸發(fā)的鼠標(biāo)事件,該方法返回的值等于InputEvent類中的類常量BUTTON1_MASK;如果是右鍵,返回的是InputEvent類中的類常量BUTTON3_MASK?!鬵etClickCount()返回鼠標(biāo)被連續(xù)單擊的次數(shù)。◆getSource()返回觸發(fā)當(dāng)前鼠標(biāo)事件的事件源。
90例10-22使用MouseListener接口處理鼠標(biāo)事件。在程序中,分別監(jiān)視按鈕、標(biāo)簽和窗體上的鼠標(biāo)事件,當(dāng)發(fā)生鼠標(biāo)事件時,獲取鼠標(biāo)的坐標(biāo)值,效果如圖10.24所示。注意:事件源的坐標(biāo)系的左上角是原點。鼠標(biāo)事件_4.用鼠標(biāo)拖動組件可以使用坐標(biāo)變換來實現(xiàn)組件的拖動。當(dāng)我們用鼠標(biāo)拖動容器中的組件時,可以先獲取鼠標(biāo)指針在組件坐標(biāo)系中的坐標(biāo)x,y,以及組件的左上角在容器坐標(biāo)系中的坐標(biāo)a,b;如果在拖動組件時,想讓鼠標(biāo)指針的位置相對于拖動的組件保持靜止,那么,組件左上角在容器坐標(biāo)系中的位置應(yīng)當(dāng)是a+x-x0,a+y-y0,其中x0,y0是最初在組件上按下鼠標(biāo)時,鼠標(biāo)指針在組件坐標(biāo)系中的位置坐標(biāo)。
92例10-23中,窗體中添加了一個分層窗格,分層窗格中添加了一些組件。該例子使用MouseListener接口和MouseMotionListener接口處理鼠標(biāo)事件,可以用鼠標(biāo)拖動分層窗格中的組件,效果如圖10.25所示。使用分層窗格是為了保證被拖動的組件不會被其他組件遮擋。彈出式菜單單擊鼠標(biāo)右鍵出現(xiàn)彈出式菜單是用戶熟悉和常用的操作,這是通過處理鼠標(biāo)事件實現(xiàn)的。彈出式菜單由JPopupMenu類負(fù)責(zé)創(chuàng)建,可以用下列構(gòu)造方法創(chuàng)建彈出式菜單:◆publicJPopupMenu()構(gòu)造無標(biāo)題彈出式菜單?!魀ublicJPopupMenu(Stringlabel)構(gòu)造由參數(shù)label指定標(biāo)題的彈出式菜單。彈出式菜單需要在某個組件的正前方彈出可見,通過調(diào)用publicvoidshow(Componentinvoker,intx,inty)方法設(shè)置彈出式菜單在組件invoker上的彈出的位置,位置坐標(biāo)(x,y)按invoker的坐標(biāo)系。
94例10-24中,在文本區(qū)上單擊右鍵時,在鼠標(biāo)位置處彈出菜單,用戶選擇相應(yīng)的菜單項可以將文本區(qū)中選中的內(nèi)容復(fù)制、剪切到系統(tǒng)的剪貼板中或?qū)⒓糍N板中的文本內(nèi)容粘貼到文本區(qū),效果如圖10.26所示。焦點事件組件可以觸發(fā)焦點事件。組件可以使用
publicvoidaddFocusListener(FocusListenerlistener)增加焦點事件監(jiān)視器。當(dāng)組件具有焦點監(jiān)視器后,如果組件從無輸入焦點變成有輸入焦點或從有輸入焦點變成無輸入焦點都會觸發(fā)FocusEvent事件。創(chuàng)建監(jiān)視器的類必須實現(xiàn)FocusListener接口,該接口有兩個方法:◆publicvoidfocusGained(FocusEvente)◆publicvoidfocusLost(FocusEvente)
當(dāng)組件從無輸入焦點變成有輸入焦點觸發(fā)FocusEvent事件時,監(jiān)視器調(diào)用類實現(xiàn)的接口方法focusGained(FocusEvente);當(dāng)組件從有輸入焦點變成無輸入焦點觸發(fā)FocusEvent事件時,監(jiān)視器調(diào)用類實現(xiàn)的接口方法focusLost(FocusEvente)。一個組件調(diào)用publicbooleanrequestFocusInWindow()方法可以獲得輸入焦點。
961.使用KeyListener接口處理鍵盤事件當(dāng)一個組件處于激活狀態(tài)時,組件可以成為觸發(fā)KeyEvent事件的事件源。當(dāng)某個組件處于激活狀態(tài)時,如果用戶敲擊鍵盤上一個鍵就導(dǎo)致這個組件觸發(fā)KeyEvent事件。組件使用addKeyListener()方法獲得監(jiān)視器。監(jiān)視器是一個對象,創(chuàng)建該對象的類必須實現(xiàn)接口KeyListener。接口KeyListener中有3個方法:◆publicvoidkeyPressed(KeyEvente)◆publicvoidkeyTyped(KeyEvente)◆publicvoidKeyReleased(KeyEvente)。97當(dāng)按下鍵盤上某個鍵時,監(jiān)視器就會發(fā)現(xiàn),然后方法keyPressed()會自動執(zhí)行,并且KeyEvent類自動創(chuàng)建一個對象傳遞給方法keyPressed()中的參數(shù)e。方法keyTyped()是Pressedkey()和keyReleased()方法的組合。用KeyEvent類的publicintgetKeyCode()方法可以判斷哪個鍵被按下、敲擊或釋
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 核心業(yè)務(wù)外包合同
- 大學(xué)生艾特萊斯創(chuàng)新創(chuàng)業(yè)
- 小班教案:安全乘車
- 護(hù)理管理培訓(xùn)
- 人事部實習(xí)報告總結(jié)模版
- 阿圖什市2024-2025學(xué)年數(shù)學(xué)三下期末經(jīng)典試題含解析
- 阿榮旗2025屆數(shù)學(xué)三下期末考試試題含解析
- 隴南師范高等??茖W(xué)?!队⒄Z寫作1》2023-2024學(xué)年第二學(xué)期期末試卷
- 二零二四年9月份3D打印技術(shù)重現(xiàn)壺口瀑布地質(zhì)構(gòu)造教學(xué)實驗
- 陜西國際商貿(mào)學(xué)院《林產(chǎn)化學(xué)工藝學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024年重慶市江北區(qū)川巴量子學(xué)校小升初語文試卷
- 2024年高考真題-英語(新高考Ⅰ卷) 含解析
- 廣東省醫(yī)療服務(wù)價格項目及價格
- 知道網(wǎng)課智慧《幸福心理學(xué)》測試答案
- 旅游代理代付款協(xié)議書
- 2023年-2025年國企改革深化提升方案
- 第7課全球航路的開辟和歐洲早期殖民擴(kuò)張課件-2023-2024學(xué)年中職高一下學(xué)期高教版(2023)世界歷史全一冊
- 2024年上海市八年級語文下學(xué)期期中考試復(fù)習(xí)(課內(nèi)古詩文+課外文言文)
- 廣東省深圳市龍崗區(qū)2022-2023學(xué)年八年級下學(xué)期期中測試英語試題
- 城市環(huán)境衛(wèi)生作業(yè)經(jīng)費定額(試行)
- 荊州一醫(yī)院官網(wǎng)體檢報告
評論
0/150
提交評論