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

下載本文檔

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

文檔簡(jiǎn)介

圖形用戶界面第一頁(yè),共六十一頁(yè),編輯于2023年,星期五6.1GUI編程基礎(chǔ)圖形用戶界面(GUI)使用戶可以和程序進(jìn)行可視化交互。無論是程序的設(shè)計(jì)者還是使用者都可以通過圖形用戶界面明顯“看到”和“感覺”到程序的存在。圖形用戶界面為不同的應(yīng)用程序提供了感覺上一致的用戶界面組件,這樣使用戶在記住執(zhí)行功能的復(fù)雜命令上花費(fèi)較少的時(shí)間,而花更多的時(shí)間通過有效的方式來使用程序。一個(gè)設(shè)計(jì)良好的軟件通常包括業(yè)務(wù)層的邏輯設(shè)計(jì)和表現(xiàn)層的用戶界面設(shè)計(jì)兩大部分。因此,好的用戶界面設(shè)計(jì)對(duì)一個(gè)系統(tǒng)的成功是至關(guān)重要的。一個(gè)使用起來困難的界面,輕者會(huì)造成用戶操作不便;重者引起用戶反感,不管系統(tǒng)的功能如何而拒絕使用該軟件系統(tǒng)。如果信息的表達(dá)方式是混亂的或是容易誤解的,那么用戶可能會(huì)誤解信息的涵義。他們進(jìn)行的一系列操作就有可能破壞數(shù)據(jù),甚至導(dǎo)致災(zāi)難性的系統(tǒng)失敗。第二頁(yè),共六十一頁(yè),編輯于2023年,星期五6.1.1圖形用戶界面計(jì)算機(jī)操作界面的發(fā)展從單調(diào)的命令行形式到圖形化窗口形式,逐步形成了現(xiàn)在計(jì)算機(jī)用戶認(rèn)可的圖形用戶界面主要特征,主要集中在窗口、圖標(biāo)、菜單、指點(diǎn)、圖形等方面。用戶界面設(shè)計(jì)的一般性原則包括:用戶熟悉、一致性、意外最小化、可恢復(fù)性、用戶指南、用戶差異性等。圖形用戶界面包含了許多獨(dú)立的顯示元素,供用戶交互。它們由程序中的GUI組件組成。GUI組件是用戶通過鍵盤或鼠標(biāo)進(jìn)行交互的對(duì)象,菜單、按鈕、文本域、標(biāo)簽和下拉列表框等GUI組件是圖形用戶界面的常用部分。第三頁(yè),共六十一頁(yè),編輯于2023年,星期五AWT和Swing1.AWT AWT(AbstractWindowToolkit)是一個(gè)獨(dú)立平臺(tái)的窗口工具組件集,它依賴于對(duì)等組件(Peer),而對(duì)等組件是一個(gè)本地GUI組件,由AWT類管理。AWT的作用是給用戶提供基本的界面組件,如按鈕、列表框、菜單等。

AWT最初只包括與本地對(duì)等組件相關(guān)聯(lián)的組件,稱為重量組件(HeavyweightComponent),這些組件在它們自己的本地不透明窗口中繪制,在改變其默認(rèn)行為時(shí),不可以為其擴(kuò)展子類,此外,它們必須是矩形的,且不能有透明背景。第四頁(yè),共六十一頁(yè),編輯于2023年,星期五2.SwingSwing是建立在AWT基礎(chǔ)之上的,它利用了AWT的底層組件,包括圖形、顏色、字體、工具包和布局管理器等。使用AWT最好的部分來建立一個(gè)新的輕量組件集,而丟棄了AWT中有問題的重量組件部分。 通過引入新特性和豐富的功能,Swing提供了比AWT更全面的組件集合。SwingAPI是圍繞實(shí)現(xiàn)AWT各個(gè)部分的API構(gòu)建的,這保證了所有早期的AWT組件仍然可以使用。第五頁(yè),共六十一頁(yè),編輯于2023年,星期五11.2常用組件(AWT)java.awt中的各個(gè)類

