java 第11章 基于Swing的圖形用戶界面設(shè)計(jì)_第1頁(yè)
java 第11章 基于Swing的圖形用戶界面設(shè)計(jì)_第2頁(yè)
java 第11章 基于Swing的圖形用戶界面設(shè)計(jì)_第3頁(yè)
java 第11章 基于Swing的圖形用戶界面設(shè)計(jì)_第4頁(yè)
java 第11章 基于Swing的圖形用戶界面設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩137頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

基于Swing的圖形用戶界面設(shè)計(jì)1.AWT組件與SWING組件

2.JFrame窗體、布局設(shè)計(jì)

3.文本、按鈕與標(biāo)簽組件、復(fù)選框與單選按鈕

4.中間容器

5.列表組件、表格組件、樹(shù)組件和進(jìn)度條組件

6.窗口事件、鼠標(biāo)事件、焦點(diǎn)事件和鍵盤(pán)事件

7.對(duì)話框、菜單組件11AWT組件與SWING組件概述Java早期進(jìn)行用戶界面設(shè)計(jì)時(shí),使用java.awt包中提供的類(lèi)?!癆WT”就是AbstractWindowToolkit(抽象窗口工具包)的縮寫(xiě)。Java2(JDK1.2)推出之后,增加了一個(gè)新的javax.swing包,該包提供了功能更為強(qiáng)大的用來(lái)設(shè)計(jì)GUI界面的類(lèi)。如果Java運(yùn)行環(huán)境低于1.2版本,就不能運(yùn)行含有SWING組件的程序。

2JComponent類(lèi)的部分子類(lèi)以及Jframe,JDialog類(lèi)

3容器類(lèi)(Container)和組件類(lèi)(Component)4容器---可以容納GUI部件(按某種布局)----窗體(JFrame)、面板(JPanel)組件---部署在容器中,實(shí)現(xiàn)某種交互。----文本框(JTextField)、按鈕(JButton)、標(biāo)簽(JLabel)等容器類(lèi)方法:add(),一個(gè)容器可以調(diào)用這個(gè)方法將組件添加到該容器中。removeAll():可以移掉容器中的全部組件,remove(Componentc):可以移掉容器中參數(shù)指定的組件。

validate()方法:每當(dāng)容器添加新的組件或移掉組件時(shí),應(yīng)該讓容器調(diào)用該方法,以保證容器中的組件能正確顯示出來(lái)。容器本身也是一個(gè)組件,因此可以把一個(gè)容器添加到另一個(gè)容器中實(shí)現(xiàn)容器的嵌套。圖形用戶界面編程的一般步驟創(chuàng)建窗體(設(shè)置窗體大小、位置,讓窗體可見(jiàn))創(chuàng)建GUI(GraphicalUserInterface)組件(按鈕,文本框,標(biāo)簽,列表等)將組件加入窗體這個(gè)容器布局設(shè)置,加入組件處理事件(比如單擊按鈕)JFrame窗體javax.swing.JFrame類(lèi)是java.awt.Frame(窗體)類(lèi)的子類(lèi)當(dāng)應(yīng)用程序需要一個(gè)窗口時(shí),可使用JFrame或其子類(lèi)創(chuàng)建一個(gè)對(duì)象。窗口默認(rèn)地被系統(tǒng)添加到顯示器屏幕上。構(gòu)造方法:JFrame()創(chuàng)建一個(gè)無(wú)標(biāo)題的窗口。JFrame(Strings)創(chuàng)建一個(gè)標(biāo)題為s的窗口。JFrame類(lèi)常用方法:publicvoidsetBounds(inta,intb,intwidth,intheight)設(shè)置出現(xiàn)在屏幕上時(shí)的初始位置為(a,b),即距屏幕左面a個(gè)像素、距屏幕上方b個(gè)像素;窗口的寬是width,高是height。publicvoidsetSize(intwidth,intheight)設(shè)置窗口的大小,在屏幕出現(xiàn)默認(rèn)位置是(0,0)。publicvoidsetVisible(booleanb)設(shè)置窗口是可見(jiàn)還是不可見(jiàn),窗口默認(rèn)是不可見(jiàn)的。publicvoidsetResizable(booleanb)設(shè)置窗口是否可調(diào)整大小,窗口默認(rèn)是可調(diào)整大小的。JFrame類(lèi)常用方法publicvoidsetDefaultCloseOperation(intoperation)該方法用來(lái)設(shè)置單擊窗體右上角的關(guān)閉圖標(biāo)后,程序會(huì)做出怎樣的處理。其中的參數(shù)operation取下列有效值:DO_NOTHING_ON_CLOSE什么也不做HIDE_ON_CLOSE隱藏當(dāng)前窗口DISPOSE_ON_CLOSE隱藏當(dāng)前窗口,并釋放窗體占有的其他資源EXIT_ON_CLOSE結(jié)束窗體所在的應(yīng)用程序這4個(gè)常量都是JFrame類(lèi)中的static常量,單擊關(guān)閉圖標(biāo)后,程序根據(jù)operation取值做出不同的處理。JFrameDemo01.java布局設(shè)計(jì)當(dāng)把組件添加到容器中時(shí),希望控制組件在容器中的位置,這就需要學(xué)習(xí)布局設(shè)計(jì)的知識(shí)。常見(jiàn)布局:

java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout布局類(lèi);

java.swing.border包中的BoxLayout布局類(lèi)。容器可以調(diào)用方法setLayout(布局對(duì)象);設(shè)置自己的布局。比如setLayout(newCardLayout());對(duì)于JFrame窗口,默認(rèn)布局是BorderLayout布局。1.FlowLayout布局FlowLayout屬于流式布局管理器,使用此種布局方式,所有組件會(huì)像流水一樣依次進(jìn)行排列。其常用構(gòu)造方法如下:

publicFlowLayout()構(gòu)造一個(gè)新的FlowLayout,它是居中對(duì)齊的,默認(rèn)的水平和垂直間隙是5個(gè)單位。publicFlowLayout(int

align)構(gòu)造一個(gè)新的FlowLayout,它具有指定的對(duì)齊方式,默認(rèn)的水平和垂直間隙是5個(gè)單位。align參數(shù)的值必須是以下值之一:FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADING或FlowLayout.TRAILING。publicFlowLayout(int

align,int

hgap,int

vgap)

創(chuàng)建一個(gè)新的流布局管理器,它具有指定的對(duì)齊方式以及指定的水平和垂直間隙。

