第8章 圖形用戶界面編程_第1頁(yè)
第8章 圖形用戶界面編程_第2頁(yè)
第8章 圖形用戶界面編程_第3頁(yè)
第8章 圖形用戶界面編程_第4頁(yè)
第8章 圖形用戶界面編程_第5頁(yè)
已閱讀5頁(yè),還剩59頁(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)介

第8章概述本章主要內(nèi)容:

AWT和Swing簡(jiǎn)介;Swing程序設(shè)計(jì);簡(jiǎn)單的多媒體技術(shù);綜合示例;第8章概述

圖形用戶界面(GraphicUserInterface,簡(jiǎn)稱GUI)是一種當(dāng)今十分流行的人機(jī)交互方式,它通過(guò)為用戶呈現(xiàn)圖形界面,用戶看到什么就可以操作什么,取代了在字符方式下知道是什么后才能操作什么的方式。Java語(yǔ)言通過(guò)提供一系列類和接口,為用戶實(shí)現(xiàn)圖形用戶界面提供了方便,而不需要直接調(diào)用操作系統(tǒng)API。本章將重點(diǎn)介紹GUI編程和簡(jiǎn)單多媒體技術(shù)。8.1圖形用戶界面概述8.1.1AWT簡(jiǎn)介抽象窗口工具包AWT(AbstractWindowToolkit)是Java開(kāi)發(fā)工具包(JDK)的一部分,是Java基礎(chǔ)類(JavaFoundationClasses,JFC)的核心部分之一(從JDK1.0開(kāi)始),它的作用是給用戶提供基本的界面組件,如窗口、按鈕、菜單等。此外,還提供了事件處理結(jié)構(gòu),支持剪貼板、數(shù)據(jù)傳輸和圖像操作等。在Java1.0中,最初設(shè)計(jì)AWT的目標(biāo)是通過(guò)提供一個(gè)抽象的層次使GUI編程達(dá)到跨平臺(tái)的目的,使GUI程序能在所有平臺(tái)上正常顯示。遺憾的是,AWT并沒(méi)有很好的實(shí)現(xiàn)這一目標(biāo),但從Java1.1以后,AWT得到了很大的改進(jìn),而從Java1.2開(kāi)始,AWT添加了被稱為“Swing”的新GUI庫(kù)。8.1圖形用戶界面概述

AWT由java.awt包提供,早期版本的JDK主要包括BorderLayout,CardLayout,CheckBoxGroup,Color,Dimension,Event,Font,FlowLayout,FontMetrics,Graphics,GridBagConstraints,GridBagLayout,GridLayout,Image,Insets,Point,Polygon,Rectangle,Toolkit等類和兩個(gè)子包:MenuComponent與Component。然而,隨著Java語(yǔ)言的演變,AWT包也發(fā)生了較大變化,如JDK7.0中AWT包和子包結(jié)構(gòu)如圖所示:雖然AWT所包含的類和子包有所變化,但核心概念和類并無(wú)太大變化。其中,組件類Component和它的子類——容器類Container是兩個(gè)非常重要的類。組件類Component包含了按鈕類Button、畫(huà)布類Canvas、復(fù)選按鈕CheckBox、下拉列表類Choice、標(biāo)簽類Label、列表類List、滾動(dòng)條類Scrollbar、文本框類TextField與多行文本域類TextArea等,由它們創(chuàng)建的對(duì)象則稱為組件(即Component的子類或間接子類創(chuàng)建的對(duì)象),是構(gòu)成圖形界面的基本組成部分。容器類Container作為組建類的一個(gè)子類,實(shí)際上也是一個(gè)組件,具有組件的所有性質(zhì),但它是用來(lái)容納其他組件和容器的,主要包括面板類Panel、窗口類Window、結(jié)構(gòu)類Frame、對(duì)話框類Dialog等。由這些類創(chuàng)建的對(duì)象稱為容器,可通過(guò)組件類提供的publicAdd()方法將組件添加到容器中,即一個(gè)容器通過(guò)調(diào)用Add()方法將組件添加到該容器中。這樣,用戶可以操作在容器中呈現(xiàn)的各種組件,達(dá)到與系統(tǒng)交互的目的。8.1圖形用戶界面概述8.1圖形用戶界面概述事實(shí)上,圖形界面往往非常復(fù)雜,容器中可以放若干組件以及包含有若干組件的容器。Java語(yǔ)言通過(guò)布局管理器(LayoutManager)管理容器中各種組件。在創(chuàng)建容器時(shí),可以指定一種布局(即BorderLayout、CardLayout、GridBagLayout與GridLayout等中的一種),各組件按照布局確定放置位置,這樣,當(dāng)容器需要對(duì)某一組件進(jìn)行定位或判斷其大小時(shí),就可通過(guò)調(diào)用對(duì)應(yīng)的布局管理器來(lái)獲得。在編寫(xiě)GUI程序時(shí),安排組件位置和大小需要注意以下兩點(diǎn):各組件的大小和位置由容器中的布局管理器負(fù)責(zé),組件的setLocation()、setSize()和setBounds()等方法被布局管理器覆蓋,用戶無(wú)法設(shè)置這些屬性;如果用戶想自己控制組件的大小和位置,可取消容器的布局管理器,即調(diào)用語(yǔ)句“setLayout(null);”設(shè)置為空。8.1圖形用戶界面概述