java.lang.ObjectColor顏色Font字體Component組件BorderLayout,FlowLayoutCardLayout,GridBagLayout布局類CheckboxGroup復(fù)選框組Image圖象AWTEvent事件MenuComponent菜單組件Graphics圖形第六頁(yè),共六十一頁(yè),編輯于2023年,星期五圖形組件類的繼承關(guān)系ObjectComponentButtonCanvasChoiceCheckboxLabelListScrollbarTextComponentContainerWindowPaneScrollPaneDialogFileDialogFrameTextAreaTextField第七頁(yè),共六十一頁(yè),編輯于2023年,星期五6.1.2Swing和ATWJava類庫(kù)中的ATW和Swing包提供了大量的可視化組件,AWT組件是建立在對(duì)等模型的基礎(chǔ)上的重量級(jí)組件;而Swing組件則是用純Java編寫的輕量級(jí)組件。Swing帶來了以下優(yōu)勢(shì):更豐富、更方便的用戶界面元素集。對(duì)底層平臺(tái)的依賴更少,因此和平臺(tái)有關(guān)的bug也少得多。給不同平臺(tái)上的用戶一致的感覺。AWT與Swing的結(jié)構(gòu)關(guān)系以及Swing的組件關(guān)系第八頁(yè),共六十一頁(yè),編輯于2023年,星期五6.1.3窗體容器窗體(也叫Windows)是顯示在用戶終端桌面上的圖形元素。窗體可以充當(dāng)各種組件和控件的一個(gè)容器。Java中的窗體類容器可能是一個(gè)對(duì)話框(Dialog)、框架(Frame)或者是一個(gè)面板(Panel)等。Java中的主要窗體類容器如下:JApplet通過啟用Java的Web瀏覽器或其他Apple查看器運(yùn)行的程序。JDialog匯集用戶輸入的模式或無模式窗口。JFrame頂層應(yīng)用程序窗口。JPanel容納部分界面的小型容器。反過來,該容器又可用于其他任何容器中,如JFrame、JPanel、JApplet或JDialog組件。AWT窗體基于AWT的可視窗體。AWT窗體包括Applet、對(duì)話框、框架和面板。AWT與Swing的結(jié)構(gòu)關(guān)系以及Swing的組件關(guān)系第九頁(yè),共六十一頁(yè),編輯于2023年,星期五6.1.3窗體容器框架(JFrame)是—種常用的頂層容器。框架的內(nèi)部結(jié)構(gòu)比較復(fù)雜,它可以劃分為4種窗格:根窗格(RootPane)、布局窗格(LayeredPane)、內(nèi)容窗格(ContentPane)和玻璃窗格(GlassPane)。對(duì)JFrame添加組件有兩種方式:1、用getContentPane方法獲得JFrame的內(nèi)容窗格,再對(duì)其加入組件;2、建立一個(gè)JPanel之類的中間容器,把組件添加到容器中,用setContentPane方法把該容器置為JFrame的內(nèi)容窗格。面板(JPanel)有一個(gè)能夠在上面進(jìn)行繪制的表面,而且其本身也是容器。因此,它除了可以繪制圖形、文字,還能容納按鈕、滑動(dòng)條等其他用戶界面元素。TitleJFrameMenuRootPaneLayeredPaneContentPaneClassPaneMenuBar1、用getContentPane方法獲得JFrame的內(nèi)容窗格,再對(duì)其加入組件:frame.getContentPane().add(childComponent);2、建立一個(gè)JPanel之類的中間容器,把組件添加到容器中,用setContentPane方法把該容器置為JFrame的內(nèi)容窗格:JPanelcontentPane=newJPanel();……//把其它組件添加到JPanel中;frame.setContentPane(contentPane);//把contentPane對(duì)象設(shè)置成為frame的內(nèi)容窗格第十頁(yè),共六十一頁(yè),編輯于2023年,星期五創(chuàng)建一個(gè)簡(jiǎn)單的JFrame主窗體importjavax.swing.*;importjava.awt.*;publicclassSimpleFrameextendsJFrame{