10FlowLayout的常用方法publicvoidsetAlignment(int

align)設(shè)置布局的對(duì)齊方式。publicvoidsetHgap(int

hgap)設(shè)置組件之間以及組件與Container的邊之間的水平間隙。publicvoidsetVgap(int

vgap)設(shè)置組件之間以及組件與Container的邊之間的垂直間隙。publicintgetHgap()獲取組件之間以及組件與Container的邊之間的水平間隙。publicintgetVgap()獲取組件之間以及組件與Container的邊之間的垂直間隙。例:FlowLayoutDemo0111BorderLayout布局BorderLayout布局是Window容器的默認(rèn)布局。JFrame、JDialog都是Window類(lèi)的間接子類(lèi),它們的內(nèi)容面板的默認(rèn)布局都是BorderLayout布局。如果一個(gè)容器使用這種布局,那么容器空間簡(jiǎn)單地劃分為東、西、南、北、中五個(gè)區(qū)域。每加入一個(gè)組件都應(yīng)該指明把這個(gè)組件添加在哪個(gè)區(qū)域中,區(qū)域由BorderLayout中的靜態(tài)常量CENTER、NORTH、SOUTH、WEST、EAST表示。例如,一個(gè)使用BorderLayout布局的容器con,可以使用add()方法將一個(gè)組件b添加到中心區(qū)域:con.add(b,BorderLayout.CENTER);或con.add(BorderLayour.CENTER,b);注:如果不指定區(qū)域,則默認(rèn)加入到CENTER;添加到某個(gè)區(qū)域的組件將占據(jù)整個(gè)這個(gè)區(qū)域.每個(gè)區(qū)域只能放置一個(gè)組件,如果向某個(gè)已放置了組件的區(qū)域再放置一個(gè)組件,那么先前的組件將被后者替換。注:使用BorderLayout布局的容器最多能添加5個(gè)組件,如果組件超過(guò)5個(gè),就必須使用容器的嵌套或改用其他布局策略。例BorderLayoutDemo01.java13CardLayout布局使用CardLayout容器可以容納多個(gè)組件,但同一時(shí)刻容器只能從這些組件中選出一個(gè)來(lái)顯示,就像一疊“撲克牌”每次只能顯示最上面的一張一樣,這個(gè)被顯示的組件將占據(jù)所有的容器空間。JTabbedPane(窗格,中間容器)的默認(rèn)布局是CardLayout布局,并且自帶一些選項(xiàng)卡,這些選項(xiàng)卡與用戶添加到JTabbedPane窗格中的組件相對(duì)應(yīng),單擊該選項(xiàng)卡,JTabbedPane窗格將顯示對(duì)應(yīng)的組件。選項(xiàng)卡窗格自帶的選項(xiàng)卡默認(rèn)地在該選項(xiàng)卡窗格的頂部,從左向右依次排列,選項(xiàng)卡的順序和所對(duì)應(yīng)的組件的順序相同。使用JTabbedPane窗格的構(gòu)造方法publicJTabbedPane(inttabPlacement)創(chuàng)建的選項(xiàng)卡窗格的選項(xiàng)卡的位置由參數(shù)tabPlacement指定,該參數(shù)的有效值為JTabbedPane.TOP、JTtabbedPane.BOTTOM、JTabbedPane.LEFT和JTabbedPane.RIGHT。JTabbedPane窗格可以使用add(Stringtext,Componentc);方法將組件c添加到JTabbedPane窗格中,并指定和組件c對(duì)應(yīng)的選項(xiàng)卡的文本提示是text。例:CardLayoutDemo01,在選項(xiàng)卡窗格中添加了5個(gè)按鈕(帶有圖標(biāo)),并設(shè)置了相對(duì)應(yīng)的選項(xiàng)卡的文本提示,然后將選項(xiàng)卡窗格添加到窗體的內(nèi)容面板中(效果如圖10.6所示)。1516GridLayout布局GridLayout是使用較多的布局編輯器,其基本布局策略是把容器劃分成若干行若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來(lái)的小格中。使用GridLayout布局編輯器的一般步驟如下:(1)使用GridLayout的構(gòu)造方法GridLayout(intm,intn)創(chuàng)建布局對(duì)象,指定劃分網(wǎng)格的行數(shù)m和列數(shù)n,如GridLayoutgrid=newGridLayout(10,8);(2)使用GridLayout布局的容器調(diào)用方法add()將組件加入容器,組件進(jìn)入容器的順序?qū)凑盏谝恍械谝粋€(gè)、第一行第二個(gè)…第一行最后一個(gè)、第二行第一個(gè)…最后一行第一個(gè)…最后一行最后一個(gè)。例如GridLayoutDemo01:使用GridLayout布局的容器最多可添加m×n個(gè)組件。GridLayout布局中每個(gè)網(wǎng)格都是相同大小,并且強(qiáng)制組件與網(wǎng)格的大小相同。為了克服這個(gè)缺點(diǎn),可以使用容器嵌套。例如,一個(gè)容器使用GridLayout布局,將容器分為三行一列的網(wǎng)格,那么可以把另一個(gè)容器添加到某個(gè)網(wǎng)格中;而添加的這個(gè)容器又可以設(shè)置為GridLayout布局、FlowLayout布局、CarderLayout布局或BorderLayout布局等。利用這種嵌套方法,可以設(shè)計(jì)出符合一定需要的布局.BoxLayout布局用BoxLayout類(lèi)可以創(chuàng)建一個(gè)布局對(duì)象,稱(chēng)為盒式布局。BoxLayout在java.swing.border包中。javaswing包提供了Box類(lèi),該類(lèi)也是Container類(lèi)的一個(gè)子類(lèi),創(chuàng)建的容器稱(chēng)為一個(gè)盒式容器。盒式容器的默認(rèn)布局是盒式布局,而且不允許更改盒式容器的布局。因此,在策劃程序的布局時(shí),可以利用容器的嵌套,將某個(gè)容器嵌入幾個(gè)盒式容器,達(dá)到布局目的。BoxLayou的構(gòu)造方法BoxLayout(Containercon,intaxis)可以創(chuàng)建一個(gè)盒式布局對(duì)象,并指定容器con使用該布局對(duì)象,參數(shù)axis的有效值是BoxLayout.X_AXIS和BoxLayout.Y_AXIS。Box類(lèi)的類(lèi)(靜態(tài))方法createHorizontalBox()可以獲得一個(gè)具有行型盒式布局的盒式容器;Box類(lèi)的類(lèi)(靜態(tài))方法createVerticalBox()可以獲得一個(gè)具有列型盒式布局的盒式容器??刂坪惺讲季秩萜髦薪M件之間的距離,需要使用水平支撐或垂直支撐。Box類(lèi)調(diào)用靜態(tài)方法createHorizontalStrut(intwidth)可以得到一個(gè)不可見(jiàn)的水平Struct類(lèi)型對(duì)象.稱(chēng)為水平支撐.該水平支撐的高度為0,寬度是width。Box類(lèi)調(diào)用靜態(tài)方法createVertialStrut(intheight)可以得到一個(gè)不可見(jiàn)的垂直Struct類(lèi)型對(duì)象,稱(chēng)為垂直支撐.參數(shù)height決定垂直支撐的高度,垂直支撐的寬度為0。

例BoxLayoutDemo01.java中(效果如圖10.7所示),有兩個(gè)列型盒式容器boxV1、boxV2和一個(gè)行型盒式容器baseBox。在列型盒式容器的組件之間添加垂直支撐,控制組件之間的距離,將boxV1、boxV2添加到baseBox中,并在它們之間添加水平支撐。21null布局可以把一個(gè)容器的布局設(shè)置為null布局(空布局)。setLayout(null)空布局容器可以準(zhǔn)確地定位組件在容器的位置和大小。setBounds(inta,intb,intwidth,intheight)方法是所有組件都擁有的一個(gè)方法,組件調(diào)用該方法可以設(shè)置本身的大小和在容器中的絕對(duì)位置??詹季值娜萜魈砑咏M件步驟:1.

把容器p的布局設(shè)置為空布局p.setLayout(null);