【例8-1】理解AWT編程示例的源代碼。importjava.awt.*;publicclassEx8_1_UnderstandAWT{publicstaticvoidmain(String[]args){ //創(chuàng)建容器和設(shè)置布局 Framefrm=newFrame("理解AWT"); frm.setLayout(newBorderLayout()); //創(chuàng)建組件,并添加到容器中

ButtonmyBtn=newButton("按鈕"); frm.add(myBtn);

//設(shè)置結(jié)構(gòu)(Frame)的位置與大小并顯示 frm.setBounds(400,200,400,200); frm.setVisible(true); }}運(yùn)行結(jié)果:圖8-2例8-1運(yùn)行界面8.1圖形用戶界面概述8.1.2Swing簡(jiǎn)介Swing是一套由Java基礎(chǔ)類庫(kù)(JFC)提供的開(kāi)發(fā)圖形用戶界面的類庫(kù),是JFC的最主要部分,為Java基于窗體的應(yīng)用程序開(kāi)發(fā)設(shè)計(jì)提供了一套精美、豐富的基本組件,以及一個(gè)能使GUI獨(dú)立于特定平臺(tái)的顯示框架。Swing是在AWT基礎(chǔ)上擴(kuò)展而來(lái)的,提供了非常豐富的組件,遠(yuǎn)遠(yuǎn)多于AWT,并且引入了新的概念和性能,這使得基于Swing開(kāi)發(fā)GUI應(yīng)用程序比直接使用AWT開(kāi)發(fā)更為靈活、方便、效率高,而且能設(shè)計(jì)出更優(yōu)美的、感受更好的GUI。Swing是由javax.swing包提供的,主要包括兩種類型的組件:頂層容器和輕量級(jí)組件。它們都以“J”開(kāi)頭。其中,頂層容器主要包含Jframe,Japplet、Jdialog、Jwindow等;輕量級(jí)組件主要是繼承自AWT的Container類的Jcomponent類及其子類,主要包括JtextArea、JTextField、JButton、JMenu、JPanel、Jscrollbar等。JDK1.70的Swing包和子包結(jié)構(gòu)如下圖所示:8.1圖形用戶界面概述使用Swing編寫(xiě)GUI程序的基本流程和使用AWT編寫(xiě)類似,只是用的容器和組件為“J”類組件即可?!纠?-2】理解Swing編程示例的源代碼。importjavax.swing.*;importjava.awt.*;publicclassEx8_2_UnderstandSwing{publicstaticvoidmain(String[]args){ //創(chuàng)建容器和設(shè)置布局 JFramefrm=newJFrame("理解Swing"); frm.setLayout(newBorderLayout()); //創(chuàng)建組件,并添加到容器中 JButtonmyBtn=newJButton("按鈕"); frm.add(myBtn);

//設(shè)置結(jié)構(gòu)(JFrame)的位置與大小并顯示 frm.setBounds(400,200,400,200); frm.setVisible(true); }}運(yùn)行結(jié)果:圖8-4例8-2運(yùn)行界面8.1圖形用戶界面概述例8-1和例8-2使用了類似的組件和編寫(xiě)方法,但對(duì)比兩者的運(yùn)行界面,顯然使用Swing組件編寫(xiě)的GUI程序界面美觀許多,顯示速度更快,并且窗體帶有更多的功能。8.2Swing程序設(shè)計(jì)2023/1/318.2.1創(chuàng)建窗體使用Swing編寫(xiě)GUI程序時(shí),通常可以利用JFrame類來(lái)創(chuàng)建窗體。被創(chuàng)建的窗體通常包含標(biāo)題、最小化按鈕、最大化按鈕、關(guān)閉按鈕以及窗體容器部分等,如例8-2所示。JFrame類包含很多設(shè)置窗體的方法,例如可以用setTitle(Stringtitle)方法設(shè)置窗體標(biāo)題,用setBounds(intx,inty,intwidth,intheight)方法設(shè)置窗體顯示的位置及大?。ㄈ缋?-2中),其中,前兩個(gè)參數(shù)x和y用來(lái)設(shè)置窗體的顯示位置,依次是窗體左上角的點(diǎn)在顯示器中的水平和垂直坐標(biāo),而后兩個(gè)參數(shù)width和height用來(lái)設(shè)置窗體的大小,依次為窗體的寬度和高度。在默認(rèn)情況下使用JFrame類創(chuàng)建的窗體不可見(jiàn),因此,為了讓這樣的窗體顯示出來(lái)還必須調(diào)用setVisable(Booleanb)方法將其設(shè)置為可見(jiàn),讓其運(yùn)行時(shí)可顯示在顯示器上,可以認(rèn)為這時(shí)才開(kāi)始繪制窗體,之后再設(shè)置窗體的其他屬性將無(wú)效,即setVisable()方法應(yīng)是最后一個(gè)被調(diào)用的方法。此外,在創(chuàng)建窗體時(shí),除了設(shè)置窗體的標(biāo)題、大小和所在位置等外,通常需要設(shè)置關(guān)閉按鈕的動(dòng)作。關(guān)閉按鈕的默認(rèn)動(dòng)作為將窗體隱藏,可以通過(guò)setDefaultCloseOperation(intoperation)方法設(shè)置關(guān)閉按鈕的動(dòng)作。

8.2Swing程序設(shè)計(jì)2023/1/31JFrame類提供了四個(gè)靜態(tài)常量可供選擇,它們是:DO_NOTHING_ON_CLOSE:不執(zhí)行任何操作,常量值為0;HIDE_ON_CLOSE:隱藏窗口,為默認(rèn)設(shè)置,常量值為1;DISPOSE_ON_CLOSE:移出窗口,常量值為2;EXIT_ON_CLOSE:退出窗口,常量值為3。需要注意的是,與AWT組件不同,Swing組件不能直接添加到頂層容器中,它必須添加到一個(gè)與Swing頂層容器關(guān)聯(lián)的內(nèi)容面板(ContentPane)上。內(nèi)容面板是頂層容器包含的一個(gè)普通容器,它也是一個(gè)輕量級(jí)組件。把Swing組件放入一個(gè)頂層Swing容器的面板上,這樣可避免使用非Swing的重量級(jí)組件。。8.2Swing程序設(shè)計(jì)2023/1/31向JFrame添加組件有兩種方式:用getContentPane()方法獲得內(nèi)容面板,而后向其中添加組件,即getContentPane().

add(yComponent);創(chuàng)建一個(gè)中間容器并將組件添加其中,而后用setContentPane()方法把該容器設(shè)置為JFrame的內(nèi)容面板,如先創(chuàng)建一個(gè)JPanel對(duì)象并添加一些組件,而后將其設(shè)置為JFrame對(duì)象的內(nèi)容面板。8.2Swing程序設(shè)計(jì)2023/1/318.2.2常用面板常用的面板有JPanel、JScrollPane和JSplitPane等,它們均放在javax.swing包中。事實(shí)上,引入各類面板可以解決將所有組件都添加到由JFrame窗體提供的默認(rèn)組件容器中帶來(lái)的一些問(wèn)題:如果不添加面板,界面將無(wú)法分區(qū)或分塊,所有組件只能采用一種布局方式,這很難設(shè)計(jì)出美觀的界面。有些布局方式只能管理有限個(gè)組件,這將妨礙設(shè)計(jì)者自由表達(dá)設(shè)計(jì)思想。例如,JFrame窗體默認(rèn)的布局管理器是BorderLayout,它最多只能管理5個(gè)組件,初學(xué)者切忌不要以為任何容器都能無(wú)限地加入各種各樣的組件,尤其是早期版本的JDK限制更多。窗體的可顯區(qū)域有限,組件很多時(shí)很難合理安排,引入JScrollPane或JSplitPane將能更好地表達(dá)界面元素。使用JPanel面板能很好地解決前兩個(gè)問(wèn)題。首先在JFrame窗體中添加幾個(gè)面板或主要的組件,而后可繼續(xù)在已添加的面板中添加多個(gè)子面板或組件,繼續(xù)這樣的方式,則可實(shí)現(xiàn)窗體上放置無(wú)數(shù)個(gè)組件,并且通過(guò)為每個(gè)面板設(shè)置不同的布局管理器的方式解決多組件的布局問(wèn)題,達(dá)到美化界面的目的。JPanel面板默認(rèn)采用FlowLayout布局管理器。8.2Swing程序設(shè)計(jì)2023/1/31下面先舉例介紹JPanel的使用,并順便介紹JFrame相關(guān)的其它方法?!纠?-3】使用JPanel編程示例的源代碼。運(yùn)行結(jié)果為:上例為一個(gè)簡(jiǎn)單的搜索輸入輸出界面,共定義了2個(gè)面板和3個(gè)組件。其中,兩個(gè)面板按照J(rèn)Frame默認(rèn)的布局管理器(BorderLayout)設(shè)置位置為上方(NORTH)和中心(CENTER),而在上方面板中添加了一個(gè)文本框和按鈕,而中心面板添加了一個(gè)文本輸出區(qū)。圖8-5例8-3運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/31JScrollPane類實(shí)現(xiàn)了一個(gè)帶有滾動(dòng)條的面板,可以用于為某些組件添加滾動(dòng)條,例如為JTextArea和JList等組件添加滾動(dòng)條。為了使用好該類,必須了解如何使用JScrollPane類的常用方法和如何設(shè)置滾動(dòng)條顯示策略。JScrollPane提供了如下4個(gè)常用的方法:.setViewportView(Componentview):設(shè)置在滾動(dòng)面板中顯示的組件對(duì)象;.setHorizontalScrollBarPolicy(intpolicy):設(shè)置水平滾動(dòng)條的顯示策略;.setVerticalScrollBarPolicy(intpolicy):設(shè)置垂直滾動(dòng)條的顯示策略;.setWheelScrollingEnabled(booleanarg0):設(shè)置滾動(dòng)面板的滾動(dòng)條是否支持鼠標(biāo)的滾動(dòng)輪。8.2Swing程序設(shè)計(jì)2023/1/31利用上述第二個(gè)和第三個(gè)方法設(shè)置滾動(dòng)條顯示策略時(shí),參數(shù)應(yīng)選JScrollPane類提供的六個(gè)靜態(tài)常量之一,它們是:HORIZONTAL_SCROLLBAR_AS_NEEDED:設(shè)置水平滾動(dòng)條為只在需要時(shí)顯示,為默認(rèn)策略;HORIZONTAL_SCROLLBAR_NEVER:設(shè)置水平滾動(dòng)條為永遠(yuǎn)不顯示;HORIZONTAL_SCROLLBAR_ALWAYS:設(shè)置水平滾動(dòng)條為總是顯示;VERTICAL_SCROLLBAR_AS_NEEDED:設(shè)置垂直滾動(dòng)條為只在需要時(shí)顯示,為默認(rèn)策略;VERTICAL_SCROLLBAR_NEVER:設(shè)置垂直滾動(dòng)條為永遠(yuǎn)不顯示;VERTICAL_SCROLLBAR_ALWAYS:設(shè)置垂直滾動(dòng)條為總是顯示。其中,三個(gè)常量用于設(shè)置水平滾動(dòng)條,而后三個(gè)用于設(shè)置垂直滾動(dòng)條?!纠?-4】使用JScrollPane編程示例的源代碼。運(yùn)行結(jié)果:圖8-6例8-4運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/31當(dāng)在上例顯示區(qū)輸入多行文字后,垂直滾動(dòng)條將自動(dòng)出現(xiàn),即需要時(shí)顯示。JScrollPane作為常用的面板,事實(shí)上一些常用組件已經(jīng)默認(rèn)實(shí)現(xiàn)了滾動(dòng)條的功能。例如,本例中并未設(shè)置水平滾動(dòng)條,但當(dāng)輸入較長(zhǎng)的一行文本時(shí)水平滾動(dòng)條將會(huì)出現(xiàn),這是因?yàn)镴TextArea組件已經(jīng)默認(rèn)支持了滾動(dòng)條按需出現(xiàn)。JSplitPane類實(shí)現(xiàn)了可以水平或垂直分割的面板,允許將容器分成兩個(gè)區(qū)域,分別添加組件。該類提供了如下4個(gè)常用的方法:.setOrientation(intorientation):設(shè)置面板分割方式,水平或垂直,可選參數(shù)為JSplitPane類提供的2個(gè)靜態(tài)常量:HORIZONTAL_SPLIT和VERTICAL_SPLIT;.setLeftComponent(Componentcomp):為面板左側(cè)(或上方)添加組件;.setRightComponent(Componentcomp):為面板右側(cè)(或下方)添加組件;.setDividerLocation(doubleproportionalLocation):設(shè)置分割比例的方法,即左右或上下區(qū)域所占比例,還提供一個(gè)重載方法,即setDividerLocation(intlocation),只是參數(shù)只是一個(gè)整數(shù)。8.2Swing程序設(shè)計(jì)2023/1/31【例8-5】使用JSplitPane編程示例的源代碼。運(yùn)行結(jié)果:圖8-7例8-5運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/318.2.3常用組件組件作為圖形用戶界面的基本元素,是用戶和軟件系統(tǒng)進(jìn)行交流的橋梁。Swing組件都是AWT的Container類的直接子類和間接子類,組件名均以“J”開(kāi)頭,除了有與AWT類似的按鈕(JButton)、標(biāo)簽(JLabel)、復(fù)選框(JCheckBox)、菜單(JMenu)等基本組件外,還有一些高層組件,如表格(JTable)、樹(shù)(JTree)等等。Swing組件從功能上可區(qū)分為如下六類:頂層容器:JFrame、JApplet、JDialog、JWindow;中間容器:JPanel、JScrollPane、JSplitPane、JToolBar;特殊容器:在GUI上起特殊作用的中間層,如JInternalFrame、JLayeredPane、JRootPane;基本組件:實(shí)現(xiàn)人機(jī)交互的組件,如JButton、JTextFiled、JComboBox、JList、JMenu、JSlider等;不可編輯信息的顯示組件:向用戶顯示不可編輯信息的組件,如JLabel、JToolTip、JProgressBar等;可編輯信息的顯示組件:向用戶顯示能被編輯的格式化信息的組件,如JTable、JTextArea、JColorChooser、JFileChoose、JfileChooser等。8.2Swing程序設(shè)計(jì)2023/1/311.標(biāo)簽(JLabel):JLabel組件是用來(lái)顯示文本和圖像的,既可顯示其中之一,亦可同時(shí)顯示,主要是用于輸出一些不修改的信息和配合其它組件而輸出說(shuō)明信息的。JLabel類提供了一系列用來(lái)設(shè)置標(biāo)簽的方法,最常用的方法包括:setText(Stringtext):設(shè)置標(biāo)簽待顯示的文本;setFont(Fontfont):設(shè)置標(biāo)簽文本的字體及大??;setHorizontalAlignment(intalignment):設(shè)置文本對(duì)齊方式(即顯示位置),傳入?yún)?shù)為JLabel類提供的三個(gè)靜態(tài)常量之一,即可選LEFT(靠左側(cè)顯示)、CENTER(居中顯示)或RIGHT(靠右側(cè)顯示);setIcon(Iconicon):如果標(biāo)簽中需要顯示圖片,則可通過(guò)該方法設(shè)置;setHorizontalTextPosition(inttextPosition):設(shè)置文字相對(duì)圖片在水平方向的位置,傳入?yún)?shù)亦為JLabel類提供的三個(gè)靜態(tài)常量之一,即可選LEFT(文字顯示在圖片的左側(cè))、CENTER(文字與圖片在水平方向重疊顯示)或RIGHT(文字顯示在圖片的右側(cè));setVerticalTextPosition(inttextPosition):設(shè)置文字相對(duì)圖片在垂直方向的位置,傳入?yún)?shù)為JLabel類提供的另外三個(gè)靜態(tài)常量之一,即可選TOP(文字顯示在圖片的上方)、CENTER(文字與圖片在垂直方向重疊顯示)或RIGHT(文字顯示在圖片的下方)。8.2Swing程序設(shè)計(jì)2023/1/312.按鈕(JButton):JButton組件是最簡(jiǎn)單的按鈕組件,只有按下和釋放兩種狀態(tài),是通過(guò)捕獲按下并釋放的動(dòng)作來(lái)執(zhí)行一些操作的。JButtion類主要提供如下方法用于設(shè)置按鈕的屬性:setText(Stringtext):設(shè)置按鈕的標(biāo)簽文本(指按鈕上的文字);setIcon(IcondefaultIcon):設(shè)置按鈕在默認(rèn)狀態(tài)下顯示的圖片;setRolloverIcon(IconrolloverIcon):設(shè)置當(dāng)光標(biāo)移動(dòng)到按鈕上方時(shí)顯示的圖片;setPressedIcon(IconpressedIcon):設(shè)置當(dāng)按鈕被按下時(shí)顯示的圖片;setMargin(Insetsm):當(dāng)按鈕設(shè)置為顯示圖片時(shí),設(shè)置按鈕邊框和標(biāo)簽四周的間隔,建議均設(shè)置為0,傳入?yún)?shù)為Insets類實(shí)例,該類構(gòu)造方法為Insets(inttop,intleft,intbottom,intright),四個(gè)參數(shù)均為整數(shù),依次為標(biāo)簽上方、左側(cè)、下方和右側(cè)的間距;setContentAreaFilled(booleanb):當(dāng)按鈕設(shè)置為顯示圖片時(shí),設(shè)置繪制按鈕的內(nèi)容區(qū)域與否,即設(shè)置按鈕的背景為透明與否,默認(rèn)為繪制(透明);setBorderPainted(booleanb):設(shè)置繪制按鈕的邊框與否,默認(rèn)為繪制。8.2Swing程序設(shè)計(jì)2023/1/313.文本框(JTextField):JTextField組件實(shí)現(xiàn)了一個(gè)文本框,與VB、Delphi等可視化編程語(yǔ)言中的文本編輯框類似,只是用于接受用戶輸入的單行文本信息??捎肑TextField(Stringtext)構(gòu)造方法創(chuàng)建帶有默認(rèn)文本的文本框?qū)ο?,亦可在?chuàng)建后用setText(Stringt)方法設(shè)置文本信息。該類提供了如下常用方法:setText(Stringt):設(shè)置文本框中的文本信息;setHorizontalAlignment(intalignment):設(shè)置文本框內(nèi)容的水平對(duì)齊方式,傳入?yún)?shù)為JTextField類提供的三個(gè)靜態(tài)常量之一,即LEFT(靠左側(cè)顯示)、CENTER(居中顯示)和RIGHT(靠右側(cè)顯示);setFont(Fontf):設(shè)置文本框中文字的字體;setColumns(intcolumns):設(shè)置文本框最多可顯示內(nèi)容的列數(shù)(即字符數(shù));setScrollOffset(intscrollOffset):設(shè)置文本框的滾動(dòng)偏移量(以像素為單位);scrollRectToVisible(Rectangler):向左或右滾動(dòng)文本框中的內(nèi)容;getPreferredSize():獲得文本框的首選大小,返回值為Dimensions類型的對(duì)象。8.2Swing程序設(shè)計(jì)2023/1/314.密碼框(JPasswordField):JPasswordField組件實(shí)現(xiàn)了一個(gè)密碼框,專門用于需要密碼輸入的場(chǎng)合,與JTextField組件類似,也是接受單行文本信息,只是不回顯輸入的真實(shí)信息,但會(huì)用指定的回顯字符作為占位符。主要有如下幾個(gè)常用的方法:setEchoChar(charc):指定回顯字符,若不調(diào)用該方法,默認(rèn)的回顯字符為“*”;getEcho():獲得回顯字符,返回類型為char型;echoCharIsSet():查看是否已經(jīng)設(shè)置了回顯字符,若設(shè)置,返回true,否則為false;getPassword():獲得用戶輸入的文本信息,返回值為char型數(shù)組。8.2Swing程序設(shè)計(jì)2023/1/315.文本域(JTextArea):JTextArea組件實(shí)現(xiàn)了一個(gè)文本域,用于需要多行文本輸入和顯示的場(chǎng)合。該組件是前述JTextField組件的擴(kuò)展,只是支持多行文本和提供了相關(guān)方法。常用的方法如下:append(Stringstr):將指定文本追加到文檔末尾;insert(Stringstr,intpos):將指定文本插入到指定位置;replaceRange(Stringstr,intstart,intend):用給定的新文本替換掉指定的文本段,即替換掉從起始位置(start)到結(jié)束位置(end)部分的文本;getColumnWidth():獲取列的寬度;getColumns():返回文本域中的列數(shù);getLineCount():確定文本區(qū)所包含的行數(shù);getRows():返回文本域中的行數(shù);setLineWrap(Booleanwrap):設(shè)置文本是否自動(dòng)換行,默認(rèn)為false,即不自動(dòng)換行,這時(shí)允許一行文本很長(zhǎng);此外,還有例8-3和例8-4使用過(guò)的setColumns()、setRows()和setEditable()等方法。8.2Swing程序設(shè)計(jì)2023/1/316.單選按鈕(JRadioButton):JRadioButton組件實(shí)現(xiàn)一個(gè)單選按鈕,只有選中和未選兩種狀態(tài),常用于選定多個(gè)選項(xiàng)之一的場(chǎng)合。JRadioButton類可以單獨(dú)使用,也可以與ButtonGroup類聯(lián)合使用。單獨(dú)使用時(shí),只有選定和取消選定兩種狀態(tài),而當(dāng)與ButtonGroup類聯(lián)合使用時(shí),則將多個(gè)單選按鈕組成一個(gè)按鈕組,用戶只能選定該組中的一個(gè)單選按鈕,而取消選定操作將由ButtonGroup類自動(dòng)完成。JRadioButton類主要提供如下方法用于設(shè)置單選按鈕的屬性:setText(Stringtext):設(shè)置單選按鈕的標(biāo)簽文本;setSelected(Booleanb):設(shè)置單選按鈕的狀態(tài),默認(rèn)為未被選中,即為false。配合JRadioButton類使用的ButtonGroup類是用于管理一組單選按鈕,負(fù)責(zé)維護(hù)該組各按鈕的“開(kāi)啟”狀態(tài)(即選中),確保組中只有一個(gè)按鈕處于“開(kāi)啟”狀態(tài)。該類還可以用于維護(hù)JRadioButtonMenuItem和JToggleButton等對(duì)象組成的按鈕組,主要提供如下常用方法:add(AbstractButtonb):添加按鈕到按鈕組中;remove(AbstractButtonb):從按鈕組中移除按鈕;getButtonCount():返回按鈕組中包含按鈕的個(gè)數(shù),返回值為整型;getElements():返回一個(gè)Enumertion類型的對(duì)象,用于遍歷按鈕中的所有按鈕對(duì)象。8.2Swing程序設(shè)計(jì)2023/1/317.復(fù)選框(JCheckBox):JCheckBox組件實(shí)現(xiàn)一個(gè)復(fù)選框,同樣只有選中和未選兩種狀態(tài),主要用于多選的場(chǎng)合,即可同時(shí)選定多個(gè)。與JRadioButton類使用方法類似,同樣提供了setText(Stringtext)和setSelected(Booleanb)等常用方法,但不同的是無(wú)需與ButtonGroup類聯(lián)合使用。8.列表框(JList):JList組件實(shí)現(xiàn)一個(gè)列表框,主要用于供用戶從下拉列表中選擇某一項(xiàng)或多項(xiàng)的場(chǎng)合。在創(chuàng)建時(shí)可用構(gòu)造方法JList(Object[]list)直接初始化列表包含的選項(xiàng)。該類有三種選取列表框中選項(xiàng)的模式,可由setSelectedMode(intselectionMode)方法設(shè)置,傳入?yún)?shù)為該類提供的三個(gè)靜態(tài)常量之一,即可選SINGLE_INTERVAL_SELECTION(只允許連續(xù)選取多項(xiàng))、SINGLE_SELECTION(只允許選取某一項(xiàng))和MULTIPLE_INTERVAL_SELECTION(既允許連續(xù)選取,又允許間隔選取,即任意選)。8.2Swing程序設(shè)計(jì)2023/1/31JList類提供了如下常用的方法:setSelectedIndex(intindex)/setSelectedIndex(int[]indices):選中指定索引的一個(gè)選項(xiàng)/一組選項(xiàng);setSelectedBackground(ColorselectBackground):設(shè)置被選項(xiàng)的背景顏色;setSelectedForeground(ColorselectForeground):設(shè)置被選項(xiàng)的字體顏色;getSelectedIndices():以int[]形式獲得被選中的所有選項(xiàng)的索引值;getSelectedValues():以O(shè)bject[]形式獲得被選中的所有選項(xiàng)的內(nèi)容;clearSelection():取消所有被選中的項(xiàng);isSelectionEmpty():查看是否有被選中的項(xiàng),如果有則返回true;isSelectionIndex(intindex):判斷指定索引值的項(xiàng)是否已被選中;ensureIndexIsVisble(intindex):使指定項(xiàng)在選擇窗口中可見(jiàn);setFixedCellHeight(intheight):設(shè)置選擇窗口中每個(gè)選項(xiàng)的高度;setVisibleRowCount(intvisibleRowCount):設(shè)置在選擇窗口中最多可見(jiàn)選項(xiàng)數(shù);getPreferredScrollableViewportSize():獲取使指定個(gè)數(shù)的選項(xiàng)可見(jiàn)時(shí)需要的窗口高度;setSelectedMode(intselectionMode):設(shè)置列表框選擇模式:?jiǎn)芜x、連選和任選。8.2Swing程序設(shè)計(jì)2023/1/319.選擇框(JComboBox):JComboBox組件實(shí)現(xiàn)了一個(gè)選擇框,供用戶從下拉列表中選擇某一選項(xiàng),同時(shí)可設(shè)置為編輯狀態(tài),在文本框中輸入的值可添加到下拉列表中,可理解為是一個(gè)文本框和一個(gè)列表框的組合。在創(chuàng)建JComboBox類的對(duì)象時(shí),可利用構(gòu)造方法JComboBox(Object[]items)直接初始化選擇框包含的選項(xiàng),當(dāng)然可以用如下兩類方式:用setModel(ComboBoxModelaModel)方法初始化;用addItem(Objectitem)和insertItemAt(Objectitem,intindex)等添加或插入選項(xiàng)。8.2Swing程序設(shè)計(jì)2023/1/31其中,第一類是Java語(yǔ)言常用的為表格類組件(如JTable、JTree等)傳入初始數(shù)據(jù)的一種模式,即先定義一個(gè)xModel類對(duì)象,而后將數(shù)據(jù)添加到該對(duì)象中,再用表格類組件對(duì)象的setModel()方法傳入該數(shù)據(jù)模型,這是一種符合MVC的編程模式。為了使用好JComboBox類,需要熟悉如下常用方法:addItem(Objectitem):向選項(xiàng)列表尾部添加選項(xiàng);insertItemAt(Objectitem,intindex):向選項(xiàng)列表指定位置添加選項(xiàng),索引值從0開(kāi)始計(jì)數(shù);removeItem(Objectitem)/removeItem(intindex):從選項(xiàng)列表中移除指定的選項(xiàng)分別為按選項(xiàng)對(duì)象名移除和按索引值移除;removeAllItems():移除選項(xiàng)列表中所有選項(xiàng);setSelectedItem(Objectitem)/setSelectedItem(intindex):將指定的選項(xiàng)設(shè)置為選擇框的默認(rèn)選項(xiàng),分別為按選項(xiàng)對(duì)象名選和按索引值選;setMaximumRoxCount(intcount):設(shè)置選項(xiàng)最大的顯示行數(shù),默認(rèn)為8行;setEditable(BooleanisEdit):設(shè)置選擇框可否編輯,默認(rèn)為不可編輯,即false。除上述常見(jiàn)組件外,比較常用的還有菜單類組件(JMenuBar、JMenu和JMenuItem)和對(duì)話框類組件(JDialog、JFileDialog),使用方法類似,8.2Swing程序設(shè)計(jì)2023/1/31【例8-6】常用組件編程示例的源代碼。運(yùn)行結(jié)果:

圖8-8例8-6運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/318.2.4常用布局管理器Java語(yǔ)言的布局管理器是一個(gè)實(shí)現(xiàn)了LayoutManager接口的任何類的實(shí)例,由容器類對(duì)象的setLayout(LayoutManagerlayoutObj)方法設(shè)定,如果沒(méi)調(diào)用該方法,那么容器將使用默認(rèn)的布局管理器。當(dāng)容器調(diào)整大小(或第一次形成)時(shí),布局管理器將重新布局容器中的組件。常見(jiàn)的布局管理器有邊界布局(BorderLayout)、順序布局(FlowLayout)、網(wǎng)格布局(GridLayout)和卡片布局(CardLayout)等,它們都在java.awt這個(gè)包下。此外,Java語(yǔ)言還提供了空布局管理的支持(指不用布局管理器),這將犧牲跨平臺(tái)特性。8.2Swing程序設(shè)計(jì)2023/1/311.不使用布局管理器在計(jì)算機(jī)界未提出布局管理這一概念之前,所有的應(yīng)用程序都使用直接定位的方式排列容器中的組件,如VB、Delphi等可視化開(kāi)發(fā)語(yǔ)言中都采用這種方式。Java語(yǔ)言同樣支持這種方式,即使用起始點(diǎn)坐標(biāo)和寬與高來(lái)確定組件在窗體等容器中的位置,這樣將不能保證在其他操作平臺(tái)中能正常顯示。對(duì)于只在某一平臺(tái)運(yùn)行的程序來(lái)說(shuō),可以考慮采用這種布局管理方式。將null傳給組件容器的setLayout(LayoutManagermgr)方法,即setLayout(null)將使該組件不使用布局管理器,對(duì)于任何放入該容器的組件,可用setBounds(Rectanglearg0)或setBounds(intarg0,intarg1,intarg2,intarg3)來(lái)指定組件在容器中的位置,前兩個(gè)參數(shù)指定起始點(diǎn)坐標(biāo),后兩個(gè)參數(shù)分別為組件的寬和高,具體使用方法如例8-6所示。2.邊界布局(BorderLayout)BorderLayout類實(shí)現(xiàn)的布局管理器稱為邊界布局管理器,這種布局將容器劃分為5個(gè)部分,是JFrame類創(chuàng)建的默認(rèn)布局管理器。邊界布局管理器將窗體的顯示區(qū)域分為容器頂部(NORTH)、容器底部(SOUTH)、容器左側(cè)(WEST)、容器右側(cè)(EAST)和容器中心(CENTER),如圖8-9所示。而B(niǎo)orderLayout類提供了5個(gè)靜態(tài)常量用于設(shè)置組件顯示位置,在添加組件時(shí)指定顯示方位,即用容器的setLayout()方法。8.2Swing程序設(shè)計(jì)2023/1/31【例8-7】使用邊界布局管理器編程示例的源代碼。運(yùn)行結(jié)果:此外,BorderLayout類還提供如下2個(gè)常用方法:.setHgap(inthgap):設(shè)置各區(qū)之間水平間隔(以像素點(diǎn)為單位);.setVgap(intvgap):設(shè)置各區(qū)之間垂直間隔(以像素點(diǎn)為單位)。圖8-9例8-7運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/313.順序布局(FlowLayout)流布局管理器是由FlowLayout類實(shí)現(xiàn)的,它的布局策略是在一行上排列組件,而當(dāng)該行沒(méi)足夠的空間時(shí)則回行顯示,容器大小改變時(shí),組件將自動(dòng)重排,即原來(lái)在一行上的組件可能重新被調(diào)整到多行上,或者原來(lái)在不同行上組件會(huì)合并到一行上。該類默認(rèn)是居中顯示組件的,但可通過(guò)setAlignment(intalign)方法設(shè)置組件的對(duì)齊方式,傳入?yún)?shù)為FlowLayout提供的三個(gè)靜態(tài)常量之一,即可選LEFT(靠左側(cè)顯示)、CENTER(居中顯示,默認(rèn)值)和RIGHT(靠右側(cè)顯示)。該類同樣提供了setHgap(inthgap)和setVgap(intvgap)方法設(shè)置組件的水平間距和垂直間距。【例8-8】使用流布局管理器編程示例的源代碼。運(yùn)行結(jié)果:圖8-10展示了流布局管理器的特點(diǎn),左側(cè)界面是例8-8正常運(yùn)行顯示的界面,右側(cè)的則是從水平方向變窄界面時(shí),布局管理器自動(dòng)重新布局組件后的界面。圖8-10例8-8運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/314.網(wǎng)格布局(GridLayout)網(wǎng)格布局管理器是由GridLayout類實(shí)現(xiàn)的,它的布局策略是將容器按照用戶的設(shè)置平均劃分成若干個(gè)網(wǎng)格。該類提供的構(gòu)造方法GridLayout(introws,intclos)創(chuàng)建布局管理器對(duì)象時(shí)可指定網(wǎng)格的行數(shù)和列數(shù),其中,參數(shù)rows用來(lái)設(shè)置網(wǎng)格的行數(shù),參數(shù)cols用來(lái)設(shè)置網(wǎng)格的列數(shù),但也允許只設(shè)置行數(shù)或列數(shù),甚至不設(shè)置,另外添加到容器中的組件有可能多于網(wǎng)格個(gè)數(shù),為此有如下四種布局組件的情況:只設(shè)置了網(wǎng)格的行數(shù)(即rows>0,cols=0):容器將先按行排列組件,當(dāng)組件個(gè)數(shù)多于rows時(shí)將自動(dòng)增加一列,依次類推;只設(shè)置了網(wǎng)格的列數(shù)(即rows=0,cols)0):容器將先按列排列組件,當(dāng)組件個(gè)數(shù)多于cols時(shí)將自動(dòng)增加一行,依次類推;同時(shí)設(shè)置了網(wǎng)格的行數(shù)和列數(shù)(即rows>0,cols>0):容器將先按行排列組件,當(dāng)組件個(gè)數(shù)多于rows時(shí)將自動(dòng)增加一列,依次類推;同時(shí)設(shè)置了網(wǎng)格的行數(shù)和列數(shù)(即rows>0,cols>0),當(dāng)容器中組件個(gè)數(shù)大于網(wǎng)格數(shù):容器將自動(dòng)增加一列,依次類推,直到能容納下所有組件。該類同樣提供了setHgap(inthgap)和setVgap(intvgap)方法用于設(shè)置組件的水平間距和垂直間距。【例8-9】使用網(wǎng)格布局管理器編程示例的源代碼。8.2Swing程序設(shè)計(jì)2023/1/31運(yùn)行結(jié)果如下:圖8-11例8-9運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/318.2.5常用事件處理組件的動(dòng)作是靠事件驅(qū)動(dòng)的,事件對(duì)于GUI編程來(lái)說(shuō)是必不可少的,只有這樣才能實(shí)現(xiàn)用戶與系統(tǒng)的交互,即系統(tǒng)需要通過(guò)事件響應(yīng)用戶的操作。常用的事件有動(dòng)作事件、焦點(diǎn)事件、鼠標(biāo)事件和鍵盤事件。在事件處理過(guò)程中,主要涉及三類對(duì)象:事件、事件源和事件處理者。其中,對(duì)于GUI編程來(lái)說(shuō),事件是用戶對(duì)界面的操作,常實(shí)現(xiàn)為特定事件的類,如鍵盤操作對(duì)應(yīng)的事件類為KeyEvent;事件源是事件發(fā)生的場(chǎng)所,通常是各個(gè)組件,如按鈕等;事件處理者則是接收事件對(duì)象并對(duì)其進(jìn)行處理的對(duì)象,有時(shí)也稱為監(jiān)聽(tīng)器。事件相關(guān)的類被組織在java.awt.event下,Swing的事件處理機(jī)制與AWT的完全一樣,均使用該包下的相關(guān)類。該包主要包含三種類或接口:以Event結(jié)尾的類,它們都屬于事件類,如ActionEvent、WindowEvent、MouseEvent和KeyEvent等等;以Listener結(jié)尾的接口,是一些與特定事件相關(guān)的監(jiān)聽(tīng)器接口,每個(gè)接口都定義了需要特定監(jiān)聽(tīng)器實(shí)現(xiàn)的方法,這些接口決定了Listener對(duì)事件源做何種反應(yīng),是事件處理者的具體實(shí)現(xiàn),如ActionListener、WindowListener、MouseListener和KeyListener等等;8.2Swing程序設(shè)計(jì)2023/1/31以Adapter結(jié)尾的類(即適配器類),它們是已經(jīng)實(shí)現(xiàn)了所有方法的特殊接口,這是為了方便用戶使用,其實(shí)是對(duì)使用Listener接口的簡(jiǎn)化,即是一種簡(jiǎn)單的實(shí)現(xiàn)監(jiān)聽(tīng)器的手段,可以縮短程序代碼,只重寫(xiě)需要的方法即可,但因?yàn)镴ava語(yǔ)言提供的是單一繼承機(jī)制,當(dāng)需要多種監(jiān)聽(tīng)器或此類已有父類時(shí),就無(wú)法采用適配器了,如WindowAdapter、MouseAdapter和KeyAdapter等等(無(wú)ActionAdapter)。