publicSimpleFrame(intwidth,intheight){setSize(width,height);setTitle("Frame主窗體");Toolkitkit=Toolkit.getDefaultToolkit();DimensionscreenSize=kit.getScreenSize();//獲取當(dāng)前屏幕的尺寸

intx=(screenSize.width-width)/2;inty=(screenSize.height-height)/2;setLocation(x,y);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicstaticvoidmain(Stringargs[]){SimpleFrameframe=newSimpleFrame(400,300);frame.setVisible(true);}}第十一頁(yè),共六十一頁(yè),編輯于2023年,星期五為了在面板中繪制文字,我們需要定義一個(gè)擴(kuò)展JPanel的新派生類,并覆蓋paintComponent方法。paintComponent方法實(shí)際上定義在JComponent中,這個(gè)類是所有非窗口swing組件的基類。該方法有一個(gè)Graphics類型的參數(shù)。Graphics對(duì)象存儲(chǔ)了一個(gè)用于繪制圖形和文本的設(shè)計(jì)集合,包括字體和顏色等。JAVA中的所有繪制都必須使用Graphics對(duì)象。它擁有繪制圖案,圖象和文本的方法。不管什么原因?qū)е麓翱谛枰匦吕L制,事件處理器都會(huì)通知組件。它會(huì)引起所有組件的paintComponent方法執(zhí)行。這就是說,該方法會(huì)自動(dòng)調(diào)用,我們不必干涉這個(gè)自動(dòng)過程。導(dǎo)致窗口重新繪制,引發(fā)paintComponent方法的原因很多,例如:用戶縮放窗口,窗口被遮蓋,窗口重新顯示等第十二頁(yè),共六十一頁(yè),編輯于2023年,星期五

如何向面板添加內(nèi)容并置于框架中importjava.awt.*;importjava.io.*;importjavax.swing.*;importjavax.imageio.*;import.*;publicclassPanelFrameextendsSimpleFrame{/**CreatesanewinstanceofPanelFrame*/publicPanelFrame(intwidth,intheight){super(width,height);}publicstaticvoidmain(Stringargs[]){

PanelFrameframe=newPanelFrame(300,200);ContentPanelcontentPanel=newContentPanel();//把其它組件添加到面板中;contentPanel.add(newJButton("OK"));frame.setContentPane(contentPanel);frame.setVisible(true);}}classContentPanelextendsJPanel{//在面板中繪制圖文;publicvoidpaintComponent(Graphicsg){super.paintComponent(g);g.drawOval(120,60,150,70);//繪制一個(gè)橢圓

try{g.drawString("這是一個(gè)面板!",160,100);//繪制一行文字

Imageimage=ImageIO.read(newURL(urlname));g.drawImage(image,30,30,null);//繪制一幅圖片

}catch(IOExceptione){g.drawString("加載圖形失敗!",100,100);}}Stringurlname="/HTML/IMAGE/stamp_yi.JPG";}第十三頁(yè),共六十一頁(yè),編輯于2023年,星期五

java.awt.Window是AWT窗口組件中最基本的組件,它實(shí)際上是Frame與Dialog組件的超類。窗口組件沒有邊界、標(biāo)題欄與菜單欄,而且大小不可以調(diào)整。常用窗口實(shí)現(xiàn)的界面包括:產(chǎn)品信息的封面(如Outlook等軟件啟動(dòng)時(shí),顯示在屏幕中間且?guī)酌牒笞詣?dòng)消失的封面窗口),提示幫助信息(如使用金山詞霸等軟件時(shí),移動(dòng)鼠標(biāo)到某個(gè)英文單詞上時(shí)自動(dòng)彈出的解釋信息)等。

AWT窗體組件第十四頁(yè),共六十一頁(yè),編輯于2023年,星期五例FrameDemo.javaimportjava.awt.*;publicclassSplashDemoextendsFrame{Windowwindow; publicstaticvoidmain(String[]args) {SplashDemoframe=newSplashDemo(); } publicSplashDemo() { window=newWindow(this);下面我們通過一個(gè)例子來學(xué)習(xí)如何使用窗口類:第十五頁(yè),共六十一頁(yè),編輯于2023年,星期五

DimensionscmSize=Toolkit.getDefaultToolkit().getScreenSize(); intwidth=300; intheight=200; window.setLocation(scmSize.width/2-(width/2),scmSize.height/2-(height/2)); window.setSize(width,height); window.show(); 續(xù)1第十六頁(yè),共六十一頁(yè),編輯于2023年,星期五window.toFront(); try{Thread.currentThread().sleep(3000);} catch(Exceptione){e.printStackTrace();} window.dispose(); System.exit(0);}}

這是個(gè)使用Window的窗口在屏幕上顯示一個(gè)矩形窗口類的實(shí)例,這個(gè)窗口沒有邊界、標(biāo)題欄與菜單欄,在屏幕上停留3秒后自動(dòng)消失。如果在窗口中加載一幅圖片,則能實(shí)現(xiàn)一個(gè)類似Outlook的封面窗口(在窗口中加載圖片的方法我們將在第9章中學(xué)習(xí))。續(xù)2第十七頁(yè),共六十一頁(yè),編輯于2023年,星期五程序中用到了工具類的方法Toolkit.getDefaultToolkit().getScreenSize()。Toolkit類是一個(gè)包含許多有用的本地工具方法的類。getScreenSize()方法的作用是取得顯示器的像素尺寸。程序的運(yùn)行結(jié)果如圖所示。續(xù)3第十八頁(yè),共六十一頁(yè),編輯于2023年,星期五續(xù)4第十九頁(yè),共六十一頁(yè),編輯于2023年,星期五