2.向空布局的容器p添加一個(gè)組件c需要兩個(gè)步驟。首先使用add(c)方法向容器添加組件,然后組件c再調(diào)用setBounds(inta,intb,intwidth,intheight)方法設(shè)置該組件在容器中的位置和本身的大小。組件都是一個(gè)矩形結(jié)構(gòu),方法中的參數(shù)a和b是被添加的組件c的左上角在容器中的位置坐標(biāo),即該組件距容器左面a個(gè)像素,距容器上方b個(gè)像素;weidth和height是組件c的寬和高。中間容器_JPanel面板JPanel面板可以使用JPanel創(chuàng)建一個(gè)面板,再向這個(gè)面板添加組件,然后把這個(gè)面板添加到底層容器或其他中間容器中。JPanel面板的默認(rèn)布局是FlowLayout布局。JPanel類(lèi)構(gòu)造方法Jpanel()可以構(gòu)造一個(gè)面板容器對(duì)象。JPanelDemo01中間容器_JScrollPaneJScrollPane滾動(dòng)窗格可以把一個(gè)組件放到一個(gè)滾動(dòng)窗格中,然后通過(guò)滾動(dòng)條來(lái)觀察這個(gè)組件。JScorollPane的構(gòu)造方法JScorollPane(componentc)可以構(gòu)造一個(gè)滾動(dòng)窗格。JScrollPaneDemo01中間容器-JSplitPane拆分窗格拆分窗格有兩種類(lèi)型水平拆分和垂直拆分。水平拆分窗口用一條拆分線把容器分成左右兩部分,左面放一個(gè)組件,右面放一個(gè)組件,拆分線可以水平移動(dòng)。垂直拆分窗格由一條拆分線分成上下兩部分,上面放一個(gè)組件,下面放一個(gè)組件,拆分線可以垂直移動(dòng)。構(gòu)造方法JSplitPane(inta,Componentb,Componentc)可以構(gòu)造一個(gè)拆分窗格,參數(shù)a取JSplitPane的靜態(tài)常量HORIZONTAL_SPLIT或VERTICAL_SPLIT,以決定是水平還是垂直拆分。后兩個(gè)參數(shù)決定要放置的組件。拆分窗格調(diào)用setDividerLocation(doubleposition)設(shè)置拆分線的位置。JSplitPaneDemo01

文本組件--JTextFieldJTextField創(chuàng)建的一個(gè)對(duì)象就是一個(gè)文本框。用戶可以在文本框輸入單行的文本。

J構(gòu)造方法:

JTextField(intx)

創(chuàng)建指定長(zhǎng)度的單行文本框?qū)ο蟆?/p>

JTextField(Strings)

創(chuàng)建文本框?qū)ο?,則文本框的初始字符串為s,可以在文本框中輸入若干個(gè)字符。27JTextField常用方法

publicvoidsetText(Strings)

設(shè)置文本框中的文本為參數(shù)s指定的文本,文本框中先前的文本將被清除。

publicStringgetText()

獲取文本框中的文本。

publicvoidsetEditable(booleanb)

指定文本框的可編輯性。創(chuàng)建的文本框默認(rèn)是可編輯的。

publicvoidsetHorizontalAlignment(intalignment)

設(shè)置文本在文本框中的對(duì)齊方式,alignment的有效值為JTextField.LEFT、JTextField.CENTER和JTextField.RIGHT。28文本組件-JPasswordField使用JTextField的子類(lèi)JPasswordField可以建立一個(gè)密碼框?qū)ο?。publicvoidsetEchoChar(charc)設(shè)置回顯字符(默認(rèn)的回顯字符是'*'),publicchar[]

getPassword()方法返回密碼框中的密碼。29文本組件--JTextAreaJTextArea類(lèi)專(zhuān)門(mén)用來(lái)建立文本區(qū),用戶可以在文本區(qū)輸入多行的文本.

JTextArea(introws,intcolumns)

構(gòu)造一個(gè)可見(jiàn)行和可見(jiàn)列分別是rows和columns的文本區(qū)。

setLineWrap(booleanb)