事實(shí)上,Java語(yǔ)言是采取授權(quán)模型(DelegationModel)處理事件的。由于同一事件源上可能發(fā)生多種事件,事件源可以把其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來(lái)處理,監(jiān)聽(tīng)器時(shí)刻監(jiān)聽(tīng)事件源上所發(fā)生的事件類型,一旦該事件類型與自己所負(fù)責(zé)處理的事件類型一致,就可馬上進(jìn)行處理。這樣做,實(shí)際上是把事件的處理委托給外部的處理實(shí)體進(jìn)行處理,這實(shí)現(xiàn)了事件源和監(jiān)聽(tīng)器的分離。事件處理者(監(jiān)聽(tīng)器)通常是一個(gè)類(如實(shí)現(xiàn)了ActionListener接口的類),該類將能夠處理某種類型的事件,必須實(shí)現(xiàn)與該事件類型相對(duì)的接口(如ActionListener接口),事件將通過(guò)該接口中的方法傳入,該方法則為實(shí)現(xiàn)接口時(shí)必須實(shí)現(xiàn)的方法(如voidactionPerformed(ActionEvente)方法)。例如,對(duì)于實(shí)現(xiàn)點(diǎn)擊按鈕的動(dòng)作事件(即ActionEvent),將實(shí)現(xiàn)與動(dòng)作事件相關(guān)的Listener接口(即ActionListener接口)?!纠?-10】處理點(diǎn)擊按鈕事件編程示例的源代碼。8.2Swing程序設(shè)計(jì)2023/1/31importjava.awt.BorderLayout;importjava.awt.event.*;importjavax.swing.*;publicclassEx8_10_UseButtonEvent{publicstaticvoidmain(String[]args){ JFramefrm=newJFrame("理解事件"); frm.setLayout(newBorderLayout()); //創(chuàng)建按鈕對(duì)象和注冊(cè)監(jiān)聽(tīng)器進(jìn)行授權(quán),參數(shù)為事件處理者對(duì)象 JButtonbtn=newJButton("請(qǐng)單擊本按鈕"); frm.getContentPane().add(btn); ButtonHandlerbtnHandler=newButtonHandler(); btn.addActionListener(btnHandler);//與點(diǎn)擊事件相關(guān)的授權(quán)處理的方法 frm.setBounds(400,200,400,200); frm.setVisible(true);}}//實(shí)現(xiàn)點(diǎn)擊事件監(jiān)聽(tīng)器接口,成為點(diǎn)擊事件ActionEvent的處理者classButtonHandlerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ System.out.println("發(fā)生了單擊時(shí)間"); }}8.2Swing程序設(shè)計(jì)2023/1/31運(yùn)行結(jié)果如下:在上例界面上點(diǎn)擊按鈕,將會(huì)在控制臺(tái)輸出提示信息,下面是點(diǎn)擊2次時(shí)的結(jié)果。發(fā)生了單擊時(shí)間發(fā)生了單擊時(shí)間該例介紹了使用事件的一般流程,可以總結(jié)為如下三步:定義某組件對(duì)象,并考慮將為該組件對(duì)象實(shí)現(xiàn)哪個(gè)或哪些事件,例如創(chuàng)建按鈕對(duì)象,并考慮使用動(dòng)作事件,即ActionEvent;編寫(xiě)該組件對(duì)象的事件處理者類,即實(shí)現(xiàn)要處理事件對(duì)應(yīng)的監(jiān)聽(tīng)器接口,例如編寫(xiě)事件處理者ButtonHandler類,實(shí)現(xiàn)ActionEvent對(duì)應(yīng)的ActionListenter接口,具體來(lái)說(shuō)實(shí)現(xiàn)該接口中的voidactionPerformed(ActionEvente)方法,在該方法中補(bǔ)充處理該事件的代碼;創(chuàng)建事件處理者類的實(shí)例,并調(diào)用組件對(duì)象對(duì)應(yīng)的添加處理該類事件的方法進(jìn)行添加,例如調(diào)用按鈕的addActionListener(ActionListenerl)方法添加ButtonHandler類的實(shí)例。圖8-12例8-10運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/31不同組件往往需要處理不同事件,而不同事件被封裝成不同的類。與AWT、Swing有關(guān)的所有事件類都由java.awt.AWTEvent類派生,而它為java.util.EventObject的子類。共有10個(gè)事件類,可歸納為如下兩大類:低級(jí)事件:指基于組件和容器的事件,當(dāng)一個(gè)組件上發(fā)生事件(如鼠標(biāo)經(jīng)過(guò)、點(diǎn)擊、拖放等)時(shí),觸發(fā)了組件事件,包括ComponentEvent(組件事件:組件尺寸的變化與移動(dòng)等)、ContainerEvent(容器事件:組件增加或移動(dòng)等)、WindowEvent(窗口事件:關(guān)閉窗口、激活窗口閉合、最大化、最小化等)、FocusEvent(焦點(diǎn)事件:焦點(diǎn)的獲得與失去)、KeyEvent(鍵盤事件:鍵被按下與釋放)和MouseEvent(鼠標(biāo)事件:鼠標(biāo)單擊與移動(dòng)等);高級(jí)事件:指基于語(yǔ)義的事件,可以不與特定的動(dòng)作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,例在JTextField組件中輸入文字和按回車鍵(Enter鍵)會(huì)觸發(fā)ActionEvent,而不只是動(dòng)作關(guān)聯(lián)的KeyEvent,包括ActionEvent(動(dòng)作事件:按鈕按下、在文本框中輸入Enter鍵等)、AdjustmentEvent(調(diào)節(jié)事件:滾動(dòng)條上移動(dòng)滑塊以調(diào)節(jié)數(shù)值)、ItemEvent(項(xiàng)目事件:從選擇框或列表框中選一項(xiàng))和TextEvent(文本事件:文本對(duì)象改變)。8.2Swing程序設(shè)計(jì)2023/1/31每個(gè)事件都有對(duì)應(yīng)的事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)器被實(shí)現(xiàn)為接口,可根據(jù)動(dòng)作來(lái)定義或重載方法。常用事件類對(duì)應(yīng)的接口以及接口中的方法如下:ActionEvent:激活組件,對(duì)應(yīng)接口為ActionListener,需實(shí)現(xiàn)的方法為voidactionPerformed(ActionEvente);FocusEvent:組件焦點(diǎn)獲得或失去,對(duì)應(yīng)接口為FocusListener,有兩個(gè)方法需實(shí)現(xiàn),即voidfocusGained(FocusEvente)和voidfocusLost(FocusEvente);MouseEvent:對(duì)于鼠標(biāo)移動(dòng),對(duì)應(yīng)的接口為MouseMotionListener,需要實(shí)現(xiàn)的方法有voidmouseDragged(MouseEvente)和voidmouseMoved(MouseEvente),而對(duì)于點(diǎn)擊鼠標(biāo)等,對(duì)應(yīng)的接口為MouseListener,需要實(shí)現(xiàn)的方法有voidmousePressed(MouseEvente)、voidmouseReleased(MouseEvente)、voidmouseEntered(MouseEvente)、voidmouseExited(MouseEvente)和voidmouseClicked(MouseEvente);KeyEvent:鍵盤輸入,對(duì)應(yīng)接口為KeyListener,需要實(shí)行的方法包括三個(gè):voidkeyPressed(KeyEvente)、voidkeyReleased(KeyEvente)和voidkeyTyped(KeyEvente);WindowEvent:窗口級(jí)事件,對(duì)應(yīng)接口為WindowsListener,可實(shí)現(xiàn)的方法較多,包括voidwindowClosing(WindowEvente)、voidwindowOpened(WindowEvente)、voidwindowClosed(WindowEvente)、voidwindowIconified(WindowEvente)、voidwindowDeiconified(WindowEvente)、voidwindowActivated(WindowEvente)和voidwindowDeactivated(WindowEvente)。8.2Swing程序設(shè)計(jì)2023/1/31常用組件可能產(chǎn)生事件的對(duì)應(yīng)關(guān)系如表8-1所示。表8-1常用組件可能產(chǎn)生事件的對(duì)應(yīng)關(guān)系表

基于前述介紹的事件源、事件、監(jiān)聽(tīng)器接口以及相關(guān)方法,就可以知道哪個(gè)組件觸發(fā)什么事件,該組件需要添加實(shí)現(xiàn)哪個(gè)監(jiān)聽(tīng)器接口以及相關(guān)方法的事件處理者類對(duì)象。【例8-11】鼠標(biāo)事件編程示例的源代碼。8.2Swing程序設(shè)計(jì)2023/1/31運(yùn)行結(jié)果:上例介紹了鼠標(biāo)拖曳、進(jìn)入窗體、離開(kāi)窗體的使用,其他鼠標(biāo)事件相關(guān)的方法均實(shí)現(xiàn)為空,可根據(jù)應(yīng)用實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊、移動(dòng)等相關(guān)的方法。其他事件的使用方法與該例類似,可查閱JDK中事件處理的相關(guān)文檔或利用集成開(kāi)發(fā)環(huán)境提供的自動(dòng)補(bǔ)全事件接口必須實(shí)現(xiàn)的方法等功能。上例中事件處理者類MouseListenerImp實(shí)現(xiàn)了MouseMotionListener,MouseListener和WindowListener等3個(gè)接口,這使得該類中列出很多空的事件處理方法,實(shí)際上可使用事件適配器類來(lái)簡(jiǎn)化代碼。對(duì)于該類,因Java語(yǔ)言只支持單繼承,雖然無(wú)法一起繼承對(duì)應(yīng)的3個(gè)事件適配器類(MouuseMotionAdapter、MouseAdapter和WindowAdapter),卻可通過(guò)繼承WindowAdapter類,并實(shí)現(xiàn)剩下的2個(gè)接口這一方式來(lái)簡(jiǎn)化代碼。那么,MouseListenerImp可重寫(xiě)如下:圖8-13例8-11運(yùn)行界面8.2Swing程序設(shè)計(jì)2023/1/31顯然,上述代碼片段中未列出那些處理窗體事件相關(guān)的空方法。實(shí)際上,使用Java語(yǔ)言提供的匿名類機(jī)制同樣可以達(dá)到上述目的。下面所示的代碼片斷是為JFrame對(duì)象注冊(cè)事件處理者對(duì)象的語(yǔ)句,傳入?yún)?shù)為使用匿名類機(jī)制的窗體事件適配器類對(duì)象(詳見(jiàn)8.4小節(jié)的綜合應(yīng)用舉例),同時(shí)定義了事件處理方法。 //匿名類關(guān)閉窗口 addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente1){ System.exit(0); } });