java.awt.Frame是Window的一個(gè)子類,它是帶有標(biāo)題欄和邊界的窗口,而且允許調(diào)整大小。另外,用戶還可以為框架附加一個(gè)菜單欄。用戶在程序設(shè)計(jì)過程中,當(dāng)程序窗口需要圖表化或者需要包含菜單欄時(shí),則可以選擇使用框架組件。構(gòu)造一個(gè)框架后,可以用add()方法來給框架添加組件??蚣艿娜笔〔季止芾砥鲗傩允荁orderLayout。可以用setLayout()方式來改變布局管理器屬性。框架(Frame)第二十頁(yè),共六十一頁(yè),編輯于2023年,星期五

框架類中的Frame(String)構(gòu)造方法創(chuàng)建一個(gè)由String規(guī)定標(biāo)題的新的不可見的框架對(duì)象。例FrameDemo.javaimportjava.awt.*;publicclassFrameDemoextendsFrame{ publicFrameDemo(Stringtitle) {super(title);} publicstaticvoidmain(Stringagrs[]){ FrameDemoframe=newFrameDemo("DemoFrame");續(xù)1第二十一頁(yè),共六十一頁(yè),編輯于2023年,星期五

frame.setLocation(100,100); frame.setSize(500,200); frame.setVisible(true); }}

程序的運(yùn)行結(jié)果如圖所示,它是一個(gè)具有標(biāo)題、大小及背景顏色的框架。續(xù)2第二十二頁(yè),共六十一頁(yè),編輯于2023年,星期五圖續(xù)3第二十三頁(yè),共六十一頁(yè),編輯于2023年,星期五

java.awt.Dialog也是Window的擴(kuò)展類。與框架相同的是,對(duì)話框也擁有邊界與標(biāo)題欄,而且也可以調(diào)整大??;而與框架不同的是,對(duì)話框不支持附加菜單欄,而且對(duì)話框可以模式化屬性設(shè)置,這是窗口和框架都不允許的。因此,如果用戶在程序設(shè)計(jì)過程中需要?jiǎng)?chuàng)建一個(gè)臨時(shí)窗口與用戶交換信息時(shí),使用模式對(duì)話框是最方便的。另外,AWT中還提供了Dialog類的一個(gè)常用的擴(kuò)展類——FileDialog(文件對(duì)話框)。它可以為用戶選擇一個(gè)待打開或保存的文件。對(duì)話框(Dialog)第二十四頁(yè),共六十一頁(yè),編輯于2023年,星期五

可以說對(duì)話框是介于窗口和框架之間的,對(duì)話框和框架相比各有特色。我們來看一個(gè)典型的對(duì)話框的例子。例DialogDemo.javaimportjava.awt.*;publicclassDialogDemo{ publicstaticvoidmain(Stringagrs[]){ Frameframe=newFrame();續(xù)1第二十五頁(yè),共六十一頁(yè),編輯于2023年,星期五Dialogdialog=newDialog(frame,"DemoDialog",false); dialog.setLocation(100,100); dialog.setSize(500,100);dialog.setVisible(true); }}程序運(yùn)行結(jié)果如下圖所示。續(xù)2第二十六頁(yè),共六十一頁(yè),編輯于2023年,星期五續(xù)3第二十七頁(yè),共六十一頁(yè),編輯于2023年,星期五