決定輸入的文本能否在文本區(qū)的右邊界自動(dòng)換行;

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ū)中字符的個(gè)數(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類(lèi)是專(zhuān)門(mén)用來(lái)建立按鈕的,即JButton類(lèi)創(chuàng)建的一個(gè)對(duì)象就是一個(gè)按鈕。JButton類(lèi)常用的構(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指定?!魀ublicStringgetText()

獲取當(dāng)前按鈕上的名字?!魀ublicvoidsetIcon(Iconicon)

重新設(shè)置當(dāng)前按鈕上的圖標(biāo)。◆publicIcongetIcon()

獲取當(dāng)前按鈕上的圖標(biāo)◆publicvoidsetHorizontalTextPosition(inttextPosition)

設(shè)置按鈕名字相對(duì)按鈕上圖標(biāo)的水平位置。33

2.JLabel標(biāo)簽

JLabel類(lèi)負(fù)責(zé)創(chuàng)建標(biāo)簽對(duì)象,標(biāo)簽用來(lái)顯示信息。JLabel類(lèi)的構(gòu)造方法如下:publicJLabel(Strings)創(chuàng)建名字是s的標(biāo)簽,s在標(biāo)簽中靠左對(duì)齊。publicJLabel(Strings,intaligment)參數(shù)aligment決定標(biāo)簽中的文字在標(biāo)簽中的水平對(duì)齊方式。aligment的取值是JLabel.CENTER、JLabel.LEFT或JLabel.RIGHT。publicJLabel(Iconicon)創(chuàng)建具有圖標(biāo)icon的標(biāo)簽,icon在標(biāo)簽中靠左對(duì)齊。publicJLabel(Strings,Iconicon,intaligment)創(chuàng)建名字是s,具有圖標(biāo)icon的標(biāo)簽。參數(shù)aligment決定標(biāo)簽中的文字和圖標(biāo)作為一個(gè)整體在標(biāo)簽中的水平對(duì)齊方式(名字總是在圖標(biāo)的右面)。34JLabel類(lèi)的常用方法

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確定名字相對(duì)于標(biāo)簽上的圖標(biāo)的位置。a的取值是JLabel.LEFT或JLabel.RIGHT。

voidsetVerticalTextPosition(inta)

參數(shù)a確定名字相對(duì)于JLabel上的圖標(biāo)的位置。參數(shù)a取值是JLabel.BOTTOM或JLabel.TOP。35事件與監(jiān)聽(tīng)器如果要使一個(gè)圖形界面變的有意義,就必須加入事件處理。當(dāng)一個(gè)按鈕按下時(shí),在文本框中按回車(chē)鍵完成輸入時(shí),按鈕和文本框內(nèi)容的狀態(tài)都會(huì)發(fā)生變化,此時(shí)就會(huì)產(chǎn)生一個(gè)事件,而如果要處理此事件,則需要事件的監(jiān)聽(tīng)者不斷的監(jiān)聽(tīng)事件的變化,并根據(jù)這些事件進(jìn)行響應(yīng)的處理。在Swing編程中,依然使用了AWT的事件處理方式,所有的事件類(lèi)(基本上任意的一個(gè)組件都有對(duì)應(yīng)的事件)都是EventObject的子類(lèi)。36ActionEvent事件在學(xué)習(xí)處理事件時(shí),讀者必須很好地掌握事件源、監(jiān)視器、處理事件的接口這三個(gè)概念。JTextField、JPasswordField和JButton觸發(fā)ActionEvent事件,通過(guò)處理文本框這個(gè)具體的組件上的事件,來(lái)掌握處理事件的基本原理。371)處理事件-----事件源事件源:能夠產(chǎn)生事件的對(duì)象都可以稱(chēng)為事件源,如文本框、按鈕、下拉式列表等。也就是說(shuō),事件源必須是一個(gè)對(duì)象,而且這個(gè)對(duì)象必須是Java認(rèn)為能夠發(fā)生事件的對(duì)象。事件:用戶對(duì)事件源進(jìn)行了某種操作,進(jìn)而觸發(fā)了指定的事件。比如單擊按鈕,在文本框中按回車(chē)鍵等。2)處理事件-----監(jiān)視器監(jiān)視器:我們需要一個(gè)對(duì)象對(duì)事件源進(jìn)行監(jiān)視,以便對(duì)發(fā)生的事件做出處理。AWT定義了各種類(lèi)型的事件,每一種事件都有相應(yīng)的事件監(jiān)視者接口,在接口中描述了處理相應(yīng)事件應(yīng)實(shí)現(xiàn)的基本行為。若事件類(lèi)名為XxxEvent,則事件監(jiān)聽(tīng)接口的命名為XxxListener,給事件源注冊(cè)監(jiān)視器的方法為addXxxListener(XxxListenerlistener)AWT事件接口及處理方法描述信息接口名稱(chēng)方法(事件)點(diǎn)擊按鈕、點(diǎn)擊菜單項(xiàng)、文本框按回車(chē)等動(dòng)作ActionListeneractionPerformed(ActionEvent)選擇了可選項(xiàng)的項(xiàng)目ItemListeneritemStateChanged(ItemEvent)文本部件內(nèi)容改變TextListenertextValueChanged(TextEvent)移動(dòng)了滾動(dòng)條等部件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠標(biāo)移動(dòng)MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠標(biāo)點(diǎn)擊等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)以上接口和類(lèi)均在java.awt.event的包中定義鍵盤(pán)輸入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)部件收到或失去焦點(diǎn)FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)部件移動(dòng)、縮放、顯示/隱藏等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)視器事件源通過(guò)調(diào)用相應(yīng)的方法將某個(gè)對(duì)象作為自己的監(jiān)視器。例如,對(duì)于按鈕,這個(gè)方法是:addActionListener(ActioListenerlistener)當(dāng)單擊了有監(jiān)視器的按鈕時(shí),Java運(yùn)行系統(tǒng)就自動(dòng)用ActionEvent類(lèi)創(chuàng)建了一個(gè)對(duì)象,即發(fā)生了ActionEvent事件。也就是說(shuō),事件源獲得監(jiān)視器之后,相應(yīng)的操作就會(huì)導(dǎo)致事件的發(fā)生,并通知監(jiān)視器,監(jiān)視器就會(huì)做出相應(yīng)的處理。3)處理事件-----接口ActionListener作為監(jiān)聽(tīng)器,負(fù)責(zé)處理事件源發(fā)生的事件,但它本身是一個(gè)接口:publicinterfaceActionListenerextendsEventListener{voidactionPerformed(ActionEvente)//抽象方法,處理事件}3)處理事件-----接口ActionListener是接口,因此必須將一個(gè)實(shí)現(xiàn)了ActionListener接口的類(lèi)創(chuàng)建的對(duì)象傳遞給addActionListener方法的參數(shù),使得該對(duì)象成為事件源的監(jiān)視器。創(chuàng)建監(jiān)視器的類(lèi)必須提供處理事件的特定方法,即實(shí)現(xiàn)接口中的actionPerformed(ActionEvente)方法。classTestimplementsActionListener{publicvoidactionPerformed(ActionEvente){//事件的處理過(guò)程}}Java采用接口回調(diào)技術(shù)來(lái)處理事件,當(dāng)事件源發(fā)生事件時(shí),接口立刻通知監(jiān)視器自動(dòng)調(diào)用實(shí)現(xiàn)的某個(gè)接口方法,接口方法規(guī)定了怎樣處理事件的操作。接口回調(diào)這一過(guò)程對(duì)程序是不可見(jiàn)的,Java在設(shè)計(jì)組件事件時(shí)已經(jīng)設(shè)置好了這一回調(diào)過(guò)程,程序只需讓事件源獲得正確的監(jiān)視器,即將實(shí)現(xiàn)了正確接口的對(duì)象的引用傳遞給方法addActionListener(ActionListenerlistener)中的參數(shù)listener事件處理模式

事件處理模式如圖10.9所示.46誰(shuí)作為監(jiān)聽(tīng)者合適?

(1)事件源對(duì)象的容器類(lèi)作為監(jiān)聽(tīng)者

btn1.addActionListener(this);importjava.awt.event.*;publicclassTestextendsJFrameimplementsActionListener{publicTest(){...

btn1.addActionListener(this);...}

publicvoidactionPerformed(ActionEvente){…}…}誰(shuí)作為監(jiān)聽(tīng)者合適?

(2)用內(nèi)嵌類(lèi)實(shí)現(xiàn)

btn1.addActionListener(newProcess());publicclassTestextendsJFrame{publicTest(){...

btn1.addActionListener(newProcess());....}

classProcessimplementsActionListener{publicvoidactionPerformed(ActionEvente){…}}}誰(shuí)作為監(jiān)聽(tīng)者合適?

(3)用匿名內(nèi)嵌類(lèi)實(shí)現(xiàn)

btn1.addActionListener(newActionListener();publicclassTestextendsJFrame{publicTest(){...

btn1.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){…}});...}…}ActionEvent類(lèi)中的方法當(dāng)多個(gè)事件源擁有同一個(gè)監(jiān)視器時(shí),在事件處理過(guò)程中需要區(qū)分事件源,可以采取的方法有:publicObjectgetSource()返回發(fā)生ActionEvent事件的對(duì)象的引用。publicStringgetActionCommand()獲取發(fā)生ActionEvent事件時(shí),和該事件相關(guān)的一個(gè)命令字符串對(duì)于文本框,當(dāng)發(fā)生ActionEvent事件時(shí),用戶在文本框中輸入的文本字符串就是和該事件相關(guān)的一個(gè)命令字符串。對(duì)于按鈕,該命令字符串就是按鈕上顯示的字符

Esource.java50ActionEventDemo01中,窗口中有一個(gè)文本框text,text的事件監(jiān)視器由PoliceStation類(lèi)負(fù)責(zé)創(chuàng)建。當(dāng)用戶在text中輸入字符串回車(chē)后,監(jiān)視器負(fù)責(zé)在命令行輸出該字符串以及它的長(zhǎng)度(效果如圖10.10所示)。

ActionEventDemo02中,titleText和passwordText有監(jiān)視器。當(dāng)在titleText中輸入字符串回車(chē)后,監(jiān)視器負(fù)責(zé)將窗體的標(biāo)題更改為當(dāng)前titleText中的文本。當(dāng)在passwordText中輸入密碼回車(chē)后,監(jiān)視器負(fù)責(zé)將密碼顯示在titleText中(效果如圖10.11所示)。

ActionEventDemo03使用匿名對(duì)象作為inputText的監(jiān)視器,當(dāng)在inputText中輸入一個(gè)數(shù)字字符串后,監(jiān)視器負(fù)責(zé)計(jì)算這個(gè)數(shù)的平方,并將結(jié)果放入showText中(效果如圖10.12所示)。51

例子10-8,9,10運(yùn)行效果圖10.10,10.11,10.1252事件適配器類(lèi)Java中為那些含多個(gè)方法的監(jiān)聽(tīng)者接口提供了事件適配器類(lèi),對(duì)應(yīng)XxxListener接口,這個(gè)類(lèi)命名為XxxAdapter,在該類(lèi)中以空方法體實(shí)現(xiàn)了相應(yīng)接口的所有方法。比如:WindowListener接口中包含了7個(gè)抽象方法,對(duì)應(yīng)的適配器類(lèi)就是WindowAdapter,該類(lèi)中以空方法的方式實(shí)現(xiàn)了相應(yīng)接口的所有方法。程序員設(shè)計(jì)可通過(guò)繼承適配器類(lèi)來(lái)編寫(xiě)監(jiān)聽(tīng)者類(lèi),在類(lèi)中只需給出關(guān)心的方法,即重寫(xiě)關(guān)心的方法。MyFrame.javaJTextArea的DucumentEvent事件

文本區(qū)可以觸發(fā)DucumentEvent事件,DucumentEven類(lèi)在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ù)的文檔注冊(cè)監(jiān)視器。監(jiān)視器需實(shí)現(xiàn)DucumentListener接口,該接口中有3個(gè)方法:publicvoidchangedUpdate(DocumentEvente)publicvoidremoveUpdate(DocumentEvente)publicvoidinsertUpdate(DocumentEvente)getDocument()返回維護(hù)的文檔,該文檔是實(shí)現(xiàn)了Document接口類(lèi)的一個(gè)實(shí)例。