然而,對(duì)于GUI程序來(lái)說(shuō),一些組件的事件處理者類有時(shí)需要與創(chuàng)建組件的容器類進(jìn)行交互,如果通過(guò)傳遞參數(shù)來(lái)實(shí)現(xiàn)交互往往會(huì)使事件處理者類變得復(fù)雜,不但需要增加代碼,而且降低了程序的可讀性。使用匿名類的機(jī)制同樣可以解決好這一問(wèn)題,使用格式如下:xCompObj.addXXListener(newXXAdapter(){ publicvoidyyMethod(XXEvente){//直接操作外部變量,即使用與xCompObj同一作用域的變量。}});8.3簡(jiǎn)單多媒體技術(shù)

8.3.1聲音優(yōu)美的音樂(lè)、漂亮的界面不但是網(wǎng)頁(yè)、Java小應(yīng)用程序成功的必備條件之一,甚至對(duì)于GUI應(yīng)用程序來(lái)說(shuō),也需要音樂(lè)的點(diǎn)綴。在JDK1.0中,Java只支持單聲道8kHZ的采樣頻率存儲(chǔ)的au格式的聲音文件,但隨著JDK版本的升級(jí),Java2的API以及聲音包提供了對(duì)多種音頻格式的支持,可以處理AIFF、WAV和MIDI等文件格式。由于Java程序與操作系統(tǒng)無(wú)關(guān),因此,Java環(huán)境下播放聲音的方法也與計(jì)算機(jī)硬件無(wú)關(guān),這可簡(jiǎn)化Java處理多媒體編程的難度。Java的Applet小應(yīng)用程序提供了最簡(jiǎn)單的聲音播放技術(shù),其中,Applet類中的play()方法可以播放聲音文件,有如下兩種用法:publicvoidplay(URLurl):可播放URL地址為url的聲音文件;publicvoidplay(URLurl,Stringname):可播放URL地址為url,文件名為name的聲音文件。當(dāng)然,如果系統(tǒng)沒(méi)有找到聲音文件,應(yīng)用程序?qū)⒉徊シ湃魏温曇?。為了獲的聲音文件的URL地址,程序中需要使用getCodeBase()方法返回Applet小應(yīng)用程序的URL,而聲音文件則需要放在Java小應(yīng)用程序所在的目錄中,否則程序?qū)o(wú)法找到聲音文件。play()方法只播放聲音文件一次,如果需要循環(huán)播放和停止,可利用AudioClip接口。8.3簡(jiǎn)單多媒體技術(shù)

java.applet包中AudioClip接口提供了多個(gè)播放聲音的文件,可以對(duì)聲音文件的播放進(jìn)行較高級(jí)的控制。使用該接口需要如下三個(gè)步驟:(1)使用import語(yǔ)句引入該接口:importjava.applet.AudioClip;(2)創(chuàng)建AudioClip對(duì)象并用getAudioClip()方法將其初始化:AudioClipaudio=getAudioClip(getCodeBase(),”test.wav”);(3)利用AudioClip類提供的3個(gè)聲音播放相關(guān)方法進(jìn)行播放控制。其中,第二步中的audio是AudioClip對(duì)象,是用Applet類的getAudioClip()方法獲得的,該方法可將聲音文件從指定的URL裝入到Applet小應(yīng)用程序中,與Appplet類的play()方法的參數(shù)與使用方法類似,有如下兩種加載聲音文件的方法:AudioClipgetAudioClip(URLurl);AudioClipgetAudioClip(URL,Stringname);參數(shù)URL指明聲音文件的位置,可用getCodeBase()方法獲得,而name指明聲音文件的文件名,該文件應(yīng)放在Applet小應(yīng)用程序的目錄中,若放在該目錄的子目錄下時(shí)還應(yīng)包含相應(yīng)的路徑。而第三步可用的播放聲音的方法為:play():播放聲音文件一次;loop():循環(huán)播放聲音文件;stop():停止正在播放或循環(huán)播放的聲音文件。8.3簡(jiǎn)單多媒體技術(shù)

【例8-12】播放聲音文件示例的源代碼。如果是在Eclipse等集成開(kāi)發(fā)環(huán)境中,可直接用鼠標(biāo)點(diǎn)住該類,右鍵彈出上下文菜單,選擇“Runas”項(xiàng)下的“JavaApplet”項(xiàng)測(cè)試該程序,即按照?qǐng)D8-14所示的界面啟動(dòng)測(cè)試上例。但要注意的是,聲音文件應(yīng)放在Eclipse項(xiàng)目的根目錄下,即包含“.project”文件的目錄中。在Eclipse集成開(kāi)發(fā)環(huán)境中測(cè)試上例的運(yùn)行界面如圖8-15所示。圖8-14Eclipse中啟動(dòng)例8-12的界面8.3簡(jiǎn)單多媒體技術(shù)

