圖形用戶界面ppt課件_第1頁
圖形用戶界面ppt課件_第2頁
圖形用戶界面ppt課件_第3頁
圖形用戶界面ppt課件_第4頁
圖形用戶界面ppt課件_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

.,學(xué)習(xí)導(dǎo)讀首先,我們學(xué)習(xí)一些基本的圖形編程知識,包括窗口的顯示及外觀設(shè)置、在窗口中顯示文字和圖像等;接下來,介紹Java的事件處理機(jī)制,例如如何在程序中接收并處理如鍵盤按鍵和鼠標(biāo)點(diǎn)擊等“事件”;最后,系統(tǒng)地介紹圖形用戶界面中常用組件的用法,如布局管理器、文本框、復(fù)選框、菜單、對話框等。,第七章圖形用戶界面的設(shè)計與實(shí)現(xiàn),.,教學(xué)重點(diǎn)與難點(diǎn):,框架的組成及外觀在框架中顯示文本和圖形字體和顏色的設(shè)置Java的事件處理機(jī)制窗口事件、焦點(diǎn)事件、鍵盤事件、鼠標(biāo)事件的處理Swing各種組件的用法,.,7.1圖形用戶界面概述,Java1.0的出現(xiàn)帶來了抽象窗口工具箱(AWT)。設(shè)計目標(biāo)是希望構(gòu)建一個通用的GUI,使得利用它編寫的程序能夠運(yùn)行在所有的平臺上,以實(shí)現(xiàn)Sun公司提出的口號“一次編寫,隨處運(yùn)行”。在Java1.2中,Sun公司推出了新的用戶界面庫:Swing。相對AWT來說,Swing功能更強(qiáng)大、使用更方便,它的出現(xiàn)使得Java的圖形用戶界面上了一個臺階。但是,Swing并沒有代替AWT。在Java1.1中,AWT事件處理模型有了根本改變。Swing使用的仍然是Java1.1的事件處理模型。,.,7.2簡單圖形用戶界面,7.2.1第一個圖形用戶界面,在Java中,頂層窗口稱為框架。在AWT庫中,對應(yīng)于框架的類是Frame,在Swing庫中,相應(yīng)的類是JFrame。JFrame類擴(kuò)展了Frame類。大部分AWT組件在Swing中都有等價的組件,它們在表示形式上差一個“J”。框架是一個容器,我們可以在這個容器中放入其他一些圖形用戶界面組件,如按鈕、菜單等,從而組成一個功能完善的程序。,.,【例7.1】顯示一個空框架(例題7_1(1)importjavax.swing.*;publicclassFirstFramepublicstaticvoidmain(Stringargs)SimpleFrameframe=newSimpleFrame();/設(shè)置用戶關(guān)閉框架時的響應(yīng)動作frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/參見/顯示該框架frame.show();classSimpleFrameextendsJFramepublicSimpleFrame()/設(shè)置框架大小setSize(WIDTH,HEIGHT);publicstaticfinalintWIDTH=300;publicstaticfinalintHEIGHT=200;,運(yùn)行結(jié)果,.,7.2.2框架外觀,JFrame類的繼承層次圖,.,Component類是所有GUI對象的祖先,Window類是Frame類的父類,JFrame類直接從Frame繼承而來。對于框架外觀的操作比較重要的方法如下:setIconImage窗口最小化(在Java中稱為圖標(biāo)化)時,把一個Image對象用作圖標(biāo)。setTitle設(shè)置窗口中標(biāo)題欄的文字。setResizable設(shè)置用戶是否可以改變框架大小。dispose方法關(guān)閉窗口,并回收該窗口的所有資源。setLocation設(shè)置組件的位置。setBounds重新設(shè)置組件的大小和位置。,.,【例7.2】框架外觀的設(shè)置(例題7_1(2)設(shè)置具有以下特征的框架:它的高度和寬度為整個屏幕的1/3;自定義窗口的標(biāo)題和圖標(biāo);窗口的大小不可變。程序代碼見FrameSizeSet.java。運(yùn)行結(jié)果如下:,圖標(biāo),標(biāo)題,最大化按鈕失效,.,7.2.3在框架中顯示信息,JFrame包含了四個窗格:RootPane、LayeredPane、GlassPane和ContentPane。如果需要將一些圖形用戶界面元素加入到框架中,我們需要在面板組件(JPanel)中進(jìn)行繪制,然后將該面板組件加入到框架的內(nèi)容窗格(ContentPane)中。相應(yīng)的代碼如下:/得到JFrame的內(nèi)容窗格對象ContainercontentPane=getContentPane();Componentc=.;/如JButton、JLabel等組件/將組件加入到內(nèi)容窗格中contentPane.add(c);面板JPanel類本身是容器,它可以容納其他圖形用戶界面元素,如按鈕、菜單等。,.,為了在面板中進(jìn)行繪制,需要重載JComponent類的paintComponent方法。classMyPanelextendsJpanelpublicvoidpaintComponent(Graphicsg)super.paintComponent(g);./相關(guān)的繪制代碼paintComponent方法是自動執(zhí)行的,當(dāng)窗口需要被重新繪制時,如用戶縮放窗口,或還原已最小化的窗口時,系統(tǒng)就會自動調(diào)用該方法。在框架中顯示文本信息的方法:g.drawString(text,x,y),.,【例7.3】在框架中顯示信息(例題7_1(3)程序代碼見HelloWorld.java。運(yùn)行結(jié)果如下:,.,7.2.4文本和字體(例題7_1(3),通過Font類對象設(shè)置字體。FontStringFont=newFont(“宋體”,Font.ITALIC,20);字體風(fēng)格有以下幾種選項(xiàng):Font.PLAIN/常規(guī)Font.BOLD/加粗Font.ITALIC/傾斜不同的系統(tǒng)中安裝了不同的字體,為了得到本系統(tǒng)中所有已安裝的字體,我們可以通過GraphicsEnvironment類的getAvailableFontFamilyNames方法來實(shí)現(xiàn)。該方法返回一個字符串?dāng)?shù)組,數(shù)組內(nèi)包含所有可用的字體名?!纠?.4】顯示系統(tǒng)中所有字體名。程序見ListFonts.java,.,【例7.5】字體設(shè)置(例題7_1(3)采用“宋體”顯示字符串“你好,Java!”,字體風(fēng)格為加粗、傾斜,大小為20點(diǎn)。程序代碼見FontSet.java。運(yùn)行結(jié)果如下:,.,7.2.5繪制簡單圖形,利用Graphics類提供的一些方法進(jìn)行簡單圖形的繪制。如:drawLine、drawPolyLine、drawPolygon、drawArc。drawLine用來畫線,調(diào)用格式:voiddrawLine(intx1,inty1,intx2,inty2)(x1,y1)和(x2,y2)為線的兩個端點(diǎn)。drawPolygon用來繪制多邊形,調(diào)用格式:voiddrawPolygon(Polygonp)參數(shù)是多邊形對象Polygon,先定義Polygon對象,然后將點(diǎn)加入到該對象中,然后利用drawPolygon進(jìn)行多邊形的繪制:Polygonp=newPolygon();p.addPoint(x1,y1);p.addPoint(x2,y2);.g.drawPolygon(p);,.,【例7.6】簡單圖形的繪制(擴(kuò)充例題7_1(3)直線,弧,多邊形的繪制。程序代碼見SimpleDraw.java。運(yùn)行結(jié)果如下:,.,Java提供了矩形、圓角矩形、橢圓等基本形狀的繪制方法:矩形:voiddrawRect(intx,inty,intwidth,intheight)圓角矩形:voiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)橢圓:voiddrawOval(intx,inty,intwidth,intheight)Java還提供了方便的填充封閉圖形的方法,只需要將前面介紹的方法中的draw改為fill即可。如:voidfillRect(intx,inty,intwidth,intheight)voidfillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)voidfillOval(intx,inty,intwidth,intheight),.,7.2.6顏色,Graphics類提供了與顏色相關(guān)的方法:getColor返回當(dāng)前顏色設(shè)置。setColor設(shè)置當(dāng)前顏色。setColor方法的調(diào)用格式為:voidsetColor(Colorc)我們可以選用Color類提供的13種標(biāo)準(zhǔn)顏色的預(yù)定義常數(shù),也可以采用Color構(gòu)建器來創(chuàng)建Color對象:Color(intredness,intgreenness,intblueness)參數(shù)redness,greenness,blueness分別表示紅、綠、藍(lán)的值,它們的值在0至255范圍內(nèi)。以下是顏色使用的例子:g.setColor(Color.green);g.drawString(“你好!”,100,100);g.setColor(newColor(128,0,128);/自定義顏色g.drawString(“你好!”,100,200);,.,JFrame類的超類Component類提供的顏色操作的相關(guān)方法:setBackground設(shè)置背景色。setForeground設(shè)置在組件上進(jìn)行繪制的默認(rèn)顏色?!纠?.7】顏色設(shè)置(擴(kuò)充例題7_1(3)設(shè)置圖形顏色,將框架背景顏色設(shè)置為桌面的顏色。程序代碼見ColorRect.java。運(yùn)行結(jié)果如下:,.,7.2.7圖像,通過Graphics類提供的drawImage方法實(shí)現(xiàn)圖像的顯示:publicvoidpaintComponent(Graphicsg).g.drawImage(image,x,y,null);參數(shù)image封裝了要顯示的圖像文件。通過Toolkit類的靜態(tài)getDefaultToolkit方法,可以讀取GIF文件和JPEG文件:Stringname=“test.gif”;Imageimage=Toolkit.getDefaultToolkit().getImage(name);通過以上代碼,可以得到一個本地圖像文件,如果要在網(wǎng)絡(luò)上得到一個圖像文件,必須使用URL類。相應(yīng)的代碼如下:URLurl=newURL(“,.,【例7.8】顯示圖像(7_1(3)Helloworld1)從本地加載一幅圖像,并在窗口的中間顯示。程序代碼見ImageShow.java。運(yùn)行結(jié)果如下:,.,7.3事件處理,7.3.1事件處理原理,如果用戶在用戶界面執(zhí)行了一個動作,這將導(dǎo)致一個事件的發(fā)生。事件是描述發(fā)生了什么的對象。在Java中,定義了各種不同類型的事件類,用來描述各種類型的用戶操作。事件是由事件源產(chǎn)生的,事件的產(chǎn)生者稱為事件源。例如,在Button組件上點(diǎn)擊鼠標(biāo)會產(chǎn)生以這個Button為源的一個事件:ActionEvent。事件源擁有自己的方法,我們通過向事件源注冊事件監(jiān)聽器。事件監(jiān)聽器是一個類的實(shí)例,這個類實(shí)現(xiàn)了一個特殊的接口,稱為Lintenerinterface。當(dāng)事件源產(chǎn)生了一個事件以后,事件源就會發(fā)送通知給相應(yīng)的事件監(jiān)聽器,監(jiān)聽器對象根據(jù)事件對象內(nèi)封裝的信息,決定如何響應(yīng)這個事件。,.,7.3.4AWT事件層次結(jié)構(gòu)圖,AWT事件類的繼承關(guān)系圖,事件和接口名稱及事件方法表7_212適配器名稱辛運(yùn)幃p117表8_2,.,AWT將事件分為兩類:語義(Semantic)事件ActionEvent:對應(yīng)按鈕點(diǎn)擊、菜單選擇、列表框選擇、在文本域中按回車鍵等。AdjustmentEvent:用戶調(diào)整滾動條。ItemEvent:用戶從一組選擇框或者列表項(xiàng)中進(jìn)行選擇。TextEvent:文本域或者文本框中的內(nèi)容發(fā)生改變。低級(Low-Level)事件ComponentEvent:組件大小改變、移動、顯示或者隱藏。KeyEvent:鍵盤上的一個鍵被按下或者釋放。MouseEvent:鼠標(biāo)按鍵被按下、釋放、鼠標(biāo)移動或者拖動。FocusEvent:組件獲得焦點(diǎn)或者失去焦點(diǎn)。WindowEvent:窗口被激活、屏蔽、最小化、最大化或關(guān)閉。ContainerEvent:添加或者刪除一個組件。,.,1、通過Jbuilder自動產(chǎn)生事件響應(yīng):Jbuilder直接操作它的原理是:建立一個實(shí)現(xiàn)actionListener的類AclassFrame1_jButton1_actionAdapterimplementsActionListenerpublicvoidactionPerformed(ActionEvente)Frame1.jLabel1.setText(Button);在另外一個建立界面的類B建立按鈕jButton1.addActionListener(newFrame1_jButton1_actionAdapter();將按鈕增加到Jpanel或其他容器中給按鈕注冊A.2、通過直接實(shí)現(xiàn)接口的方法來響應(yīng)事件建立一個界面的類B同時實(shí)現(xiàn)接口建立按鈕將按鈕增加到Jpanel或其他容器中給按鈕注冊B本身this.jButton1.addActionListener(this);,.,classFrame1_extendsJFrameimplementsActionListener建立一個容器JButtonb=newJbutton(“B”);建立一個JLabel將按鈕JLabel增加到容器b.addActionLisener(this);publicvoidactionPerformed(ActionEvente)jLabel1.setText(Button);3、使用匿名的Adapter類importjava.awt.*;importjava.awt.event.*;classLabel1extendsFrame()publicLabel1()super(“EventExample.”);addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););,.,我們可以通過以下方法來注冊監(jiān)聽器對象:eventSourceObject.addEventListener(eventListenerObject);以按鈕類為例:MyActionListenerlistener=.;JButtonbutton=newJButton(”提交”);button.addActionListener(listener);監(jiān)聽器對象listener所屬的類MyActionListener必須實(shí)現(xiàn)相應(yīng)的接口,以響應(yīng)事件:publicclassMyActionListenerimplementsActionListener.publicvoidactionPerformed(ActionEventevent)/相應(yīng)的響應(yīng)操作,.,Java中事件處理的方法:1、使用匿名的Adapter類importjava.awt.*;importjava.awt.event.*;classLabel1extendsFrame()PublicLabel1()super(“EventExample.”);addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););2、實(shí)現(xiàn)ActionListener接口7_15Buttonclick,.,7.3.2處理按鈕點(diǎn)擊事件,創(chuàng)建按鈕:JButtonMyButton=newJButton(“Java”);通過Container類的Add方法,將組件加入到該容器中。classMyPanelextendsJPanelpublicMyPanel()JButtonMyButton=newJButton(“Java”);add(MyButton);為按鈕設(shè)置監(jiān)聽器。指定的監(jiān)聽器必須實(shí)現(xiàn)ActionListener接口的actionPerformed方法:publicvoidactionPerformed(ActionEventevent),.,【例7.9】點(diǎn)擊按鈕7_15Buttonclick采用內(nèi)部類ButtonAction充當(dāng)事件監(jiān)聽器。在面板中放置兩個按鈕,當(dāng)用戶點(diǎn)擊其中一個按鈕時,面板中顯示對應(yīng)的操作。例如,如果點(diǎn)擊“按鈕一”,顯示“您點(diǎn)擊的是:按鈕一”。程序代碼見ButtonClick.java。運(yùn)行結(jié)果如下:,.,7.3.3捕獲窗口事件,JFrame對象是窗口事件(WindowEvent)的事件源,我們要指定一個監(jiān)聽器對象:MyWindowListenerlistener=.;frame.addWindowListener(listener);監(jiān)聽器對象要實(shí)現(xiàn)WindowListener接口。WindowListener接口中共有七個方法,它們分別對應(yīng)七個窗口事件:publicinterfaceWindowListenervoidwindowOpened(WindowEvente);voidwindowClosing(WindowEvente);voidwindowClosed(WindowEvente);voidwindowIconified(WindowEvente);voidwindowDeiconified(WindowEvente);voidwindowActivated(WindowEvente);voidwindowDeactivated(WindowEvente);,.,WindowListener接口實(shí)現(xiàn)方法一:定義一個類來實(shí)現(xiàn)WindowListener接口,在感興趣的方法中添加我們需要的代碼,然后讓其他方法為空即可。classQuitWindowimplementsWindowListenerpublicvoidwindowClosing(WindowEvente)System.exit(0);voidwindowOpened(WindowEvente)voidwindowClosed(WindowEvente)voidwindowIconified(WindowEvente)voidwindowDeiconified(WindowEvente)voidwindowActivated(WindowEvente)voidwindowDeactivated(WindowEvente),.,WindowListener接口實(shí)現(xiàn)方法二:Java為每個具有多個方法的AWT監(jiān)聽器接口提供了一個適配器類。適配器類實(shí)現(xiàn)了監(jiān)聽器接口的所有方法,但是卻不做任何實(shí)際工作。與WindowListener接口對應(yīng)的WindowAdapter類實(shí)現(xiàn)了以上七個空方法,我們只需要通過擴(kuò)展適配器類來實(shí)現(xiàn)我們感興趣的方法。classQuitWindowextendsWindowAdapterpublicvoidwindowClosing(WindowEvente)System.exit(0);【例7.11】捕獲窗口事件捕獲窗口的關(guān)閉事件。程序代碼見WindowClosing.java。,.,7.3.5焦點(diǎn)事件,如果某個組件能夠接收用戶按鍵,那么該組件就擁有焦點(diǎn)。擁有焦點(diǎn)的組件在顯示形式上與其他組件有一些差別:文本域內(nèi)會顯示光標(biāo);按鈕四周會顯示一個由虛線組成的矩形框。可以捕獲丟失的焦點(diǎn)事件來進(jìn)行輸入的合法性檢查。如果輸入不合法,通過調(diào)用requestFocus方法把焦點(diǎn)重新移回到該文本域,提示用戶重新輸入:publicvoidfocusLost(FocusEventevent)/passText為需要進(jìn)行合法性檢查的文本域if(event.getComponent()=passText,.,7.3.6鍵盤事件,KeyListener接口中有三個方法:publicvoidkeyPressed(KeyEvente)publicvoidkeyReleased(KeyEvente)publicvoidkeyTyped(KeyEvente)Java對于用戶按鍵的處理過程:當(dāng)前鍵盤狀態(tài)為小寫狀態(tài),要輸入一個大寫字母“A”,我們的操作過程為:先按住Shift鍵不放,再按下A鍵,然后松開。整個過程Java會產(chǎn)生五個事件:按下Shift鍵:為VK_SHIFT調(diào)用keyPressed方法;按下A鍵:為VK_A調(diào)用keyPressed方法;鍵入字符“A”:為字符“A”調(diào)用keyTyped方法;松開A鍵:為VK_A調(diào)用keyReleased方法;松開Shift鍵:為VK_SHIFT調(diào)用keyReleased方法。,.,【例7.12】捕獲鍵盤事件用戶每次按下鍵盤上的某個鍵,程序捕獲鍵盤輸入,并顯示在面板中,內(nèi)容包括:虛擬鍵碼、鍵的名稱和字符。例如:當(dāng)前鍵盤狀態(tài)為小寫狀態(tài),用戶按下“A”鍵,顯示的值依次為:65,A,a。程序代碼見KeyPress.java。運(yùn)行結(jié)果如下:,.,7.3.7鼠標(biāo)事件,MouseListener接口:mousePressed:鼠標(biāo)鍵被按下時調(diào)用;mouseReleased:鼠標(biāo)鍵被釋放時調(diào)用;mouseClicked:合并上述兩個事件為一次鼠標(biāo)點(diǎn)擊事件。這三個方法的參數(shù)是MouseEvent,通過getX和getY方法,能夠得到鼠標(biāo)點(diǎn)擊時的鼠標(biāo)指針的x和y坐標(biāo)。通過getClickCount方法,可以區(qū)別是單擊操作,還是雙擊操作。MouseMotionListener接口:mouseMoved:鼠標(biāo)移動;mouseDraged:用戶拖動鼠標(biāo)。鼠標(biāo)指針形狀的設(shè)置:setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);,.,【例7.13】利用鼠標(biāo)進(jìn)行繪圖點(diǎn)擊窗口中的空白處,得到一張“笑臉”的圖像;點(diǎn)擊已存在的圖像,圖像在“笑臉”和“哭臉”之間切換;用鼠標(biāo)可以對圖像進(jìn)行拖動操作;在窗口左上角,顯示當(dāng)前鼠標(biāo)光標(biāo)的位置。程序代碼見MouseDraw.java。運(yùn)行結(jié)果如下:,.,7.4Swing組件,7.4.1Swing組件的類繼承關(guān)系,.,7.4.2布局管理器直接操作JBuilder查看各種布局管理器增加組件時的變化。,在Java中,提供了布局工具以支持用戶界面元素的自動定位。容器中的所有組件都由一個布局管理器進(jìn)行動態(tài)管理。流布局管理器在一行上水平排列組件,直到該行沒有足夠的空間為止,然后另起一行繼續(xù)排列。當(dāng)用戶縮放容器時,布局管理器將進(jìn)行自動控制,重新排列。我們可以指定流布局管理器的組件排列方式,如居中(默認(rèn))、左對齊、右對齊等。如:setLayout(newFlowLayout(FlowLayout.LEFT);/左對齊setLayout(newFlowLayout(FlowLayout.RIGHT);/右對齊setLayout(newFlowLayout(FlowLayout.CENTER);/居中,.,邊界布局管理器邊界布局管理器的布局分為五個位置:CENTER、EAST、WEST、NORTH、SOUTH,我們可以把組件放在這五個位置的任意一個,如果未指定位置,則缺省的位置是CENTER。采用邊界管理器進(jìn)行布局時,四周的組件先被放置,剩余的空間由位于中間的組件占用;當(dāng)容器的大小改變時,四周組件的厚度不會被改變,而中間組件的大小需要改變。,.,【例7.14】流布局管理器示例(嵌套面板例題7_1(4layout)程序代碼見FlowLayoutTest.java。運(yùn)行結(jié)果如下:,javaFlowLayoutTest10,javaFlowLayoutTest15,.,【例7.15】邊界布局管理器示例將三個按鈕置于南區(qū),而兩個文本置于北區(qū)。程序代碼見BorderLayoutTest.java。運(yùn)行結(jié)果如下:,.,7.4.3文本組件,Java提供的文本組件:用于單行文本輸入的文本域(JTextField)和用于多行輸入的文本區(qū)(JTextArea)。獲得文本域的內(nèi)容add1=Integer.parseInt(originText.getText().trim();跟蹤文本域內(nèi)容的修改/新建文檔監(jiān)聽器DocumentListenerresultListener=newResultListener();./為第一個文本域安裝一個文檔監(jiān)聽器originText.getDocument().addDocumentListener(resultListener);當(dāng)文本發(fā)生改變后,下面三個方法之一會被調(diào)用:voidinsertUpdate(DocumentEvente)voidremoveUpdate(DocumentEvente)voidchangedUpdate(DocumentEvente),.,重新設(shè)置文本域的內(nèi)容resultText.setText(s);【例7.16】獲取兩個文本域的輸入并求和,然后顯示在第三個文本域中。程序代碼見TextFieldTest.java。運(yùn)行結(jié)果如下:,初始狀態(tài),改變輸入,.,密碼域JPassworkField特殊的文本域,在密碼域中輸入時,用戶的輸入并不會真正顯示出來,而是顯示回顯符,如“*”,以防止被他人看見用戶輸入的密碼?!纠?.17】將密碼域的輸入顯示在文本域中程序代碼見PasswordFieldTest.java。運(yùn)行結(jié)果如下:,.,文本區(qū)組件在一個文本區(qū)里,用戶可以輸入多行文本,多行文本之間的換行可以采用三種方式:1)手動換行。即輸入ENTER鍵,這將在文本中插入換行符“n”。2)通過設(shè)置換行屬性來避免手動換行,由文本區(qū)組件自動處理。textArea.setLineWrap(true);但是這樣的設(shè)置并沒有真正在文本中插入換行符“n”。3)給文本區(qū)增加滾動條,這可以通過把文本區(qū)插入到一個滾動窗格中來實(shí)現(xiàn)。這也是給其他組件添加滾動條的方法。JScrollPanescrollPane=newJScrollPane(textArea);,.,【例7.18】文本區(qū)的三種顯示方式程序代碼見TextAreaTest.java。運(yùn)行結(jié)果如下:,.,7.4.4標(biāo)簽,讓我們回頭看看前面的示例結(jié)果,我們必須記住組件的位置,否則無法分辨出各個組件。對于程序編制者,這還可以解決,但是對于一般用戶,就相當(dāng)困難了。因此,為了在運(yùn)行時能夠識別組件,我們需要標(biāo)簽組件。JLablelabel=newJLabel(“NoWrapArea”,JLabel.LEFT);通過上面的代碼我們建立了一個標(biāo)簽對象,其顯示的文本是“NoWrapArea”,對齊方式為左對齊。,.,7.4.5按鈕,為在按鈕上顯示相應(yīng)的信息,可以提供初始的文本和圖標(biāo)。loginButton=newJButton(登錄,newImageIcon(login.gif);當(dāng)希望按鈕對單擊動作有所反應(yīng)時,我們需要為按鈕注冊一個事件監(jiān)聽器,并且實(shí)現(xiàn)這個事件監(jiān)聽器,就可以完成所需要的按鈕功能。/注冊事件監(jiān)聽器loginButton.addActionListener(newLoginAction();/實(shí)現(xiàn)事件監(jiān)聽器privateclassLoginActionimplementsActionListener,.,【例7.19】密碼驗(yàn)證示例當(dāng)用戶輸入密碼后,按下“登錄”按鈕,然后我們將密碼輸入是否正確的結(jié)果顯示在文本域中。程序代碼見Login.java。運(yùn)行結(jié)果如下:,.,7.4.6Swing常用的選擇類組件,單選按鈕組件單選按鈕組件是一組互斥按鈕,即我們一次只能選擇其中的一個選項(xiàng),選項(xiàng)的選取只需要單擊即可。ButtonGroupgroup=newButtonGroup();JRadioButtonbutton1=newJRadioButton(“EAST”,true);.JRadioButtonbutton4=newJRadioButton(“NORTH”,false);為指定單選按鈕的初始選項(xiàng),我們在新建JRadioButton對象時,將其構(gòu)造器的第二個參數(shù)設(shè)置為“true”;同時,其他按鈕對象的第二個參數(shù)被設(shè)置為“false”。,.,【例7.20】單選按鈕組件示例通過選擇單選按鈕中的選項(xiàng)來設(shè)置標(biāo)簽組件的內(nèi)容,由標(biāo)簽組件顯示我們的選擇。程序代碼見RadioButtonExample.java。運(yùn)行結(jié)果如下:,.,復(fù)選框組件復(fù)選框組件可以進(jìn)行多重選擇,即我們能夠選擇其中的多個選項(xiàng),如果要取消或選取某選項(xiàng),可以單擊此選項(xiàng)。和單選按鈕不同,復(fù)選框允許用戶選擇多個選項(xiàng)。我們通過單擊復(fù)選框來選取該選項(xiàng),再單擊一下,則取消選取。建立復(fù)選框組件對象需要使用標(biāo)簽來表明該復(fù)選框的含義,標(biāo)簽在復(fù)選框構(gòu)造器里進(jìn)行設(shè)置;對復(fù)選框是否被選取可以通過isSelected方法進(jìn)行狀態(tài)判斷。boldCheck=newJCheckBox(“Bold”);/新建復(fù)選框。italicCheck=newJCheckBox(“Italic”);/新建復(fù)選框。boldCheck.isSelected();/判斷“mathCheck”復(fù)選框是否被選定。,.,【例7.21】復(fù)選框組件示例選擇字體風(fēng)格。程序代碼見CheckBoxExample.java。運(yùn)行結(jié)果如下:,.,列表框組件列表框組件允許用戶從一個列表中選擇一個或多個條目。用戶可以從列表框中選擇一個或多個條目。建立列表框前,需要指定所顯示的列表?xiàng)l目:Stringcourses=“Math”,“English”,“Physics”,“Chemic”,“Biology”,“Politics”;JListcourseList=newJList(courses);如果列表框比較長,而顯示屏幕比較小,可以設(shè)置列表中顯示的行數(shù),同時使用滾動條:courseList.setVisibleRowCount(4);JScrollPanelistScrollPane=newJScrollPane(courseList);選擇列表框中的多個條目有兩種方式:連續(xù)條目選擇和間斷條目選擇。,.,用戶選擇列表框條目時,列表框就會產(chǎn)生選擇事件。將列表選擇監(jiān)聽器ListSelectionListener添加給列表組件,并在該監(jiān)聽器中實(shí)現(xiàn)valueChanged方法:courseList.addListSelectionListener(newcourseListener();.privateclasscourseListenerimplementsListSelectionListenerpublicvoidvalueChanged(ListSelectionEventevent).獲得用戶所選擇的列表框條目以及條目所在的索引號需要使用getSelectedValues方法和getSelectedIndices方法:ObjectselectedCourses=courseList.getSelectedValues();intselectedIndexCourses=courseList.getSelectedIndices();,.,【例7.22】列表框組件示例在給定的科目中選擇多門課程。程序代碼見ListExample.java。運(yùn)行結(jié)果如下:,.,組合框組件組合框?qū)⒕庉嬁蚝拖吕斜砜蚪Y(jié)合起來,使得用戶可以在一組預(yù)定義的選項(xiàng)中選擇一個條目,而且能夠修改選項(xiàng)內(nèi)容。新建一個有內(nèi)容的組合框既可以象列表框那樣指定數(shù)組,也可以采用向組合框?qū)ο罄锛尤霔l目的方法。對組合框是否能夠被編輯也可以進(jìn)行設(shè)置。/新建組合框。jobsBox=newJComboBox();jobsBox.setEditable(true);/設(shè)置組合框是否能夠被編輯。jobsBox.addItem(job1);jobsBox.addItem(job2);,.,組合框的內(nèi)容是可以動態(tài)變化的:addItem方法能夠把條目添加到列表的末尾;insertItermAt方法將把新條目添加到列表的任何位置;removeItem方法和removeItemAt方法將能夠刪除指定條目;removeAllItems方法將刪除所有條目:jobsBox.insertItermAt(“job7”,6);/在第7個位置增加“job7”條目。jobsBox.removeItem(“job7”);/刪除“job7”條目。jobsBox.removeItemAt(5);/刪除第6個條目,即“job6”。jobsBox.removeAllItems();/刪除所有條目。,.,當(dāng)選擇一個條目時,組合框就產(chǎn)生一個事件,對事件的監(jiān)聽需要添加事件監(jiān)聽器,并實(shí)現(xiàn)actionPerformed方法:/增加事件監(jiān)聽器。jobsBox.addActionListener(newjobsListener();.privateclassjobsListenerimplementsActionListenerpublicvoidactionPerformed(ActionEventevent).當(dāng)組合框的選擇事件發(fā)生時,可以通過getSelectedItem方法來獲取當(dāng)前被選擇的條目:ObjectselectedJob=jobsBox.getSelectedItem();,.,【例7.23】組合框組件示例應(yīng)用組合框來進(jìn)行選擇職業(yè)。程序代碼見ComboBoxExample.java。運(yùn)行結(jié)果如下:,.,滑塊組件滑塊組件一般有一個連續(xù)區(qū)間和可拖動的滑塊,用戶可以通過拖動滑塊在一個區(qū)間范圍里進(jìn)行選擇。JSliderageSlider=newJSlider();ageSlider=newJSlider(SwingConstants.VERTICAL,0,120,20);當(dāng)滑塊被拖動時,滑塊的值將發(fā)生變化,觸發(fā)ChangeEvent事件?;瑝K組件的事件監(jiān)聽器要實(shí)現(xiàn)ChangeListener接口,并實(shí)現(xiàn)此接口中的stateChanged方法:AgeListenermyAgeListener=newAgeListener();ageSlider.addChangeListener(myAgeListener);privateclassAgeListenerimplementsChangeListenerpublicvoidstateChanged(ChangeEventevent).滑塊值發(fā)生變化時,使用getValue方法來獲得滑塊值:myTextField.setText(+sourceSlider.getValue();,.,【例7.24】滑塊組件示例在進(jìn)行年齡輸入時,使用滑塊進(jìn)行直觀的選擇。程序代碼見SliderExample.java。運(yùn)行結(jié)果如下:,.,7.4.7邊界,當(dāng)界面中的組件比較多時,需要從視覺上將組件分隔。通用的辦法是為面板設(shè)置邊界,并將需要分隔的組件添加到該面板中??蛇x的邊界風(fēng)格包括:低斜面、凸斜面、蝕刻、直線、不光滑、空。創(chuàng)建邊界需要調(diào)用BorderFactory的靜態(tài)方法。當(dāng)需要給邊界增加標(biāo)題以提示時,可以使用BorderFactory的createTitledBorder方法:/初始化帶標(biāo)題的空邊界。Borderborder=BorderFactory.createEmptyBorder();Bordertitled=BorderFactory.createTitledBorder(border,Bordertypes);當(dāng)創(chuàng)建好需要的邊界后,就可以把邊界對象添加到組件中:buttonPanel.setBorder(titled);,.,【例7.25】邊界示例各種邊界的不同效果。程序代碼見BorderExample.java。運(yùn)行結(jié)果如下:,.,7.4.8菜單以及彈出式菜單,典型的菜單:,.,創(chuàng)建菜單四個步驟:創(chuàng)建菜單欄、創(chuàng)建菜單以及子菜單、創(chuàng)建菜單項(xiàng),并將菜單項(xiàng)加入到子菜單或菜單中,將子菜單加入到菜單中,將菜單加入到菜單欄中。/(a)創(chuàng)建菜單欄,并將菜單欄加入到框架中。JMenuBarmenuBar=newJMenuBar();setJMenuBar(menuBar);/(b)創(chuàng)建“File”菜單、“Edit”菜單和“View”菜單。JMenufileMenu=newJMenu(File);JMenueditMenu=newJMenu(Edit);JMenuviewMenu=newJMenu(View);/(b)創(chuàng)建子菜單。JMenuoptionMenu=newJMenu(Option);,.,/(c)通過Action對象新建“New”菜單項(xiàng),并添加事件監(jiān)聽器。newItem=fileMenu.add(newShowAction(New);/(c)通過指定菜單項(xiàng)對象新建“Paste”菜單項(xiàng)。pasteItem=newJMenuItem(Paste,P);/(d)將菜單項(xiàng)加入到子菜單或菜單中,將子菜單加入到菜單中,將菜單加入到菜單欄中。fileMenu.add(newItem);editMenu.add(pasteItem);viewMenu.add(optionMenu);menuBar.add(fileMenu);menuBar.add(editMenu);menuBar.add(viewMenu);,.,創(chuàng)建復(fù)選框和單選按鈕菜單項(xiàng)和創(chuàng)建一般的菜單項(xiàng)幾乎一樣,只需要注意一下復(fù)選框和單選按鈕的不同構(gòu)造函數(shù)以及單選按鈕組的構(gòu)建:/創(chuàng)建單選按鈕菜單項(xiàng)“Forward”,并將“Forward”菜單項(xiàng)加入到“Search”菜單中。ButtonGroupgroup=newButtonGroup();forwardItem=newJRadioButtonMenuItem(Forward);group.add(forwardItem);

溫馨提示

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

評論

0/150

提交評論