54例Example10_12中,有兩個(gè)文本區(qū)和一個(gè)文本框。當(dāng)用戶在文本區(qū)inputText進(jìn)行編輯操作時(shí),文本區(qū)showText將顯示第一個(gè)文本區(qū)中所有和指定模式匹配的字符串。用戶可以事先在一個(gè)文本框patternText中輸入指定的模式,比如,輸入:[^\s\d\p{Punct}]+,即通過(guò)該模式獲得文本區(qū)inputText中的全部單詞,效果如圖10.14所示。JCheckBox復(fù)選框復(fù)選框提供兩種狀態(tài)一種是選中,另一種是未選中,用戶通過(guò)單擊該組件切換狀態(tài)。JCheckBox類(lèi)構(gòu)造方法:

publicJCheckBox()創(chuàng)建一個(gè)沒(méi)有名字的復(fù)選框,初始狀態(tài)是未選中。publicJCheckBox(Stringtext)創(chuàng)建一個(gè)名字是text的復(fù)選框,初始狀態(tài)是未選中。publicJCheckBox(Iconicon)創(chuàng)建一個(gè)帶有默認(rèn)圖標(biāo)icon但沒(méi)有名字的復(fù)選框,初始狀態(tài)是未選中。publicJCheckBox(Stringtext,Iconicon)創(chuàng)建一個(gè)帶有默認(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)常被使用,因?yàn)槿绻幻黠@地設(shè)置選中狀態(tài)時(shí)的圖標(biāo),復(fù)選框無(wú)論是選中狀態(tài)還是未選種狀態(tài)總是顯示復(fù)選框上的默認(rèn)圖標(biāo),用戶很難知道復(fù)選框是處于怎樣的狀態(tài)。

publicbooleanisSelected()

如果復(fù)選框處于選中狀態(tài)該方法返回true,否則返回false。如果復(fù)選框沒(méi)有指定默認(rèn)圖標(biāo),復(fù)選框就顯示為一個(gè)“小方框”,如果是選中狀態(tài),“小方框”里面就有個(gè)小對(duì)號(hào)。57復(fù)選框ItemEvent事件當(dāng)復(fù)選框獲得監(jiān)視器之后,復(fù)選框從未選中狀態(tài)變成選中狀態(tài)或從選中狀態(tài)變成未選中狀態(tài)時(shí)就發(fā)生ItemEvent事件,ItemEvent類(lèi)將自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。發(fā)生ItemEvent事件的事件源獲得監(jiān)視器的方法是addItemListener(ItemListenerlistener)處理ItemEvent事件的接口是ItemListener,創(chuàng)建監(jiān)視器的類(lèi)必須實(shí)現(xiàn)ItemListener接口,該接口中只有一個(gè)接口方法publicvoiditemStateChanged(ItemEvente),對(duì)發(fā)生的事件做出處理。58ItemEvent事件對(duì)象的方法publicObjectgetSource()獲得產(chǎn)生事件的事件源。publicItemSelectablegetItemSelectable()返回事件的產(chǎn)生程序。注意:ItemSelectable是個(gè)接口。JCheckBox是該接口的實(shí)現(xiàn)類(lèi)。59例Example10_14處理了復(fù)選框上的ItemEvent事件,當(dāng)復(fù)選框被選中時(shí),窗口中心顯示一個(gè)帶圖標(biāo)的標(biāo)簽,否則隱藏這個(gè)帶圖標(biāo)的標(biāo)簽,效果如圖10.16所示。60JRadioButton單選按鈕一組單選按鈕同一時(shí)刻只能有一個(gè)被選中。當(dāng)創(chuàng)建了若干個(gè)單選按鈕后,應(yīng)使用ButtonGroup類(lèi)再創(chuàng)建一個(gè)對(duì)象,然后利用這個(gè)對(duì)象把這若干個(gè)單選按鈕歸組。歸到同一組的單選按鈕每一時(shí)刻只能選一。單選按鈕和復(fù)選框一樣,也觸發(fā)ItemEvent事件。

ButtonGroupfruit=newButtonGroup();JRadioButtonbutton1=newJRadioButton("小學(xué)"),button2=newJRadioButton("中學(xué)"),button3=newJRadioButton("大學(xué)");fruit.add(button1);fruit.add(button2);fruit.add(button3);61

列表組件用戶可以在下拉列表看到第一個(gè)選項(xiàng)和它旁邊的箭頭按鈕,當(dāng)用戶單擊箭頭按鈕時(shí),選項(xiàng)列表打開(kāi)。下拉列表的常用方法如下:publicJComboBox()創(chuàng)建一個(gè)沒(méi)有選項(xiàng)下拉列表。publicvoidaddItem(ObjectanObject)增加選項(xiàng)。publicintgetSelectedIndex()返回當(dāng)前下拉列表中被選中的選項(xiàng)的索引,索引的起始值是0。publicObjectgetSelectedItem()返回當(dāng)前下拉列表中被選中的選項(xiàng)。publicvoidremoveItemAt(intanIndex)從下拉列表的選項(xiàng)中刪除索引值是anIndex的選項(xiàng)。publicvoidremoveAllItems()刪除全部選項(xiàng)。publicvoidaddItemListener(ItemListener)向下拉列表增加ItemEvent事件的監(jiān)視器。

62下拉式列表事件源可以發(fā)生ItemEvent事件。當(dāng)下拉列表獲得監(jiān)視器后,用戶在下拉列表的選項(xiàng)中選中某個(gè)選項(xiàng)時(shí)就發(fā)生ItemEvent事件,ItemEvent類(lèi)將自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。

例Example10_15,列表的選項(xiàng)是Java源文件的名字。當(dāng)選擇一個(gè)選項(xiàng)后,程序在一個(gè)文本區(qū)里顯示所選擇的Java源文件的全部?jī)?nèi)容,效果如圖10.17所示。63表格組件使用JTable可以創(chuàng)建一個(gè)表格對(duì)象??梢允褂肑Table的下列構(gòu)造方法創(chuàng)建表格。JTable(Objectdata[][],ObjectcolumnName[])表格的視圖將以行和列的形式顯示數(shù)組data每個(gè)單元中對(duì)象的字符串表示,也就是說(shuō),表格視圖中對(duì)應(yīng)著data單元中對(duì)象的字符串表示。參數(shù)columnName用來(lái)指定表格的列名。用戶在表格單元中輸入的數(shù)據(jù)都被認(rèn)為是一個(gè)Object對(duì)象,用戶通過(guò)表格視圖對(duì)表格單元中的數(shù)據(jù)進(jìn)行編輯,以修改二維數(shù)組data中對(duì)應(yīng)的數(shù)據(jù),在表格視圖中輸入或修改數(shù)據(jù)后,需按回車(chē)鍵或用鼠標(biāo)單擊表格的單元格確定所輸入或修改的結(jié)果。當(dāng)表格需要刷新顯示時(shí),調(diào)用repaint()方法。64