文件對(duì)話框是文件選擇設(shè)備的一個(gè)實(shí)現(xiàn)。它有自己的自由窗口以及窗口元素,并且允許用戶瀏覽文件系統(tǒng),以及為以后的操作選擇一個(gè)特定的文件。例如:例FileDialogDemo.javaimportjava.awt.*;publicclassFileDialogDemo{ publicstaticvoidmain(String[]args) { FrameparentFrame=newFrame();續(xù)4第二十八頁(yè),共六十一頁(yè),編輯于2023年,星期五FileDialogd=newFileDialog(parentFrame,"FileDialog"); d.setVisible(true);//blockhereuntilOKselected Stringfname=d.getFile(); }}程序的運(yùn)行結(jié)果如下圖所示。

續(xù)5第二十九頁(yè),共六十一頁(yè),編輯于2023年,星期五圖8.5續(xù)6第三十頁(yè),共六十一頁(yè),編輯于2023年,星期五

通常情況下,并不需要處理FileDialog的事件。上例中,調(diào)用setVisible(true)將阻塞事件,直至用戶選擇OK,這時(shí),對(duì)話框會(huì)請(qǐng)求用戶選擇文件名,這個(gè)信息將作為一個(gè)String類型返回。續(xù)7第三十一頁(yè),共六十一頁(yè),編輯于2023年,星期五6.2圖形與繪圖 在Java中用于繪制文字、圖形、圖像的是Graphics類,并通過圖形組件的paintComponent方法實(shí)現(xiàn)繪制工作。我們通常把Graphics稱為與Swing組件關(guān)聯(lián)的圖形上下文(graphiccontext),因?yàn)樗烁鞣N繪圖的方法。Graphics是抽象類,不能直接創(chuàng)建Graphics對(duì)象,只能通過JPanel或JComponent的派生類得到一個(gè)Graphics對(duì)象。

第三十二頁(yè),共六十一頁(yè),編輯于2023年,星期五6.2.1坐標(biāo)系統(tǒng)圖形上下文使用一個(gè)簡(jiǎn)單的坐標(biāo)系統(tǒng),這個(gè)坐標(biāo)系統(tǒng)中的每個(gè)圖形元素(像素)用x和y的坐標(biāo)來表示。坐標(biāo)系統(tǒng)的原點(diǎn),其坐標(biāo)為(0,0),位于組件的左上角。x坐標(biāo)表示一個(gè)點(diǎn)與原點(diǎn)的水平距離,y坐標(biāo)表示一個(gè)點(diǎn)與原點(diǎn)的垂直距離。x坐標(biāo)從左到右增大,y坐標(biāo)從上到下增大

x軸y軸(x,y)(0,0)(1,0)(2,0)(0,1)(0,2)(1,1)width寬height高原點(diǎn)(坐標(biāo)單位:像素)第三十三頁(yè),共六十一頁(yè),編輯于2023年,星期五ColorredColor=newColor(255,0,0);//紅色ColorredColor=Color.RED;//紅色6.2.2顏色Java中有專門處理顏色的類Color。Java的顏色是根據(jù)RGB值來建立的。RGB值是用于指定紅色、綠色和藍(lán)色這3個(gè)分量的數(shù)字組合,三基色混合在一起形成了最終的顏色。Color對(duì)象可以由代表紅色、綠色和藍(lán)色的3個(gè)單獨(dú)的RGB值創(chuàng)建,RGB取值范圍為0到255之間的整數(shù)。

Color類還定義了一些標(biāo)準(zhǔn)的顏色,作為類常量使用。這些顏色可以用來直接定義新的Color對(duì)象

第三十四頁(yè),共六十一頁(yè),編輯于2023年,星期五6.2.3繪圖畫線drawLine(int

x1,int

y1,int

x2,int

y2)該方法將用當(dāng)前的顏色以(x1,y1)為起點(diǎn),(x2,y2)為終點(diǎn)畫一條直線。畫矩形voiddrawRect(intx,inty,intwidth,intheight)voidfillRect(intx,inty,intwidth,intheight)drawRect方法和fillRect方法分別可以用來繪制一個(gè)矩形的輪廓和一個(gè)被填充的矩形。矩形的左上角在(x,y),矩形的大小由參數(shù)width和height來確定畫橢圓和圓voiddrawOval(intx,inty,intwidth,intheight)voidfillOval(intx,inty,intwidth,intheight)用drawOval方法可以繪制一個(gè)橢圓。而用fillOval方法可以填充一個(gè)橢圓。橢圓被繪制在一個(gè)矩形范圍內(nèi),這個(gè)矩形的左上角是(x,y),而大小由參數(shù)width和height確定。繪制圓形時(shí),我們只需指定矩形為一個(gè)正方形。畫圓弧voiddrawArc(intx,inty,intwidth,intheight,intstartAngle,intsweepAngle)voidfillArc(intx,inty,intwidth,intheight,intstartAngle,intsweepAngle)圓弧被繪制在一個(gè)矩形范圍內(nèi),這個(gè)矩形的左上角是(x,y)點(diǎn),而大小由參數(shù)width和height確定。圓弧是以startAngle為開始的角度,sweepAngle為轉(zhuǎn)過的角度而繪制的。這些角是以度為單位的。畫多邊形voiddrawPolygon(intx[],inty[],intnumPoints)voidfillPolygon(intx[],inty[],intnumPoints)x軸y軸(x+d/4,y+d/2)(0,0)(x,y)widthheight原點(diǎn)(坐標(biāo)單位:像素)dd/2(x+d/2,y+d/4)(x,y+d/4)(x+d*3/4,y+d/2)importjavax.swing.*;importjava.awt.*;publicclassDaoextendsJFrame{publicDao(){setSize(width,height);//設(shè)置框架大小setTitle("道");//設(shè)置框架標(biāo)題//將框架顯示在屏幕正中Toolkitkit=Toolkit.getDefaultToolkit();DimensionscreenSize=kit.getScreenSize();intx=(screenSize.width-width)/2;inty=(screenSize.height-height)/2;setLocation(x,y);//設(shè)置框架位置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

publicstaticvoidmain(Stringargs[]){Daoframe=newDao();DrawPaneldrawPanel=newDrawPanel();//把其它組件添加到面板中;frame.setContentPane(drawPanel);frame.setVisible(true);}intwidth=400;intheight=300;}classDrawPanelextendsJPanel{publicDrawPanel(){setBackground(Color.GRAY);}//在面板中繪制太極圖形;publicvoidpaintComponent(Graphicsg){super.paintComponent(g);g.setColor(Color.BLACK);g.fillArc(x,y,d,d,0,180);g.setColor(Color.WHITE);g.fillArc(x,y,d,d,180,180);g.setColor(Color.BLACK);g.fillArc(x+d/2,y+d/4,d/2,d/2,180,180);g.setColor(Color.WHITE);g.fillArc(x,y+d/4,d/2,d/2,0,180);g.fillOval(x+d*3/4-5,y+d/2-5,10,10);g.setColor(Color.BLACK);g.fillOval(x+d/4-5,y+d/2-5,10,10);}

intx=100;inty=40;intd=200;}繪制太極圖的程序Dao.java第三十五頁(yè),共六十一頁(yè),編輯于2023年,星期五第三十六頁(yè),共六十一頁(yè),編輯于2023年,星期五6.3事件處理模型事件是由程序檢測(cè)到的行為和動(dòng)作。在一個(gè)應(yīng)用程序中,程序員通常無法預(yù)測(cè)用戶下一個(gè)將要執(zhí)行的動(dòng)作。用戶可能會(huì)選擇一個(gè)菜單項(xiàng),單擊一個(gè)按鈕或者文本框。為了解決這個(gè)問題,程序員可以編寫代碼來處理感興趣的事件,而不是編寫那些全都按照一定順序執(zhí)行的代碼。許多流行的應(yīng)用程序之所以稱為是事件驅(qū)動(dòng)的,是因?yàn)樗鼈兪菫轫憫?yīng)事件而設(shè)計(jì)的。第三十七頁(yè),共六十一頁(yè),編輯于2023年,星期五6.3.1事件和Java事件模型圖形用戶界面是事件驅(qū)動(dòng)的。事件是由程序檢測(cè)到的行為和動(dòng)作。導(dǎo)致該事件發(fā)生的對(duì)象稱為事件源。事件處理程序是處理事件和執(zhí)行任務(wù)的方法,它與所觸發(fā)的事件關(guān)聯(lián)。Java事件處理模型一般包括用戶事件和系統(tǒng)事件。Java事件模型是一種“源-監(jiān)聽器”模型。事件監(jiān)聽器是一個(gè)實(shí)現(xiàn)了專門的監(jiān)聽器接口的對(duì)象,而事件源是一個(gè)能注冊(cè)監(jiān)聽器,并向他們發(fā)送事件的對(duì)象。當(dāng)事件源產(chǎn)生某個(gè)事件時(shí),它會(huì)向注冊(cè)在那個(gè)事件上的所有監(jiān)聽器發(fā)送事件通知,以便執(zhí)行相應(yīng)的事件處理程序。第三十八頁(yè),共六十一頁(yè),編輯于2023年,星期五6.3.2事件處理實(shí)例分析一個(gè)Java事件處理模型的具體步驟如下:創(chuàng)建事件監(jiān)聽器注冊(cè)事件監(jiān)聽器創(chuàng)建事件對(duì)象通知事件發(fā)生執(zhí)行事件處理程序panel:ColorPanelActionEventColorActionListenercolorButtonactionPerformed()setColor()12addActionListener()345容器事件源監(jiān)聽器privateclassColorActionListenerimplementsActionListener{publicvoidactionPerformed(ActionEventevent){setColor();}}……colorButton.addActionListener(newColorActionListener());第三十九頁(yè),共六十一頁(yè),編輯于2023年,星期五引入事件處理機(jī)制后的編程基本方法如下:①對(duì)java.awt中組件實(shí)現(xiàn)事件處理必須使用java.awt.event包,所以在程序開始應(yīng)加入importjava.awt.event.*語(yǔ)句。②用如下語(yǔ)句設(shè)置事件監(jiān)聽者:事件源.addXXListener(XXListener代表某種事件監(jiān)聽者)。③事件監(jiān)聽者所對(duì)應(yīng)的類實(shí)現(xiàn)事件所對(duì)應(yīng)的接口XXListener,并重寫接口中的全部方法。這樣就可以處理圖形用戶界面中的對(duì)應(yīng)事件了。要?jiǎng)h除事件監(jiān)聽者可以使用語(yǔ)句:事件源.removeXXListener;第四十頁(yè),共六十一頁(yè),編輯于2023年,星期五事件處理實(shí)例分析簡(jiǎn)單的GUI應(yīng)用程序ButtonFrame第四十一頁(yè),共六十一頁(yè),編輯于2023年,星期五importjava.awt.*;importjava.io.PrintStream;importjava.awt.event.*;importjavax.swing.*;publicclassButtonFrameextendsSimpleFrame{publicButtonFrame(intwidth,intheight){super(width,height);setTitle("演示按鈕事件");ColorPanelpanel=newColorPanel();ContainercontentPane=getContentPane();contentPane.add(panel);}

publicstaticvoidmain(String[]args){//設(shè)置程序觀感

try{UIManager.setLookAndFeel(windows);}catch(Exceptione){System.err.println("程序異常:"+e.getMessage());}ButtonFrameframe=newButtonFrame(400,300);frame.setVisible(true);}//可用于Windows平臺(tái)的觀感常量

privatestaticfinalStringmetal="javax.swing.plaf.metal.MetalLookAndFeel";privatestaticfinalStringmotif="com.sun.java.swing.plaf.motif.MotifLookAndFeel";privatestaticfinalStringwindows="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

}第四十二頁(yè),共六十一頁(yè),編輯于2023年,星期五classColorPanelextendsJPanel{publicColorPanel(){//創(chuàng)建組件

colorButton=newJButton("隨機(jī)顏色");darkerButton=newJButton("顏色變暗");brighterButton=newJButton("顏色變亮");colorText=newJTextArea(10,30);//添加組件

add(newJScrollPane(colorText));add(colorButton);add(darkerButton);add(brighterButton);//注冊(cè)組件監(jiān)聽事件

colorButton.addActionListener(newColorActionListener());brighterButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){setBrighter();}});

darkerButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){setDarker();}});}

privatevoidsetBrighter(){backgroundColor=backgroundColor.brighter();changeColor();}

privatevoidsetDarker(){backgroundColor=backgroundColor.darker();changeColor();}

privateclassColorActionListenerimplementsActionListener{publicvoidactionPerformed(ActionEventevent){setColor();//設(shè)置面板顏色

}}

privatevoidchangeColor(){intr=backgroundColor.getRed();intg=backgroundColor.getGreen();intb=backgroundColor.getBlue();colorText.append("顏色值:\tR="+r+"\tG="+g+"\tB="+b+"\n");setBackground(backgroundColor);}

privatevoidsetColor(){//產(chǎn)生隨機(jī)顏色

intr=(int)(Math.random()*255);intg=(int)(Math.random()*255);intb=(int)(Math.random()*255);colorText.append("顏色值:\tR="+r+"\tG="+g+"\tB="+b+"\n");backgroundColor=newColor(r,g,b);setBackground(backgroundColor);}

privateColorbackgroundColor;privateJButtoncolorButton;privateJButtondarkerButton;privateJButtonbrighterButton;privateJTextAreacolorText;}第四十三頁(yè),共六十一頁(yè),編輯于2023年,星期五例按鈕單擊事件的處理方法。importjava.awt.*;importjava.applet.*;importjava.awt.event.*;publicclassActionListenerDemoextendsAppletimplementsActionListener{ Buttonb=newButton("PressMe"); publicvoidinit(){ add(b); //設(shè)置按鈕b的監(jiān)聽者

b.addActionListener(this); } //實(shí)現(xiàn)ActionListener接口所定義的方法actionPerformed publicvoidactionPerformed(ActionEvente){ showStatus("ButtonClicked"); }}

Java事件處理概述__例第四十四頁(yè),共六十一頁(yè),編輯于2023年,星期五

Java事件處理概述__例運(yùn)行結(jié)果

第四十五頁(yè),共六十一頁(yè),編輯于2023年,星期五

Java常用事件__列表第四十六頁(yè),共六十一頁(yè),編輯于2023年,星期五例選擇事件的處理。importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*; publicclassItemListenerDemoextendsAppletimplementsItemListener{ TextAreata=newTextArea(6,30); String[]city={"北京","上海","天津","濟(jì)南","青島"}; Checkboxcb[]=newCheckbox[5]; publicvoidinit(){ add(newLabel("你選擇的城市是:")); add(ta); add(newLabel("請(qǐng)選擇你喜愛的城市:")); for(inti=0;i<5;i++){ cb[i]=newCheckbox(city[i]); add(cb[i]); cb[i].addItemListener(this); }} publicvoiditemStateChanged(ItemEvente){ ta.append(e.getItem()+"\t");}}

Java常用事件__例第四十七頁(yè),共六十一頁(yè),編輯于2023年,星期五

Java常用事件__例結(jié)果第四十八頁(yè),共六十一頁(yè),編輯于2023年,星期五例鼠標(biāo)事件及鼠標(biāo)移動(dòng)事件的處理。importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*; publicclassMouseEventDemoextendsAppletimplementsMouseListener,MouseMotionListener{ intx1,y1,x2,y2; publicvoidinit(){addMouseListener(this); addMouseMotionListener(this); } publicvoidpaint(Graphicsg){ g.drawLine(x1,y1,x2,y2); } publicvoidmousePressed(MouseEvente){ x1=e.getX(); y1=e.getY();} publicvoidmouseClicked(MouseEvente){} publicvoidmouseEntered(MouseEvente){} publicvoidmouseExited(MouseEvente){} publicvoidmouseReleased(MouseEvente){} publicvoidmouseDragged(MouseEvente){ x2=e.getX(); y2=e.getY(); repaint(); } publicvoidmouseMoved(MouseEvente){}}

Java常用事件__例第四十九頁(yè),共六十一頁(yè),編輯于2023年,星期五

Java常用事件__例結(jié)果第五十頁(yè),共六十一頁(yè),編輯于2023年,星期五事件適配器 為了方便,Java為那些聲明了多個(gè)方法的Listener接口提供了一個(gè)對(duì)應(yīng)的適配器(Adapter)類,在該類中實(shí)現(xiàn)了對(duì)應(yīng)接口的所有方法,只是方法體為空。 在創(chuàng)建新類時(shí),可以不實(shí)現(xiàn)接口,而是只繼承某個(gè)適當(dāng)?shù)倪m配器,并且僅覆蓋所關(guān)心的事件處理方法即可。 接口及對(duì)應(yīng)的適配器類如下所示:第五十一頁(yè),共六十一頁(yè),編輯于2023年,星期五例通過適配器來創(chuàng)建一個(gè)可關(guān)閉的窗口。importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*;publicclassWindowAdapterDemoextendsFrame{ publicWindowAdapterDemo(){ super("可關(guān)閉的窗口"); setSize(300,200); setVisible(true); addWindowListener(newWinAdapter()); } publicstaticvoidmain(String[]args){ newWindowAdapterDemo(); } classWinAdapterextendsWindowAdapter{ publicvoidwindowClosing(WindowEvente){ System.exit(0); }}}事件適配器__例第五十二頁(yè),共六十一頁(yè),編輯于2023年,星期五事件適配器__例14.4運(yùn)行結(jié)果第五十三頁(yè),共六十一頁(yè),編輯于2023年,星期五6.3.3內(nèi)部類在一個(gè)類內(nèi)部聲明的類稱為內(nèi)部類。沒有為其取名建立引用變量的內(nèi)部類稱為匿名內(nèi)部類。這種類的創(chuàng)建通常不與外界發(fā)生關(guān)系,僅供一次性使用。這種編程方法對(duì)于

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論