第8章 圖形用戶界面編程_第1頁
第8章 圖形用戶界面編程_第2頁
第8章 圖形用戶界面編程_第3頁
第8章 圖形用戶界面編程_第4頁
第8章 圖形用戶界面編程_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

圖形用戶界面(GraphicUserInterface,簡稱GUI)是一種當今十分流行的人機交互方式,它通過為用戶呈現(xiàn)圖形界面,用戶看到什么就可以操作什么,取代了在字符方式下知道是什么后才能操作什么的方式。Java語言通過提供一系列類和接口,為用戶實現(xiàn)圖形用戶界面提供了方便,而不需要直接調(diào)用操作系統(tǒng)API。本章將重點介紹GUI編程和簡單多媒體技術(shù)。8.1圖形用戶界面概述8.1.1AWT簡介抽象窗口工具包AWT(AbstractWindowToolkit)是Java開發(fā)工具包(JDK)的一部分,是Java基礎(chǔ)類(JavaFoundationClasses,JFC)的核心部分之一(從JDK1.0開始),它的作用是給用戶提供基本的界面組件,如窗口、按鈕、菜單等。此外,還提供了事件處理結(jié)構(gòu),支持剪貼板、數(shù)據(jù)傳輸和圖像操作等。在Java1.0中,最初設(shè)計AWT的目標是通過提供一個抽象的層次使GUI編程達到跨平臺的目的,使GUI程序能在所有平臺上正常顯示。遺憾的是,AWT并沒有很好的實現(xiàn)這一目標,但從Java1.1以后,AWT得到了很大的改進,而從Java1.2開始,AWT添加了被稱為“Swing”的新GUI庫。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等類和兩個子包:MenuComponent與Component。然而,隨著Java語言的演變,AWT包也發(fā)生了較大變化,如JDK7.0中AWT包和子包結(jié)構(gòu)如圖所示:雖然AWT所包含的類和子包有所變化,但核心概念和類并無太大變化。其中,組件類Component和它的子類——容器類Container是兩個非常重要的類。組件類Component包含了按鈕類Button、畫布類Canvas、復選按鈕CheckBox、下拉列表類Choice、標簽類Label、列表類List、滾動條類Scrollbar、文本框類TextField與多行文本域類TextArea等,由它們創(chuàng)建的對象則稱為組件(即Component的子類或間接子類創(chuàng)建的對象),是構(gòu)成圖形界面的基本組成部分。容器類Container作為組建類的一個子類,實際上也是一個組件,具有組件的所有性質(zhì),但它是用來容納其他組件和容器的,主要包括面板類Panel、窗口類Window、結(jié)構(gòu)類Frame、對話框類Dialog等。由這些類創(chuàng)建的對象稱為容器,可通過組件類提供的publicAdd()方法將組件添加到容器中,即一個容器通過調(diào)用Add()方法將組件添加到該容器中。這樣,用戶可以操作在容器中呈現(xiàn)的各種組件,達到與系統(tǒng)交互的目的。8.1圖形用戶界面概述8.1圖形用戶界面概述事實上,圖形界面往往非常復雜,容器中可以放若干組件以及包含有若干組件的容器。Java語言通過布局管理器(LayoutManager)管理容器中各種組件。在創(chuàng)建容器時,可以指定一種布局(即BorderLayout、CardLayout、GridBagLayout與GridLayout等中的一種),各組件按照布局確定放置位置,這樣,當容器需要對某一組件進行定位或判斷其大小時,就可通過調(diào)用對應(yīng)的布局管理器來獲得。在編寫GUI程序時,安排組件位置和大小需要注意以下兩點:各組件的大小和位置由容器中的布局管理器負責,組件的setLocation()、setSize()和setBounds()等方法被布局管理器覆蓋,用戶無法設(shè)置這些屬性;如果用戶想自己控制組件的大小和位置,可取消容器的布局管理器,即調(diào)用語句“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); }}運行結(jié)果:圖8-2例8-1運行界面8.1圖形用戶界面概述8.1.2Swing簡介Swing是一套由Java基礎(chǔ)類庫(JFC)提供的開發(fā)圖形用戶界面的類庫,是JFC的最主要部分,為Java基于窗體的應(yīng)用程序開發(fā)設(shè)計提供了一套精美、豐富的基本組件,以及一個能使GUI獨立于特定平臺的顯示框架。Swing是在AWT基礎(chǔ)上擴展而來的,提供了非常豐富的組件,遠遠多于AWT,并且引入了新的概念和性能,這使得基于Swing開發(fā)GUI應(yīng)用程序比直接使用AWT開發(fā)更為靈活、方便、效率高,而且能設(shè)計出更優(yōu)美的、感受更好的GUI。Swing是由javax.swing包提供的,主要包括兩種類型的組件:頂層容器和輕量級組件。它們都以“J”開頭。其中,頂層容器主要包含Jframe,Japplet、Jdialog、Jwindow等;輕量級組件主要是繼承自AWT的Container類的Jcomponent類及其子類,主要包括JtextArea、JTextField、JButton、JMenu、JPanel、Jscrollbar等。JDK1.70的Swing包和子包結(jié)構(gòu)如下圖所示:8.1圖形用戶界面概述使用Swing編寫GUI程序的基本流程和使用AWT編寫類似,只是用的容器和組件為“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); }}運行結(jié)果:圖8-4例8-2運行界面8.1圖形用戶界面概述例8-1和例8-2使用了類似的組件和編寫方法,但對比兩者的運行界面,顯然使用Swing組件編寫的GUI程序界面美觀許多,顯示速度更快,并且窗體帶有更多的功能。8.2Swing程序設(shè)計2023/1/318.2.1創(chuàng)建窗體使用Swing編寫GUI程序時,通??梢岳肑Frame類來創(chuàng)建窗體。被創(chuàng)建的窗體通常包含標題、最小化按鈕、最大化按鈕、關(guān)閉按鈕以及窗體容器部分等,如例8-2所示。JFrame類包含很多設(shè)置窗體的方法,例如可以用setTitle(Stringtitle)方法設(shè)置窗體標題,用setBounds(intx,inty,intwidth,intheight)方法設(shè)置窗體顯示的位置及大?。ㄈ缋?-2中),其中,前兩個參數(shù)x和y用來設(shè)置窗體的顯示位置,依次是窗體左上角的點在顯示器中的水平和垂直坐標,而后兩個參數(shù)width和height用來設(shè)置窗體的大小,依次為窗體的寬度和高度。在默認情況下使用JFrame類創(chuàng)建的窗體不可見,因此,為了讓這樣的窗體顯示出來還必須調(diào)用setVisable(Booleanb)方法將其設(shè)置為可見,讓其運行時可顯示在顯示器上,可以認為這時才開始繪制窗體,之后再設(shè)置窗體的其他屬性將無效,即setVisable()方法應(yīng)是最后一個被調(diào)用的方法。此外,在創(chuàng)建窗體時,除了設(shè)置窗體的標題、大小和所在位置等外,通常需要設(shè)置關(guān)閉按鈕的動作。關(guān)閉按鈕的默認動作為將窗體隱藏,可以通過setDefaultCloseOperation(intoperation)方法設(shè)置關(guān)閉按鈕的動作。

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

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

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

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

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

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

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

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

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