例Example10_16是一個(gè)商品銷(xiāo)售核算錄入程序,客戶通過(guò)一個(gè)表格視圖的單元格輸入每件商品的名稱(chēng)、單價(jià)和銷(xiāo)售量。單擊“每件商品銷(xiāo)售額”按鈕,表格視圖每行的最后一個(gè)單元將顯示該商品的總銷(xiāo)售額;單擊“總銷(xiāo)售額”按鈕,表格視圖將計(jì)算最后一列值的和,同時(shí)表格增加一行,該行的最后一個(gè)單元顯示總銷(xiāo)售額,效果如圖10.18所示。65樹(shù)組件_1.樹(shù)與節(jié)點(diǎn)JTree類(lèi)的實(shí)例稱(chēng)為樹(shù)組件。樹(shù)組件也是常用的組件之一,它由節(jié)點(diǎn)構(gòu)成。要想構(gòu)造一個(gè)樹(shù)組件,必須事先創(chuàng)建出稱(chēng)為節(jié)點(diǎn)的對(duì)象。任何實(shí)現(xiàn)MutableTreeNode接口的類(lèi)創(chuàng)建的對(duì)象都可以成為樹(shù)上的節(jié)點(diǎn),樹(shù)中最基本的對(duì)象是節(jié)點(diǎn),它表示在給定層次結(jié)構(gòu)中的數(shù)據(jù)項(xiàng)。樹(shù)以垂直方式顯示數(shù)據(jù),每行顯示一個(gè)節(jié)點(diǎn)。樹(shù)中只有一個(gè)根節(jié)點(diǎn),所有其他節(jié)點(diǎn)從這里引出。除根節(jié)點(diǎn)外,其他節(jié)點(diǎn)分為兩類(lèi)一類(lèi)是帶子節(jié)點(diǎn)的分支節(jié)點(diǎn),另一類(lèi)是不帶子節(jié)點(diǎn)的葉節(jié)點(diǎn)。每一個(gè)節(jié)點(diǎn)關(guān)聯(lián)著一個(gè)描述該節(jié)點(diǎn)的文本標(biāo)簽和圖像圖標(biāo)。文本標(biāo)簽是節(jié)點(diǎn)中對(duì)象的字符串表示,圖標(biāo)指明該節(jié)點(diǎn)是否是葉節(jié)點(diǎn)。樹(shù)組件的節(jié)點(diǎn)中可以存放對(duì)象,javax.swing.tree包提供的DefaultMutableTreeNode類(lèi)是實(shí)現(xiàn)了MutableTreeNode接口的類(lèi),可以使用這個(gè)類(lèi)創(chuàng)建樹(shù)上的節(jié)點(diǎn)。66樹(shù)組件的常用方法DefaultMutableTreeNode類(lèi)的兩個(gè)常用的構(gòu)造方法是:DefaultMutableTreeNode(ObjectuserObject)創(chuàng)建的節(jié)點(diǎn)默認(rèn)可以有子節(jié)點(diǎn)DefaultMutableTreeNode(ObjectuserObject,booleanallowChildren)add()添加其他節(jié)點(diǎn)作為它的子節(jié)點(diǎn)。setAllowsChildren(booleanb)方法

設(shè)置是否允許有子節(jié)點(diǎn)。getUserObject()方法得到節(jié)點(diǎn)中存放的對(duì)象。JTree(TreeNoderoot)JTree的構(gòu)造方法創(chuàng)建根節(jié)點(diǎn)是root的樹(shù)。TreeNode是接口67樹(shù)組件_2.樹(shù)上的TreeSelectionEvent事件

樹(shù)組件可以觸發(fā)TreeSelectionEvent事件,樹(shù)使用addTreeSelectionListener(TreeSelectionListenerlistener)方法獲得一個(gè)監(jiān)視器。當(dāng)用鼠標(biāo)單擊樹(shù)上的節(jié)點(diǎn)時(shí),系統(tǒng)將自動(dòng)用TreeSelectionEvent類(lèi)創(chuàng)建一個(gè)事件對(duì)象,通知樹(shù)的監(jiān)視器,監(jiān)視器將自動(dòng)調(diào)用TreeSelectionListener接口中的方法。創(chuàng)建監(jiān)視器的類(lèi)必須實(shí)現(xiàn)TreeSelectionListener接口,此接口中的方法是:publicvoidvalueChanged(TreeSelectionEvente)getLastSelectedPathComponent()樹(shù)使用該方法獲取選中的節(jié)點(diǎn)。

68例Example10_17,節(jié)點(diǎn)中存放的對(duì)象由Student類(lèi)創(chuàng)建,當(dāng)用戶選中節(jié)點(diǎn)時(shí),窗口中的文本區(qū)顯示節(jié)點(diǎn)中存放的對(duì)象的有關(guān)信息,效果如圖10.19所示。69進(jìn)度條組件_1.JProgressBar類(lèi)JProgressBar類(lèi)可以創(chuàng)建進(jìn)度條組件。該組件能用一種顏色動(dòng)態(tài)地填充自己,以便顯示某任務(wù)完成的百分比。三個(gè)常用的構(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)可以改變最大和最小這兩個(gè)值。setSize()

設(shè)置進(jìn)度條大。進(jìn)度條的最大值max是指將進(jìn)度條平均分成max份。如果進(jìn)度條的最小值是min,那么使用setValue(intn)方法時(shí),n不能小于min。setStringPainted(booleana)

設(shè)置是否使用百分?jǐn)?shù)或字符串來(lái)表示進(jìn)度條的進(jìn)度情況intgetValue()

獲取進(jìn)度值71例10-18(效果如圖10.20所示)用進(jìn)度條模擬顯示線程的計(jì)算速度,一個(gè)線程用遞歸算法輸出Fibinacci序列的前50項(xiàng),另一個(gè)線程使用循環(huán)輸出Fibinacci序列的前100項(xiàng)(Fibinacci序列的前兩項(xiàng)是1,以后每項(xiàng)是前兩項(xiàng)的和)。72進(jìn)度條組件_2.帶進(jìn)度條的輸入流我們最熟悉進(jìn)度條的一種用法是讀取文件時(shí)出現(xiàn)一個(gè)表示讀取進(jìn)度的進(jìn)度條。這也是進(jìn)度條的用武之地。如果讀取文件時(shí)希望看見(jiàn)文件的讀取進(jìn)度,可以使用javax.swing包提供的輸入流類(lèi)ProgressMonitorInputStream。它的構(gòu)造方法是:ProgressMonitorInputStream(Conmponentc,Strings,InputStream);它創(chuàng)建的輸入流在讀取文件時(shí)會(huì)彈出一個(gè)顯示讀取速度的進(jìn)度條,進(jìn)度條在參數(shù)c指定的組件的正前方顯示,若該參數(shù)取null,則在屏幕的正前方顯示。

73例Example10_19使用帶進(jìn)度條的輸入流讀取文件的內(nèi)容,效果如圖10.21所示。74組件的常見(jiàn)方法

JComponent類(lèi)是所有組件的父類(lèi),本節(jié)介紹JComponent類(lèi)的幾個(gè)常用方法。組件都是矩形形狀,組件本身有一個(gè)默認(rèn)的坐標(biāo)系,組件的左上角的坐標(biāo)值是(0,0)。如果一個(gè)組件的寬是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類(lèi)。Color類(lèi)是java.awt包中的類(lèi),該類(lèi)創(chuàng)建的對(duì)象稱(chēng)為顏色對(duì)象。publicColor(intred,intgreen,ingblue)Color類(lèi)的構(gòu)造方法,可以創(chuàng)建一個(gè)顏色對(duì)象,其中red、green、blue的取值在0~255之間。另外,Color類(lèi)中還有red、blue、green、orange、cyan、yellow、pink等靜態(tài)常量,都是顏色對(duì)象。76組件的常見(jiàn)方法_2.組件透明組件默認(rèn)是不透明的。

publicvoidsetOpaque(booleanisOpaque)設(shè)置組件是否不透明,當(dāng)參數(shù)isOpaque取false時(shí)組件被設(shè)置為透明,取true時(shí)組件被設(shè)置為不透明。