此外,也可編寫(xiě)如下HTML文件,保存為Ex8_12_UnderstandMusic.htm,用IE或FireFox等瀏覽器打開(kāi)測(cè)試本例,運(yùn)行結(jié)果如圖8-16所示。<html> <head><title>理解Java小應(yīng)用程序播放聲音</title></head><body> <appletcode="Ex8_12_UnderstandMusic.class"WIDTH=400HEIGHT=200> </applet></body></html>需要注意的是聲音文件和編譯后的class文件應(yīng)放在同一個(gè)目錄,如果編寫(xiě)該類時(shí)使用了包,上述程序片斷中的.class文件名前應(yīng)加上包,即若該類放在名為xx.yy的包下,那么上述HTML文件中應(yīng)使用“xx.yy.Ex8_12_UnderstandMusic.class”,而且該文件應(yīng)放在“xx\yy”目錄下,而.htm和聲音文件應(yīng)放在“xx”目錄的同級(jí)目錄。此外,在IE瀏覽器中運(yùn)行該頁(yè)面,還需要啟用訪問(wèn)計(jì)算機(jī)的腳本或ActiveX控件。圖8-16IE中測(cè)試?yán)?-12的運(yùn)行界面8.3簡(jiǎn)單多媒體技術(shù)

上例中介紹了聲音相關(guān)類及其方法的基本使用方法,但它們僅能在applet內(nèi)調(diào)用,在Java應(yīng)用程序里是不能使用該方法的。在Java2中,應(yīng)用程序可以用Applet類的newAudioClip()方法裝入聲音文件,使用方法如下:publicstaticfinalAudioClipnewAudioClip(URLurl);上例使用getAudioClip()方法加載聲音文件的代碼可以改成為下面的代碼用于Java應(yīng)用程序:audio1=newAudioClip("1.mid");Applet可以使用getCodeBase()和getDocumentBase()獲得HTML文件的URL,并聯(lián)合輸入聲音文件,確定其位置。其中,getCodeBase()方法獲取Applet類文件所在位置的URL地址,該地址可以是因特網(wǎng)上的一個(gè)地址,所用標(biāo)準(zhǔn)協(xié)議為http,也可以是本地磁盤上的一個(gè)位置,所用協(xié)議為File;getDocumentBase()方法只用于獲取HTML文檔的URL地址。Java中還有sun.audio、javax.sound、javax.media.bean.playerbean等有關(guān)聲音處理的包,其中前2個(gè)包JDK中就自帶,但和Applet類一樣,只支持播放au,mid,wave等格式,第三個(gè)包需要用到JMF(JavaMediaFramework,JMF),即Java媒體框架,但需單獨(dú)安裝該包,支持較多的格式,如可以播放mp3文件。此外,javazoom()下的jlayer也可以用于播放聲音文件。讀者可以進(jìn)一步參考相關(guān)文檔深入學(xué)習(xí)處理聲音文件的高級(jí)方法。例8-13所示的是使用sun.audio播放聲音的一個(gè)例子。8.3簡(jiǎn)單多媒體技術(shù)