此外,也可編寫如下HTML文件,保存為Ex8_12_UnderstandMusic.htm,用IE或FireFox等瀏覽器打開測試本例,運行結(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)放在同一個目錄,如果編寫該類時使用了包,上述程序片斷中的.class文件名前應(yīng)加上包,即若該類放在名為xx.yy的包下,那么上述HTML文件中應(yīng)使用“xx.yy.Ex8_12_UnderstandMusic.class”,而且該文件應(yīng)放在“xx\yy”目錄下,而.htm和聲音文件應(yīng)放在“xx”目錄的同級目錄。此外,在IE瀏覽器中運行該頁面,還需要啟用訪問計算機的腳本或ActiveX控件。圖8-16IE中測試例8-12的運行界面8.3簡單多媒體技術(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)上的一個地址,所用標準協(xié)議為http,也可以是本地磁盤上的一個位置,所用協(xié)議為File;getDocumentBase()方法只用于獲取HTML文檔的URL地址。Java中還有sun.audio、javax.sound、javax.media.bean.playerbean等有關(guān)聲音處理的包,其中前2個包JDK中就自帶,但和Applet類一樣,只支持播放au,mid,wave等格式,第三個包需要用到JMF(JavaMediaFramework,JMF),即Java媒體框架,但需單獨安裝該包,支持較多的格式,如可以播放mp3文件。此外,javazoom()下的jlayer也可以用于播放聲音文件。讀者可以進一步參考相關(guān)文檔深入學習處理聲音文件的高級方法。例8-13所示的是使用sun.audio播放聲音的一個例子。8.3簡單多媒體技術(shù)

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論