publicbooleanisOpaque()當(dāng)組件不透明時(shí)該方法返回true,否則返回false。77組件的常見(jiàn)方法_3.組件的邊框組件默認(rèn)邊框是一個(gè)黑邊的矩形。publicvoidsetBorder(Borderborder)設(shè)置組件的邊框。publicBordergetBorder()返回邊框。組件調(diào)用setBorder()方法來(lái)設(shè)置邊框,該方法的參數(shù)是一個(gè)接口,因此必須向該參數(shù)傳遞一個(gè)實(shí)現(xiàn)接口Border類(lèi)的實(shí)例,如果傳遞一個(gè)null,組件將取消邊框??梢允褂肂orderFactory類(lèi)的類(lèi)方法返回一個(gè)實(shí)現(xiàn)接口Border類(lèi)的實(shí)例,如BorderFactory類(lèi)的類(lèi)方法createBevelBorder(inttype,Colorhighlight,Colorshadow)將會(huì)得到一個(gè)具有“斜角”的邊框,參數(shù)type取值為BevelBorder.LOWERED或BevelBorder.RAISED。

78組件的字體publicvoidsetFont(Fontf)組件調(diào)用該方法設(shè)置組件上的字體?!魀ublicFontgetFont()組件調(diào)用該方法獲取組件上的字體?!鬸ava.awt包中的Font類(lèi)創(chuàng)建的對(duì)象稱(chēng)為字體對(duì)象。Font類(lèi)的構(gòu)造方法是:

publicFont(Stringname,intstyle,intsize);創(chuàng)建字體對(duì)象其中name是字體的名字,如果系統(tǒng)不支持字體的名字,將取默認(rèn)的名字創(chuàng)建字體對(duì)象。style決定字體的樣式,是一個(gè)整數(shù),有效取值是:Font.BOLD、Font.PLAIN、Font.ITALIC、Font.ROMAN_BASELINE、Font.CENTER_BASELINE、Font.HANGING_BASELINE或Font.TRUETYPE_FONT。◆79組件的字體◆GraphicsEnviroment類(lèi)是java.awt包中的抽象類(lèi),不能用構(gòu)造方法創(chuàng)建對(duì)象,Java運(yùn)行環(huán)境準(zhǔn)備好了這個(gè)對(duì)象,只需讓GraphicsEnvironment類(lèi)調(diào)用它的類(lèi)方法獲取這個(gè)對(duì)象的引用即可publicGraphicsEnvironmentstaticgetLocalGraphicsEnvironment()◆

String[]getAvailableFontFamilyNames()GraphicsEnvironment對(duì)象調(diào)用該方法獲取計(jì)算機(jī)上所有可用的字體名稱(chēng),并存放到字符串?dāng)?shù)組中。

例10-20中,下拉列表listFont中列出全部可用字體名字,在下拉列表listFont中選擇字體名字后,文本區(qū)用相應(yīng)的字體顯示特定的文本“北京奧運(yùn)”(效果如圖10.23所示)。80

例子10-20運(yùn)行效果圖10.2381組件的大小與位置publicvoidsetSize(intwidth,intheight)設(shè)置組件的大小,參數(shù)width指定組件的寬度,height指定組件的高度?!魀ublicvoidsetLocation(intx,inty)設(shè)置組件在容器中的位置,包含該組件的容器都有默認(rèn)的坐標(biāo)系,容器的坐標(biāo)系的左上角的坐標(biāo)是(0,0),參數(shù)x和y指定該組件的左上角在容器的坐標(biāo)系中的坐標(biāo),即組件距容器的左邊界x個(gè)像素,距容器的上邊界y個(gè)像素?!魀ublicDimensiongetSize()返回一個(gè)Dimension對(duì)象的引用,該對(duì)象實(shí)體中含有名字是width和height的成員變量,方法返回的Dimmension對(duì)象的width的值就是組件的寬度、height的值就是當(dāng)前組件的高度?!魀ublicPointgetLocation(intx,inty)返回一個(gè)Point對(duì)象的引用,該對(duì)象實(shí)體中含有名字是x和y的成員變量,方法返回的Point對(duì)象x和y的值就是組件的左上角在容器的坐標(biāo)系中的x坐標(biāo)和y坐標(biāo)。◆82組件的大小與位置◆publicvoidsetBounds(intx,inty,intwidth,intheight)

設(shè)置組件在容器中的位置和組件的大小。該方法相當(dāng)于setSize()方法和setLocation()方法的組合。◆publicRectanglegetBounds()

返回一個(gè)Rectangle對(duì)象的引用,該對(duì)象實(shí)體中含有名字是x、y、width和height的成員變量,方法返回的Rectangle對(duì)象x和y的值就是當(dāng)前組件左上角在容器坐標(biāo)系中的x坐標(biāo)和y坐標(biāo),width和height的值就是當(dāng)前組件的寬度和高度。83組件的激活與可見(jiàn)性

◆publicvoidsetEnabled(booleanb)

設(shè)置組件是否可被激活。當(dāng)參數(shù)b取值true時(shí),組件可以被激活,當(dāng)參數(shù)b取值false時(shí),組件不可激活。默認(rèn)情況下,組件是可以被激活的。

◆publicvoidsetVisible(boolean)

設(shè)置組件在該容器中的可見(jiàn)性。當(dāng)參數(shù)b取值true時(shí),組件在容器中可見(jiàn),當(dāng)參數(shù)b取值false時(shí),組件在容器中不可見(jiàn)。除了Window組件外,其他類(lèi)型組件默認(rèn)是可見(jià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)指針停留在組件上時(shí),按下鼠標(biāo)?!羰髽?biāo)指針停留在組件上時(shí),釋放鼠標(biāo)。◆鼠標(biāo)指針停留在組件上時(shí),單擊鼠標(biāo)?!粼诮M件上拖動(dòng)鼠標(biāo)指針?!粼诮M件上運(yùn)動(dòng)鼠標(biāo)指針。鼠標(biāo)事件的類(lèi)型是MouseEvent,即組件觸發(fā)鼠標(biāo)事件時(shí),MouseEvent類(lèi)自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。85鼠標(biāo)事件_2.MouseListener接口Java分別使用MouseListener接口與MouseMotionListener接口兩個(gè)接口來(lái)處理鼠標(biāo)事件。如果事件源使用addMouseListener(MouseListenerlistener)獲取監(jiān)視器,那么用戶的下列5種操作可使得事件源觸發(fā)鼠標(biāo)事件:◆鼠標(biāo)指針從組件之外進(jìn)入?!羰髽?biāo)指針從組件內(nèi)退出?!羰髽?biāo)指針停留在組件上面時(shí),按下鼠標(biāo)。◆鼠標(biāo)指針停留在組件上面時(shí),釋放鼠標(biāo)?!羰髽?biāo)指針停留在組件上面時(shí),單擊或連續(xù)單擊鼠標(biāo)。86MouseListener接口創(chuàng)建監(jiān)視器的類(lèi)必須實(shí)現(xiàn)MouseListener接口,該接口有5個(gè)方法:◆mousePressed(MouseEvent)負(fù)責(zé)處理鼠標(biāo)按下觸發(fā)的鼠標(biāo)事件。◆mouseReleased(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)事件?!鬽ouseClicked(MouseEvente)負(fù)責(zé)處理鼠標(biāo)單擊或連擊觸發(fā)的鼠標(biāo)事件。.MouseMotionListener接口

Java分別使用MouseListener接口與MouseMotionListener接口兩個(gè)接口來(lái)處理鼠標(biāo)事件。如果事件源使用