【例8-13】使用sun.audio包播放聲音文件示例的源代碼。該例播放的聲音文件是au格式,是sun.audio包能處理的一種聲音格式,實(shí)際上并不常用。需要注意的是該包播放過(guò)大的聲音文件或不支持的格式時(shí)會(huì)報(bào)如下錯(cuò)誤:Exceptioninthread"main"java.lang.NegativeArraySizeException atsun.audio.AudioStream.getData(UnknownSource)實(shí)際上,au格式適合GUI程序中一些提示聲音的場(chǎng)合,如果想播放MP3等格式,建議使用Java媒體框架或第三方媒體庫(kù)。8.3簡(jiǎn)單多媒體技術(shù)

8.3.2圖形java.awt.Graphics類是Java語(yǔ)言中最基本也是最重要的處理圖形的類,包含了大量的圖形、文本和圖像的操作方法,可以繪制出線、文字、幾何形狀等圖形。編寫(xiě)處理圖形、本文、圖像的程序時(shí),必須先把該類導(dǎo)入到Java程序中。Graphics類的使用方法比較特殊,當(dāng)在屏幕上繪制圖形等時(shí),并不需要直接使用new關(guān)鍵字來(lái)創(chuàng)建一個(gè)該類的對(duì)象實(shí)例,而是需要一個(gè)畫(huà)板,它在這個(gè)畫(huà)板上直接進(jìn)行各種各樣的畫(huà)圖操作即可,而畫(huà)板必須是一個(gè)實(shí)體。所有Java組件都具有一個(gè)getGraphics()方法,該方法能返回一個(gè)圖形對(duì)象,這樣就可以在所有的Java組件上進(jìn)行畫(huà)圖操作了。其實(shí)每個(gè)Java組件(java.awt.Component類及其子孫類的對(duì)象)就是前面提到的畫(huà)板。而在Java小應(yīng)用程序中,需使用java.awt.Applet類的paint()方法繪圖,系統(tǒng)直接將生成好的Graphics對(duì)象通過(guò)參數(shù)形式傳給paint()方法,在該方法中使用Graphics對(duì)象的引用即可繪圖,即可繼承Applet類,在該類的paint()方法中直接用系統(tǒng)傳遞進(jìn)的Graphics對(duì)象引用繪圖。當(dāng)然,該方法對(duì)于Java組件也適用,而且繪圖過(guò)程更簡(jiǎn)單穩(wěn)定,如例8-14所示。8.3簡(jiǎn)單多媒體技術(shù)

【例8-14】使用paint()方法繪圖示例的源代碼。運(yùn)行結(jié)果如圖在上例中自定義的DrawPanel類繼承自JPanel類,并重載了paint()方法,在該方法中使用系統(tǒng)傳入的Graphics對(duì)象g繪制圖形。下面是繪制圖形時(shí)需要注意的幾點(diǎn):(1)繪制圖形前需指定圖形所用的顏色。(2)繪制文字前可指定字體。(3)繪制圖形時(shí)應(yīng)正確使用繪圖方法。圖8-17例8-14的運(yùn)行界面8.3簡(jiǎn)單多媒體技術(shù)

8.3.3圖像顯示圖像需要兩個(gè)步驟:加載圖像數(shù)據(jù)和顯示圖像。(1)獲取圖像數(shù)據(jù)。對(duì)于Java小應(yīng)用程序,可用java.applet.Applet類的getImage(URLurl,Stringname)方法裝載,返回值是一個(gè)Image類對(duì)象;對(duì)于普通的GUI程序,可以用javax.imageio包中的類處理圖像的讀寫(xiě)問(wèn)題,一般來(lái)說(shuō),可用ImageIO類的read(Filefile)方法直接裝入一個(gè)圖片文件。其中,getImage()方法中第一個(gè)參數(shù)為圖像文件的URL地址,與8.3.1小節(jié)獲取音頻文件URL地址一樣,可用Applet類的getCodeBase()和getDocumentBase()方法通過(guò)相對(duì)路徑獲取圖像數(shù)據(jù),而第二個(gè)參數(shù)為*.gif和*.jpg的圖像文件名字符串;對(duì)于ImageIO類的read()方法有4種形式,可以直接傳入一個(gè)File對(duì)象或URL對(duì)象等。另外,Image類封裝了圖像的信息,并提供獲取圖像有關(guān)信息的方法,以便得到有關(guān)圖像的屬性,如用getHeight(ImageObserverobserver)獲取圖像的高度,用getWidth(ImageObserverobserver)獲取圖像的寬度。8.3簡(jiǎn)單多媒體技術(shù)

(2)顯示圖像Graphics類的drawImage()方法可用于顯示圖像,該方法的具體定義如下:drawImage(Imageimg,intx,inty[,intwidth,intheight][,Colorbgcolor],ImageObserverobserver);其中,img是要顯示的圖像文件,(x,y)是指定顯示位置的左上角坐標(biāo),width和height分別為顯示圖像區(qū)域的寬和高,bgcolor為圖像的背景顏色,observer是跟蹤圖像下載情況的ImageObserver型參數(shù),在調(diào)用異步方法時(shí),應(yīng)指定這一參數(shù)用于調(diào)用它的imageUpdate()方法對(duì)下載的圖像不斷更新。【例8-15】使用Image

溫馨提示

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