addMouseMotionListener(MouseMotionListenerlistener)獲取監(jiān)視器,那么用戶的下列兩種操作可使得事件源觸發(fā)鼠標(biāo)事件:◆在組件上拖動(dòng)鼠標(biāo)指針?!粼诮M件上運(yùn)動(dòng)鼠標(biāo)指針。88MouseMotionListener接口創(chuàng)建監(jiān)視器的類(lèi)必須實(shí)現(xiàn)MouseMotionListener接口,該接口有兩個(gè)方法:◆mouseDragged(MouseEvente)負(fù)責(zé)處理鼠標(biāo)拖動(dòng)事件,即在事件源上拖動(dòng)鼠標(biāo)時(shí),監(jiān)視器將自動(dòng)調(diào)用接口中的這個(gè)方法對(duì)事件做出處理?!鬽ouseMoved(MouseEvente)負(fù)責(zé)處理鼠標(biāo)移動(dòng)事件,即在事件源上運(yùn)動(dòng)鼠標(biāo)時(shí),監(jiān)視器將自動(dòng)調(diào)用接口中的這個(gè)方法對(duì)事件做出處理。由于處理鼠標(biāo)事件的接口中的方法多于一個(gè),Java提供了相應(yīng)的適配器類(lèi),分別是MouseAdapter和MouseMotionAdapter,這兩個(gè)類(lèi)分別實(shí)現(xiàn)了MouseListener接口和MouseMotionListener接口。.MouseEvent類(lèi)在處理鼠標(biāo)事件時(shí),程序經(jīng)常關(guān)心鼠標(biāo)在當(dāng)前組件坐標(biāo)系中的位置,以及觸發(fā)鼠標(biāo)事件使用的是鼠標(biāo)的左鍵或右鍵等信息。MouseEvent類(lèi)中有下列幾個(gè)重要的方法:◆getX()返回觸發(fā)當(dāng)前鼠標(biāo)事件時(shí),鼠標(biāo)指針在事件源坐標(biāo)系中的x坐標(biāo)?!鬵etY()返回觸發(fā)當(dāng)前鼠標(biāo)事件時(shí),鼠標(biāo)指針在事件源坐標(biāo)系中的y坐標(biāo)?!鬵etModifiers()返回一個(gè)整數(shù)值,如果是通過(guò)鼠標(biāo)左鍵觸發(fā)的鼠標(biāo)事件,該方法返回的值等于InputEvent類(lèi)中的類(lèi)常量BUTTON1_MASK;如果是右鍵,返回的是InputEvent類(lèi)中的類(lèi)常量BUTTON3_MASK?!鬵etClickCount()返回鼠標(biāo)被連續(xù)單擊的次數(shù)?!鬵etSource()返回觸發(fā)當(dāng)前鼠標(biāo)事件的事件源。

90例10-22使用MouseListener接口處理鼠標(biāo)事件。在程序中,分別監(jiān)視按鈕、標(biāo)簽和窗體上的鼠標(biāo)事件,當(dāng)發(fā)生鼠標(biāo)事件時(shí),獲取鼠標(biāo)的坐標(biāo)值,效果如圖10.24所示。注意:事件源的坐標(biāo)系的左上角是原點(diǎn)。鼠標(biāo)事件_4.用鼠標(biāo)拖動(dòng)組件可以使用坐標(biāo)變換來(lái)實(shí)現(xiàn)組件的拖動(dòng)。當(dāng)我們用鼠標(biāo)拖動(dòng)容器中的組件時(shí),可以先獲取鼠標(biāo)指針在組件坐標(biāo)系中的坐標(biāo)x,y,以及組件的左上角在容器坐標(biāo)系中的坐標(biāo)a,b;如果在拖動(dòng)組件時(shí),想讓鼠標(biāo)指針的位置相對(duì)于拖動(dòng)的組件保持靜止,那么,組件左上角在容器坐標(biāo)系中的位置應(yīng)當(dāng)是a+x-x0,a+y-y0,其中x0,y0是最初在組件上按下鼠標(biāo)時(shí),鼠標(biāo)指針在組件坐標(biāo)系中的位置坐標(biāo)。

92例10-23中,窗體中添加了一個(gè)分層窗格,分層窗格中添加了一些組件。該例子使用MouseListener接口和MouseMotionListener接口處理鼠標(biāo)事件,可以用鼠標(biāo)拖動(dòng)分層窗格中的組件,效果如圖10.25所示。使用分層窗格是為了保證被拖動(dòng)的組件不會(huì)被其他組件遮擋。彈出式菜單單擊鼠標(biāo)右鍵出現(xiàn)彈出式菜單是用戶熟悉和常用的操作,這是通過(guò)處理鼠標(biāo)事件實(shí)現(xiàn)的。彈出式菜單由JPopupMenu類(lèi)負(fù)責(zé)創(chuàng)建,可以用下列構(gòu)造方法創(chuàng)建彈出式菜單:◆publicJPopupMenu()構(gòu)造無(wú)標(biāo)題彈出式菜單?!魀ublicJPopupMenu(Stringlabel)構(gòu)造由參數(shù)label指定標(biāo)題的彈出式菜單。彈出式菜單需要在某個(gè)組件的正前方彈出可見(jiàn),通過(guò)調(diào)用publicvoidshow(Componentinvoker,intx,inty)方法設(shè)置彈出式菜單在組件invoker上的彈出的位置,位置坐標(biāo)(x,y)按invoker的坐標(biāo)系。

94例10-24中,在文本區(qū)上單擊右鍵時(shí),在鼠標(biāo)位置處彈出菜單,用戶選擇相應(yīng)的菜單項(xiàng)可以將文本區(qū)中選中的內(nèi)容復(fù)制、剪切到系統(tǒng)的剪貼板中或?qū)⒓糍N板中的文本內(nèi)容粘貼到文本區(qū),效果如圖10.26所示。焦點(diǎn)事件組件可以觸發(fā)焦點(diǎn)事件。組件可以使用

publicvoidaddFocusListener(FocusListenerlistener)增加焦點(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)

當(dāng)組件從無(wú)輸入焦點(diǎn)變成有輸入焦點(diǎn)觸發(fā)FocusEvent事件時(shí),監(jiān)視器調(diào)用類(lèi)實(shí)現(xiàn)的接口方法focusGained(FocusEvente);當(dāng)組件從有輸入焦點(diǎn)變成無(wú)輸入焦點(diǎn)觸發(fā)FocusEvent事件時(shí),監(jiān)視器調(diào)用類(lèi)實(shí)現(xiàn)的接口方法focusLost(FocusEvente)。一個(gè)組件調(diào)用publicbooleanrequestFocusInWindow()方法可以獲得輸入焦點(diǎn)。

961.使用KeyListener接口處理鍵盤(pán)事件當(dāng)一個(gè)組件處于激活狀態(tài)時(shí),組件可以成為觸發(fā)KeyEvent事件的事件源。當(dāng)某個(gè)組件處于激活狀態(tài)時(shí),如果用戶敲擊鍵盤(pán)上一個(gè)鍵就導(dǎo)致這個(gè)組件觸發(fā)KeyEvent事件。組件使用addKeyListener()方法獲得監(jiān)視器。監(jiān)視器是一個(gè)對(duì)象,創(chuàng)建該對(duì)象的類(lèi)必須實(shí)現(xiàn)接口KeyListener。接口KeyListener中有3個(gè)方法:◆publicvoidkeyPressed(KeyEvente)◆publicvoidkeyTyped(KeyEvente)◆publicvoidKeyReleased(KeyEvente)。97當(dāng)按下鍵盤(pán)上某個(gè)鍵時(shí),監(jiān)視器就會(huì)發(fā)現(xiàn),然后方法keyPressed()會(huì)自動(dòng)執(zhí)行,并且KeyEvent類(lèi)自動(dòng)創(chuàng)建一個(gè)對(duì)象傳遞給方法keyPressed()中的參數(shù)e。方法keyTyped()是Pressedkey()和keyReleased()方法的組合。用KeyEvent類(lèi)的publicintgetKeyCode()方法可以判斷哪個(gè)鍵被按下、敲擊或釋

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論