Java語言程序設(shè)計(jì)電子課件 第7章 Java事件處理模型_第1頁
Java語言程序設(shè)計(jì)電子課件 第7章 Java事件處理模型_第2頁
Java語言程序設(shè)計(jì)電子課件 第7章 Java事件處理模型_第3頁
Java語言程序設(shè)計(jì)電子課件 第7章 Java事件處理模型_第4頁
Java語言程序設(shè)計(jì)電子課件 第7章 Java事件處理模型_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

JAVA語言程序設(shè)計(jì)7.1事件處理機(jī)制7.2事件處理機(jī)制案例7.3AWT工具集和Swing組件7.4圖形用戶界面布局管理本章小結(jié)第一章目錄教學(xué)目標(biāo):圖形用戶界面((GraphicsUserInterface,GUI)是為應(yīng)用程序提供的一個圖形化界面,使用戶與應(yīng)用程序之間的交互更加簡單、有效。因此,圖形用戶界面的設(shè)計(jì)與開發(fā)已經(jīng)成為軟件開發(fā)中的一項(xiàng)重要工作。本章將介紹圖形用戶界面的制作,目前在移動終端軟件開發(fā)方面,特別是Android系統(tǒng)上的應(yīng)用軟件的開發(fā),中國人是走在世界前列的。教學(xué)重點(diǎn):1.掌握事件處理機(jī)制和主要的事件類。2.掌握布局管理器的應(yīng)用。3.掌握AWT組件和Swing組件。4.了解Swing特殊組件的應(yīng)用。第七章7.1.1Java事件處理模型7.1事件處理機(jī)制

事件對象組件(事件源)監(jiān)聽器注冊監(jiān)聽器產(chǎn)生事件將事件對象傳給監(jiān)聽器處理事件源.addXxxListener(監(jiān)聽器對象);1.事件三要素事件:用戶在界面上的操作。事件源:產(chǎn)生事件的組件。

監(jiān)聽器:是一個專門用于處理事件的類。它接收事件,并產(chǎn)生相應(yīng)的動作。如果希望某一個事件源能夠產(chǎn)生反應(yīng),要事先為其注冊相應(yīng)的監(jiān)聽器。2.事件處理編程步驟第一步:程序引入java.awt.event包。第二步:編寫監(jiān)聽器,該監(jiān)聽器要實(shí)現(xiàn)相應(yīng)的監(jiān)聽接口。第三步:為事件源注冊監(jiān)聽器。注冊監(jiān)聽器的方法為:事件源.addXxxListener(監(jiān)聽器對象),其中

XxxListener為不同的監(jiān)聽接口。importjava.awt.*;importjava.awt.event.*;publicclassExample7_1{//創(chuàng)建公共類 publicstaticvoidmain(String[]args){ newButtonPress(); }}classButtonPressimplementsActionListener{//創(chuàng)建事件處理器類 Framef=newFrame("第一個事件處理示例"); Buttonb=newButton("請按下"); publicButtonPress(){//設(shè)計(jì)GUI f.setSize(300,200); f.setBackground(Color.yellow); f.setLayout(newFlowLayout()); f.add(b); b.addActionListener(this);//為按鈕注冊監(jiān)聽器 f.setVisible(true); } publicvoidactionPerformed(ActionEvente){//事件處理器類實(shí)現(xiàn)的方法,當(dāng)單擊按鈕時,窗口顏色由黃色變?yōu)榧t色 f.setBackground(Color.red); }}【例7-1】界面上有一個按鈕,當(dāng)左鍵單擊按鈕后窗口顏色由黃色變?yōu)榧t色。

圖7-1界面為黃色圖7-2左鍵單擊按鈕后界面為紅色主要事件類和事件監(jiān)聽器3.事件適配器事件適配器是一個實(shí)現(xiàn)相應(yīng)事件接口的類,它實(shí)現(xiàn)接口中的每個方法,但方法中不做任何處理。監(jiān)聽器通過繼承事件適配器,將實(shí)現(xiàn)的方法繼承過來,并重寫需要的方法即可。Java語言為每個包含多個方法的事件接口都提供了對應(yīng)的事件適配器。

序號事件類型事件接口事件適配器1ActionEventActionListener無2ComponentEventComponentListenerComponentAdapter3ContainerEventContainerListenerContainerAdapter4AdjustmentEventAdjustmentListener無5ItemEventItemListener無6KeyEventKeyListenerKeyAdapter7MouseEventMouseListenerMouseAdapter8MouseEventMouseLMotionListenerMouseLMotionAdapter9TextEventTextListenerTextAdapter10WindowEventWindowListenerWindowAdapter11FocusEventFocusListenerFocusAdapter事件接口和事件類型對應(yīng)表7.1.2三種常用的事件ActionEvent類對應(yīng)的是動作事件,主要發(fā)生在鼠標(biāo)左鍵點(diǎn)擊按鈕、選擇菜單項(xiàng)、選擇列表項(xiàng)、文本框或文本域內(nèi)輸入回車符時。該類對應(yīng)的監(jiān)聽器接口為ActionListener。ItemEvent是項(xiàng)目事件,主要發(fā)生在單擊單選按鈕或勾選復(fù)選框而改變選項(xiàng)時。ItemEvent類對應(yīng)的監(jiān)聽器接口為ItemListener。

WindowEvent類對應(yīng)的是窗口事件,主要發(fā)生在窗口被激活、關(guān)閉、最小化、恢復(fù)等操作時。對應(yīng)的監(jiān)聽器接口為WindowListener。

其他常用事件ItemEvent事件MouseEvent事件KeyEvent事件FocusEvent事件AdjustmentEvent事件importjava.awt.*;importjava.awt.event.*;publicclassExample7_3{ publicstaticvoidmain(String[]args){ newWindowEventDemo(); }}classWindowEventDemoextendsFrameimplementsWindowListener{ Framef=newFrame("窗口事件"); publicWindowEventDemo(){ f.setSize(300,200); f.setVisible(true); f.addWindowListener(this); } publicvoidwindowActivated(WindowEvente){} publicvoidwindowClosed(WindowEvente){} publicvoidwindowClosing(WindowEvente){ System.exit(0);//退出系統(tǒng) } publicvoidwindowDeactivated(WindowEvente){} publicvoidwindowDeiconified(WindowEvente){} publicvoidwindowIconified(WindowEvente){} publicvoidwindowOpened(WindowEvente){}}【例7-3】創(chuàng)建窗口,點(diǎn)擊標(biāo)題欄中的按鈕,實(shí)現(xiàn)窗體的關(guān)閉。

importjava.awt.*;importjava.awt.event.*;publicclassExample7_4{ publicstaticvoidmain(String[]args){ newWindowAdapterDemo(); }}classWindowAdapterDemoextendsWindowAdapter{//繼承窗口適配器 Framef=newFrame("窗口適配器"); publicWindowAdapterDemo(){ f.setSize(300,200); f.setVisible(true); f.addWindowListener(this); //注冊窗口監(jiān)聽器 } publicvoidwindowClosing(WindowEvente){ System.exit(0); //退出系統(tǒng) }}【例7-4】用事件適配器完成窗口關(guān)閉功能

監(jiān)聽器實(shí)現(xiàn)的不同方法7.1.3內(nèi)部類實(shí)現(xiàn)監(jiān)聽器

類實(shí)現(xiàn)本類組件的監(jiān)聽器內(nèi)部類實(shí)現(xiàn)監(jiān)聽器匿名類實(shí)現(xiàn)監(jiān)聽器

【例7-5】在文本框中輸入一個數(shù)字,點(diǎn)擊“平方”按鈕計(jì)算該數(shù)字的平方值,點(diǎn)擊“立方”按鈕計(jì)算該數(shù)字的立方值,并對窗口的關(guān)閉按鈕進(jìn)行監(jiān)聽。importjava.awt.*;importjava.awt.event.*;publicclassExample7_5{ Framef=newFrame("內(nèi)部類實(shí)現(xiàn)監(jiān)聽器"); Labell=newLabel("請輸入一個數(shù)字"); TextFieldt1=newTextField(8); TextFieldt2=newTextField(8); Buttonb1=newButton("平方"); Buttonb2=newButton("立方"); publicExample7_5(){//構(gòu)造方法設(shè)置GUI f.setSize(300,200); f.setLayout(newFlowLayout()); f.add(l); f.add(t1); f.add(t2); f.add(b1); f.add(b2); b1.addActionListener(newHandler1());//平方計(jì)算注冊給內(nèi)部類 b2.addActionListener(newActionListener(){//立方值計(jì)算注冊給匿名類 publicvoidactionPerformed(ActionEvente){ Stringnumber=t1.getText(); intn=Integer.parseInt(number); intm=n*n*n; t2.setText("立方為"+m); } }); f.addWindowListener(newHandler3()); f.setVisible(true); } publicstaticvoidmain(String[]args){//程序運(yùn)行 newExample7_5(); } classHandler1implementsActionListener{//內(nèi)部類監(jiān)視器計(jì)算平方值 publicvoidactionPerformed(ActionEvente){ Stringnumber=t1.getText(); intn=Integer.parseInt(number); intm=n*n; t2.setText("平方為"+m); } } classHandler3extendsWindowAdapter{//內(nèi)部類監(jiān)視器關(guān)閉窗口 publicvoidwindowClosing(WindowEvente){ System.exit(0); } }} 在社會上,有的人大學(xué)畢業(yè)后月入才幾千元,而有的人初中畢業(yè)卻能夠買車買房,所以,有的同學(xué)認(rèn)為讀書投入了時間和學(xué)費(fèi),卻不能得到更高的回報(bào)。為什么要多讀書,人民日報(bào)給出了最好的答案:讀書的意義是使人虛心通達(dá),不固執(zhí)、不偏執(zhí);書中未必有黃金屋但一定有更好的自己;讀書讓你哪怕身陷泥濘也依然可以仰望星空;書或許不能解決眼下的難題但它會給你沖破困難的力量;讀書就是讓自己變得遼闊的過程。讀書學(xué)習(xí)就是讀經(jīng)驗(yàn)、學(xué)知識,就是學(xué)習(xí)社會的運(yùn)轉(zhuǎn)邏輯,更深刻地理解整個社會。學(xué)習(xí)可以擴(kuò)充我們的知識面,幫助我們打開通往成功的大門。我們不能增加生命的長度,但是能通過讀書增加生命的寬度和厚度。課后思考:工資與讀書投入真的可以計(jì)算性價比嗎?

7.2.1鼠標(biāo)拖動小球游戲7.2事件處理案例

(1)創(chuàng)建窗體對象f、面板對象p、顯示一個直徑為30像素的紅色小球。(2)為小球注冊鼠標(biāo)的監(jiān)聽事件(3)創(chuàng)建一個鼠標(biāo)監(jiān)聽器類實(shí)現(xiàn)鼠標(biāo)移動監(jiān)聽接口(4)在鼠標(biāo)監(jiān)聽器的鼠標(biāo)移動方法中,獲取鼠標(biāo)當(dāng)前位置,然后在鼠標(biāo)的位置重新將小球畫出來。實(shí)現(xiàn)鼠標(biāo)拖動小球的工作。1.設(shè)計(jì)思路(1)如何注冊鼠標(biāo)監(jiān)聽器?(2)如何判斷當(dāng)前鼠標(biāo)的位置?【解決問題1】首先讓面板類實(shí)現(xiàn)鼠標(biāo)監(jiān)聽器接口,然后為面板類對象p注冊一個鼠標(biāo)拖動的監(jiān)聽器,也就是自身。p.addMouseMotionListener(p);【解決問題2】在鼠標(biāo)監(jiān)聽器中,有固定的方法獲取鼠標(biāo)當(dāng)前位置。鼠標(biāo)事件e通過getX()方法,可以獲得鼠標(biāo)當(dāng)前位置的X軸坐標(biāo);鼠標(biāo)事件e通過getY()方法,可以獲得鼠標(biāo)當(dāng)前位置的Y軸坐標(biāo);因此鼠標(biāo)的當(dāng)前位置(x,y)可以由以下方法得到。x=e.getX();y=e.getY();2.遇到問題importjava.awt.*;importjava.awt.event.*;publicclassMoveBall{ publicstaticvoidmain(Stringargs[]){ Framew=newFrame(); w.setSize(300,400); MyPanelp=newMyPanel(); p.addMouseMotionListener(p);//鼠標(biāo)拖動 w.addWindowListener(newCloseWin());//關(guān)閉按鈕 w.add(p); w.setVisible(true);}}3.程序?qū)崿F(xiàn)classMyPanelextendsPanelimplementsMouseMotionListener{ intx=30; inty=30; publicvoidpaint(Graphicsg){ g.setColor(Color.red);//設(shè)置小球?yàn)榧t色 g.fillOval(x,y,30,30);//繪制一個直徑為30像素的球 } publicvoidmouseDragged(MouseEvente){ x=e.getX();//獲取鼠標(biāo)所在的坐標(biāo)位置 y=e.getY(); repaint();//重畫界面 } publicvoidmouseMoved(MouseEvente){}}classCloseWinextendsWindowAdapter//創(chuàng)建窗體監(jiān)聽器{ publicvoidwindowClosing(WindowEvente){ System.exit(0);//退出系統(tǒng) }}7.2.2彈球游戲

(1)創(chuàng)建窗體對象frame,在窗體上繪制一個小球。(2)通過循環(huán)控制小球的橫、縱坐標(biāo)在窗體寬度和高度范圍內(nèi)按當(dāng)前移動方向變化。(3)引入線程,通過線程控制小球的移動,在小球撞墻的那一刻,改變小球移動方向。(4)當(dāng)小球撞擊界面的下邊緣時,判定木棒是否接住了小球。如果接住了,小球正常彈回,如果沒有接住,游戲結(jié)束。1.設(shè)計(jì)思路(1)如何畫一個木棒?(2)如何判定木棒接住了小球?(3)如何結(jié)束程序,顯示gameover?【解決問題1】通過繪制一個矩形,實(shí)現(xiàn)在界面上畫出一個木棒。設(shè)置矩形的長度和高度,顯示木棒的長短和粗細(xì)。g.fillRect(xp,yp,w,h);【解決問題2】通過設(shè)置一個布爾型的變量flag,判斷每次小球撞擊下邊界的位置是否在木棒出現(xiàn)的范圍內(nèi)。如果正好在區(qū)域內(nèi),說明木棒接住了小球,布爾值flag為真,否則,木棒沒有接住小球,布爾值flag為假。2.遇到問題if(小球左邊界+直徑>=木棒的起始位置&&小球左邊界<=木棒的右邊界) {小球正常彈回;} else{ flag=false;用break結(jié)束循環(huán); }【解決問題3】在paint()方法中,每次判定flag的值是否為假,如果為假,顯示字符串GameOverif(flag==false){ g.setFont(newFont("",Font.BOLD,40)); g.drawString("gameover",50,50); }2.遇到問題importjava.awt.Color;importjava.awt.Font;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Panel;importjava.awt.event.*;publicclassMarblesGame{ publicstaticvoidmain(String[]args){ Framef=newFrame(); MyPanelp=newMyPanel(); Threadt=newThread(p); p.addKeyListener(p); f.addKeyListener(p);//添加鍵盤事件 f.addWindowListener(newWindowAdapter(){ @Override//匿名類實(shí)現(xiàn)窗體監(jiān)聽接口 publicvoidwindowClosing(WindowEvente){ //TODOAuto-generatedmethodstub System.exit(0); } }); t.start();//啟動線程 f.setSize(500,550); f.add(p); f.setVisible(true);//窗口可見 }}3.程序?qū)崿F(xiàn)classMyPanelextendsPanelimplementsRunnable,KeyListener{ privateintx=20; privateinty=20;//小球出現(xiàn)的起始位置 privateintxp=200; privateintyp=448;//木棒出現(xiàn)的起始位置 privateintw=60; privateinth=16;//木棒的長度和高度 privatebooleanflag=true; publicvoidpaint(Graphicsg){ g.fillOval(x,y,20,20); g.setColor(Color.red);//木棒顏色為紅色 g.fillRect(xp,yp,w,h);//用矩形畫出木棒 if(flag==false){//如果沒接住小球,程序結(jié)束 g.setFont(newFont("",Font.BOLD,40)); g.drawString("gameover",50,50); } }

publicvoidrun(){ intix=2; intiy=4; while(true){//小球四個方向進(jìn)行彈球 if(y+20>=yp){ if(x+20>=xp&&x<=xp+w)

iy=-iy; else{

flag=false; break; } } if(y<=0){ iy=-iy; } if(x>=462||x<=0){ ix=-ix; } x+=ix; y+=iy; try{Thread.sleep(100);//線程休眠100毫秒 }catch(Exceptione){ e.printStackTrace(); } repaint();//重畫界面 } } @Override publicvoidkeyPressed(KeyEvente){//在鍵盤按下方法中實(shí)現(xiàn)木棒移動 intkc=e.getKeyCode(); if(kc==37||kc=='a'){ xp-=10;//如果是左箭頭或者字母a鍵,木棒向左移動 }elseif(kc==39||kc=='d'){ xp+=10;//如果是右箭頭或者字母d鍵,木棒向右移動 } repaint(); } publicvoidkeyReleased(KeyEvente){ } publicvoidkeyTyped(KeyEvente){}}美國斷芯可能會給中興帶來困難,甚至造成中興倒閉,然而對于擁有世界上最完整工業(yè)體系的中國來說,豈是誰斷貨就能休克得了的。從空間站、探月、北斗導(dǎo)航、通訊衛(wèi)星、高清探測遙感衛(wèi)星、氣象衛(wèi)星、廣播電視衛(wèi)星、量子通訊衛(wèi)星、鵲橋號中繼星,悟空暗物質(zhì)探測衛(wèi)星,到洲際彈道導(dǎo)彈、關(guān)島快遞東風(fēng)26航母殺手、艦艦導(dǎo)彈、空地導(dǎo)彈、反導(dǎo)系統(tǒng)、反隱身雷達(dá)、以及水下飛行器;從殲20、運(yùn)20、直20、預(yù)警機(jī)、察打一體無人機(jī)、世界首款第六代無人隱身戰(zhàn)斗機(jī),到戰(zhàn)略導(dǎo)彈核潛艇、萬噸級驅(qū)逐艦、航母、深潛技術(shù)、電磁炮、電磁推進(jìn)和電磁彈射技術(shù)、深潛技術(shù)、乘波體高超音速飛行器、以及現(xiàn)代化的兩彈;凡是世界上有的主要工業(yè)產(chǎn)業(yè),中國都有,而且大部分都已經(jīng)達(dá)到或接近世界先進(jìn)水平。我們既要承認(rèn)差距,也要充滿自信,我們既要樹立遠(yuǎn)大目標(biāo),也要腳踏實(shí)地從當(dāng)下做起。課后閱讀:中國人要敢于正視差距,但更要自信。7.3.1AWT工具集簡介7.3AWT工具集和Swing組件

1.組件組件(Component)是Java的圖形用戶界面的最基本的組成部分。Java把Component類的子類或間接子類創(chuàng)建的對象成為一個組件,如Button、List、TextField、Label等。組件以圖形化的方式顯示在屏幕上,并能通過對不同事件的響應(yīng)來完成和用戶的交互或組件之間的交互。組件不能單獨(dú)的顯示出來,必須將組件放在一定的容器中才可以顯示。

2.容器容器(Container)也是一個類,Java把Container的子類或間接子類創(chuàng)建的對象稱為一個容器。由于Container也是Component的子類,因此容器本身也是一個組件,具有組件的所有性質(zhì)。但容器最主要的功能是容納其他組件和容器。3.布局管理器布局管理器(LayoutManager)對應(yīng)著java.awt包中的一個類,可以為每一個容器設(shè)置一個布局管理器,從而為該容器中的組件進(jìn)行定位。4.事件事件(Event)是java.awt包中的類。在Java中,程序和用戶的交互是通過響應(yīng)各種事件來實(shí)現(xiàn)的。當(dāng)用戶按下一個按鈕,意味著一個按鈕事件的發(fā)生;用戶在文本框中輸入文本后按Enter鍵,意味著一個動作事件的發(fā)生。每當(dāng)事件發(fā)生時,Java虛擬機(jī)就會將事件的消息傳遞給程序,由程序中的事件處理方法對該事件進(jìn)行處理。有上述的四個概念可知,當(dāng)設(shè)計(jì)一個圖形界面時應(yīng)分為四個步驟:(1)創(chuàng)建容納組件的容器(2)為容器設(shè)置布局管理器(3)將組件按照布局的方式添加在容器中(4)處理組件上發(fā)生的事件7.3AWT工具集和Swing組件

7.3.2Swing組件7.3AWT工具集和Swing組件

在AWT的基礎(chǔ)上構(gòu)建的一套新的圖形用戶界面系統(tǒng),采用純Java語言編寫,包含AWT所提供的所有功能。這些Swing組件位于javax.swing包中,成為JDK基礎(chǔ)類庫的一部分。它不依賴于本地操作系統(tǒng)的圖形用戶界面,可以做到跨平臺運(yùn)行。絕大多數(shù)的Swing組件派生自JCompomnent類,Swing組件的類層次結(jié)構(gòu)如圖7-11所示。頂層容器包括JFrame、JApplet、JDialog。(1)JFrameJFrame類用于創(chuàng)建Swing窗口對象。它的用法與Frame用法類似。但是二者最大的區(qū)別是,JFrame不能直接通過add()方法加入組件,也不能直接通過setLayout()方法設(shè)置布局。1.頂層容器第一步:獲取窗口的內(nèi)容面板JFramejf=newJFrame();Containerc=jf.getContentPane();第二步:對內(nèi)容面板設(shè)置布局(Container的默認(rèn)布局是BorderLayout)c.setLayout(newFlowLayout());//設(shè)置順序布局第三步:將組件加入到內(nèi)容面板JButtonjb=newJButton(“ok”);c.add(jb);//加入一個按鈕在空白窗口中添加組件的步驟:

importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclassExample7_6{ JFramejf=newJFrame("第一個Swing窗口示例"); JButtonjb=newJButton("我是一個按鈕"); publicExample7_6(){ jf.setBounds(100,100,300,200);//設(shè)置窗口的位置和尺寸 jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);

//設(shè)置窗口的關(guān)閉按鈕為可響應(yīng)的 Containerc=jf.getContentPane();//獲取內(nèi)容面板 c.setLayout(newFlowLayout());//設(shè)置內(nèi)容面板布局 c.add(jb);//在內(nèi)容面板添加按鈕組件 jf.setVisible(true); //jf.pack();//若有此句則窗口為緊縮模式 } publicstaticvoidmain(String[]args){newExample7_6(); } }【例7-6】JFrame窗口示例(2)JAppletjavax.swing.JApplet是java.awt.Applet的子類,是用來建立Java小應(yīng)用程序的。JApplet和JFrame一樣,都要獲取內(nèi)容面板,為內(nèi)容面板設(shè)置布局方式,將組件放置在內(nèi)容面板中。importjavax.swing.*;importjava.awt.*;publicclassExample7_7extendsJApplet{ JButtonjb=newJButton("我是一個按鈕"); publicvoidinit(){//JApplet和Applet一樣沒有main方法 this.setSize(300,200); Containerc=this.getContentPane();//為JApplet獲得內(nèi)容面板 c.setLayout(newFlowLayout()); c.add(jb); c.setCursor(newCursor(Cursor.HAND_CURSOR));//鼠標(biāo)設(shè)置為手型 }}【例7-7】JApplet窗口示例。(3)JDialogJDialog是對話框類,是從一個窗口中彈出的窗口。對話框是應(yīng)用廣泛的組件之一,它不能作為應(yīng)用程序的主窗口,也沒有最小化、最大化按鈕,不能設(shè)置菜單欄。importjava.awt.event.*;importjava.awt.*;importjavax.swing.*;publicclassExample7_8implementsActionListener{ JFramejf=newJFrame("對話框示例"); JDialogjd=newJDialog(jf,"對話框",true);//定義一個對話框,設(shè)置為有模式狀態(tài),一旦對話框被激活則無法再激活它所依賴的窗口。 JButtonjb1=newJButton("打開"); JButtonjb2=newJButton("關(guān)閉"); publicExample7_8(){ jf.setSize(300,200); jd.setSize(100,100);//設(shè)置對話框的尺寸 Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); c.add(jb1); c.add(jb2); //為兩個按鈕添加監(jiān)視器 jb1.addActionListener(this); jb2.addActionListener(this); jf.setVisible(true);

}【7-8】JDialog窗口示例。 publicvoidactionPerformed(ActionEvente){ if(e.getSource()==jb1){//點(diǎn)擊”打開“按鈕時,對話框可見 jd.setVisible(true); } else{ jd.setVisible(false);//點(diǎn)擊”關(guān)閉“按鈕時,對話框消失 } } publicstaticvoidmain(String[]args){ newExample7_8(); }}中間容器不能作為頂層容器,必須包含在其它容器中,包括JPanel、JScrollPane、JtabbedPane、JToolBar。面板JPanel是最靈活、最常用的中間容器,用于容納其它組件。對應(yīng)于javax.swing.JPanel類。面板可以方便的布局,實(shí)現(xiàn)嵌套。面板的大小由它所包含的組件決定,默認(rèn)布局是FlowLayout。2.中間容器1.JComponent類JComponent類是除頂層容器外所有Swing組件的父類。2.標(biāo)簽JLabelJLabel是一個用戶組件,提供文本或圖像信息。對應(yīng)于javax.swing.JLabel類。標(biāo)簽不能被編輯,不能對輸入事件作出反應(yīng),因此它無法獲得鍵盤焦點(diǎn)。3.按鈕JButton按鈕JButton是常見組件,按鈕上允許有圖標(biāo)或字符串,也可以兩者兼有,最常見的操作是單擊按鈕。對應(yīng)于javax.swing.JButton類。7.3.4SWING中的組件importjava.awt.*;importjavax.swing.*;publicclassExample7_11{ JFramejf=newJFrame("標(biāo)簽示例"); JLabeljl1=newJLabel("圣誕快樂");//生成文本標(biāo)簽 JLabeljl2=newJLabel(newImageIcon("f:\\chapter8\\Christmas.gif"));//生成圖片標(biāo)簽 publicExample7_11(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); jl1.setFont(newFont("黑體",Font.BOLD,40));//設(shè)置字體 c.add(jl1); c.add(jl2); jf.setVisible(true); } publicstaticvoidmain(String[]args){ newExample7_11(); }}【例7-11】利用標(biāo)簽顯示文本和圖片(1)JTextField(單行文本框)單行文本框TextField,允許編輯或輸入單行文本,對應(yīng)于javax.swing.JTextField類。該類常用事件是ActionEvent和FocusEvent事件。(2)JPassword(密碼框)密碼框JPassword是JTextField的子類,組件與文本框組件類似。區(qū)別在于密碼框回顯字符一律以特定符號顯示。常用事件為ActionEvent事件。(3)JTextArea(多行文本區(qū))多行文本區(qū)(JTextArea)與文本框組件類似,區(qū)別是文本區(qū)組件可以顯示多行文本。常用事件為ActionEvent。4.JTextField、JPassword、JTextAreaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassExample7_12{ JFramejf=newJFrame("密碼框示例"); JPasswordFieldjpf=newJPasswordField(8); JLabeljl=newJLabel(); publicExample7_12(){ jf.setSize(300,100); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); jpf.setEchoChar('#'); c.add(jpf); c.add(jl); jpf.addActionListener(newHandler()); jf.setVisible(true); } classHandlerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ jl.setText("您輸入的密碼是:"+jpf.getText()); } } publicstaticvoidmain(String[]args){ newExample7_12(); }}【例7-12】密碼框組件的使用,在界面的密碼框中輸入密碼,以#顯示,輸入回車后,在界面上提示剛才輸入的密碼。(1)JCheckBox復(fù)選框JCheckBox是一個小框,當(dāng)選擇某個復(fù)選框后,里面就有了個小對號。復(fù)選框的名字不僅可以是字符串也可以是一個圖標(biāo)。常用事件是ItemEvent。(2)JRadioButton單選按鈕JRadioButton和復(fù)選框很類似。不同的是,在若干個復(fù)選框中可以同時選中多個,而一組單選鈕同一時刻只能有一個被選中。當(dāng)創(chuàng)建了若干個單選按鈕后,應(yīng)該使用ButtonGroup再創(chuàng)建一個對象,然后利用這個對象把這若干個單選按鈕歸組。單選鈕常用事件為ItemEvent。5.復(fù)選框JCheckBox、單選按鈕JRadioButtonimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassExample7_13implementsItemListener{ JFramejf=newJFrame("選擇按鈕示例"); //創(chuàng)建單選按鈕 JRadioButtonjr1=newJRadioButton("男"); JRadioButtonjr2=newJRadioButton("女"); //創(chuàng)建復(fù)選款 JCheckBoxjcb1=newJCheckBox("音樂"); JCheckBoxjcb2=newJCheckBox("旅游"); JCheckBoxjcb3=newJCheckBox("游戲"); JButtonb=newJButton("確定"); JLabeljl1=newJLabel("個人信息統(tǒng)計(jì)"); JLabeljl2=newJLabel(); StringBuffers1=newStringBuffer("個人信息如下----性別:"); StringBuffers2=newStringBuffer("愛好:"); publicExample7_13(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); c.add(jl1);

【例7-13】單選按鈕和復(fù)選框的使用,在界面中選擇個人信息,點(diǎn)擊“確定”按鈕,顯示用戶剛才的選擇。 ButtonGroupbg=newButtonGroup();//單選按鈕分組 //將兩個單選按鈕jr1、jr2 bg.add(jr1); bg.add(jr2); //將兩個單選按鈕三個復(fù)選款添加到面板中 c.add(jr1); c.add(jr2); c.add(jcb1); c.add(jcb2); c.add(jcb3); c.add(b); c.add(jl2); b.addActionListener(newHandleButton()); //為單選鈕和復(fù)選框添加監(jiān)視器 jr1.addItemListener(this); jr2.addItemListener(this); jcb1.addItemListener(this); jcb2.addItemListener(this); jcb3.addItemListener(this); jf.setVisible(true); }

publicvoiditemStateChanged(ItemEvente){//單選鈕和復(fù)選款監(jiān)視器 if(e.getSource()==jr1){//組件被選中 if(jr1.isSelected()){ s1.append(jr1.getText()); } } if(e.getSource()==jr2){ if(jr2.isSelected()){ s1.append(jr2.getText()); } } if(e.getSource()==jcb1){ if(jcb1.isSelected()){s2.append(jcb1.getText()); } } if(e.getSource()==jcb2){ if(jcb2.isSelected()){s2.append(jcb2.getText()); } } if(e.getSource()==jcb3){ if(jcb3.isSelected()){s2.append(jcb3.getText()); } } } publicstaticvoidmain(String[]args){ newExample7_13(); } classHandleButtonimplementsActionListener{//按鈕監(jiān)視器 publicvoidactionPerformed(ActionEvente){ jl2.setText(s1.toString()+s2.toString()); } }}(1)JComboBox下拉列表框JComboBox,可以給出若干選項(xiàng),只允許用戶選擇一項(xiàng)。下拉列表能節(jié)省空間,使界面更加緊湊。在單擊箭頭時才能瀏覽其中的項(xiàng)目。下拉列表的常用事件為ActionEvent和ItemEvent。(2)JList列表框JList,與下拉列表有許多不同之處,支持單項(xiàng)選擇也支持多項(xiàng)選擇。如果選項(xiàng)特別多,可以把JList放置在JScrollPane面板上,提供有滾動條的列表。當(dāng)用戶在列表框中選擇一些項(xiàng)時,將觸發(fā)ListSelectionEvent事件(該事件在javax.swing.event包中),ListSelectionListener監(jiān)視器負(fù)責(zé)處理該事件,實(shí)現(xiàn)的方法為publicvoidvalueChanged(ListSelectionEvente)。6.下拉列表框JComboBox、列表框JListimportjava.awt.*;importjavax.swing.*;importjava.awt.event.*;publicclassExample7_14implementsItemListener{ Stringselect[]={"香蕉","菠蘿","蘋果","柚子"};//下拉列表選項(xiàng)數(shù)組 JFramejf=newJFrame("下拉列表框示例"); JComboBoxjcb=newJComboBox(select);//創(chuàng)建下拉列表 JLabeltitle=newJLabel("請選擇您喜歡的水果:"); JLabeljl=newJLabel();publicExample7_14(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout());

【7-14】下拉列表框示例 title.setFont(newFont("黑體",Font.BOLD,28));//設(shè)置字體 c.add(title); c.add(jcb); jcb.addItemListener(this);//為下拉列表注冊監(jiān)視器 c.add(jl); jf.setVisible(true);} publicvoiditemStateChanged(ItemEvente){ //監(jiān)視器實(shí)現(xiàn)jl.setText("您選擇的是:"+jcb.getSelectedItem().toString());//獲取選項(xiàng) } publicstaticvoidmain(String[]args){ newExample7_14(); }}importjava.awt.*;importjavax.swing.*;importjavax.swing.event.*;//事件所在包publicclassExample7_15implementsListSelectionListener{ JFramejf=newJFrame("列表框示例"); Stringselect[]={"香蕉","菠蘿","蘋果","柚子"};// JLabeljl1=newJLabel("請選擇您喜歡的水果:"); JLabeljl2=newJLabel(); JListjlist=newJList(select);//創(chuàng)建列表,列表項(xiàng)來自select數(shù)組publicExample7_15(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); c.add(jl1); c.add(jlist);

【7-15】列表框例題 c.add(jl2); jlist.addListSelectionListener(this);//為列表注冊監(jiān)視器 jf.setVisible(true); } publicvoidvalueChanged(ListSelectionEvente){ StringBuffers=newStringBuffer();//創(chuàng)建緩沖字符串 Objectobj[]; obj=jlist.getSelectedValues();//獲得多個選項(xiàng),返回值為object數(shù)組 for(inti=0;i<obj.length;i++){ s.append(obj[i].toString()+"");//將數(shù)組值逐個取出轉(zhuǎn)為String類型,逐個追加 } jl2.setText("您選擇了:"+s); } publicstaticvoidmain(String[]args){ newExample7_15(); }}菜單是圖形用戶界面常用的一種組件,主要有兩種形式:一種是基于菜單條的,一般加在JFrame組件上,一種是單擊右鍵的彈出式菜單。(1)菜單條菜單菜單條菜單由三部分組成:菜單(JMenu)、菜單條(JMenuBar)、菜單項(xiàng)(JMenuItem)。上述三者的關(guān)系是:JMenu必須放在一個JMenuBar上,JMenuItem必須放在一個JMenu上,JMenu的子項(xiàng)可以是JMenu、JMenuItem和分隔符。(2)彈出式菜單JPopupMenu彈出式菜單是一種特殊形式的菜單,其性質(zhì)與菜單幾乎相同。但是彈出式菜單并不固定在窗口的任何一個位置,而是由鼠標(biāo)和系統(tǒng)判斷決定位置。彈出式菜單發(fā)生在用戶按下或松開鼠標(biāo)右鍵時觸發(fā)MouseEvent事件。7.菜單JMenu7.4.1順序布局順序布局(FlowLayout)是最基本的一種布局,對應(yīng)于java.awt.FlowLayout類。Panel及其子類的默認(rèn)布局方式均為順序布局。順序布局是指根據(jù)顯示區(qū)域的大小,把組件按照從左到右的順序排列,一行排滿后就轉(zhuǎn)到下一行繼續(xù)排列,直到把所有組件都顯示出來。在順序布局方式下,組件使用容器的add方法將自己加入容器中。7.4圖形用戶界面布局管理importjava.awt.*;publicclassExample7_17{ publicstaticvoidmain(String[]args){ Framef=newFrame("順序布局示例"); Buttonb1=newButton("按鈕1"); Buttonb2=newButton("按鈕2"); Buttonb3=newButton("按鈕3"); Buttonb4=newButton("按鈕4"); Buttonb5=newButton("按鈕5"); f.setSize(300,200); f.setLayout(newFlowLayout());//設(shè)置窗口的布局為順序布局 f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5); f.setVisible(true); }}【例7-17】使用順序布局放5個按鈕邊界布局(BorderLayout)是一種簡單的布局策略,對應(yīng)于java.awt.BorderLayout類。Window及其子類(Frame、Dialog)的默認(rèn)布局方式均為邊界布局。邊界布局將一個容器分為5個部分:東、南、西、北、中。這幾部分的分布規(guī)律是“上北下南,左西右東”。東南西北四個邊界內(nèi)的組件占據(jù)了它們所需的盡可能多的空間,中間區(qū)域則占據(jù)了剩余的全部空間。每加入一個組件都應(yīng)該指明把這個組件加在哪個區(qū)域中,區(qū)域由BorderLayout中的靜態(tài)常量CENTER、NORTH、SOUTH、WEST、EAST表示。7.4.2邊界布局importjava.awt.*;publicclassExample7_18{ publicstaticvoidmain(String[]args){ Framef=newFrame("邊界布局示例"); f.setSize(300,200); Buttoneast=newButton("東"); Buttonsouth=newButton("南"); Buttonwest=newButton("西"); Buttonnorth=newButton("北"); Buttoncenter=newButton("中"); BorderLayoutbor=newBorderLayout();//創(chuàng)建邊界布局對象 f.setLayout(bor);//為窗口設(shè)置邊界布局 //將五個按鈕按照方向依次放入窗口對應(yīng)的五個區(qū)域 f.add("East",east); f.add("South",south); f.add("West",west); f.add("North",north); f.add("Center",center); f.setVisible(true); }}【7-18】使用邊界布局放置5個按鈕組件網(wǎng)格布局(GridLayout)是一種使用較多的布局,對應(yīng)于java.awt.GridLayout類。網(wǎng)格布局是指將一個容器分成若干個網(wǎng)格,將組件安放到網(wǎng)格的行和列中。組件首先被添加到網(wǎng)格的第一行的第一個單元,向右繼續(xù)排列。當(dāng)?shù)谝恍袃?nèi)所有的單元都被占滿時,下一個組件被添加到網(wǎng)格第二行的第一個單元,以此類推。7.4.3網(wǎng)格布局importjava.awt.*;publicclassExample7_19{ publicstaticvoidmain(String[]args){ Framef=newFrame("網(wǎng)格布局示例"); GridLayoutgri=newGridLayout(3,3);//3行3列的網(wǎng)格 f.setSize(300,200); f.setLayout(gri); for(inti=1;i<=9;i++){ f.add(newButton("按鈕"+i)); } f.setVisible(true); }}【7-19】創(chuàng)建一個具有3行3列的網(wǎng)格卡片布局(CardLayout)可以容納多個組件。對應(yīng)于java.awt.CardLayout類。卡片布局是指將組件像卡片一樣疊放起來,在任何時候只有一張卡片是可見的,就像一疊“撲克牌”一樣,這個被顯示的組件將占據(jù)容器的整個空間。7.4.4卡片布局假設(shè)有容器f,使用CardLayout的步驟如下:(1)創(chuàng)建CardLayout對象作為布局,如:CardLayoutcard=newCardLayout();(2)容器使用setLayout方法設(shè)置布局,如:f.setLayout(card);(3)容器調(diào)用add(Strings,Componentb)方法將組件b加入到容器中。其中,s是該組件的代號。f.add(“按鈕1”,b);(4)使用CardLayout提供的show、first等方法,顯示組件。importjava.awt.*;publicclassExample7_20{ publicstaticvoidmain(String[]args){ Framef=newFrame("卡片布局"); CardLayoutcard=newCardLayout(10,5);

//設(shè)置卡片布局,水平間距為10,垂直間距為5 Buttonb1=newButton("1號卡片"); Buttonb2=newButton("2號卡片"); Buttonb3=newButton("3號卡片"); f.setSize(300,200); f.setLayout(card); f.add("1",b1);//將b1加入f中,設(shè)置代號為"1" f.add("2",b2);//將b2加入f中,設(shè)置代號為"2" f.add("3",b3);//將b3加入f中,設(shè)置代號為"3" card.show(f,"2");//卡片布局顯示第二張卡片 f.setVisible(true); }}【7-20】創(chuàng)建一個卡片布局,并顯示第二張卡片首先用戶先進(jìn)行登錄,通過服務(wù)器的驗(yàn)證,登錄到服務(wù)器上。顯示當(dāng)前在線的用戶,雙擊某個用戶名,可以與該用戶互相發(fā)送信息,發(fā)送文件。當(dāng)某個用戶退出登錄后,在其他用戶列表上顯示該用戶不在線。7.5圖形用戶界面案例(1)在工程的src文件夾中創(chuàng)建p1文件夾,分別創(chuàng)建三個java文件,登錄界面Chat_Login.java、聯(lián)系人界面Chat_Contact.java、聊天界面Chat_Main.java。(2)登錄界面Chat_Login.java的窗體布局整體采用邊界布局,用戶名、密碼組件放置在面板p1中,并將p1放在窗體的Center位置,將三個按鈕放在面板p2中,并將P2放在面板的South位置。(3)為兩個按鈕注冊監(jiān)聽器。當(dāng)點(diǎn)擊“登錄”按鈕時,將用戶名、密碼與先前設(shè)定的值進(jìn)行比較,匹配則顯示信息成功,否則顯示信息失敗。當(dāng)點(diǎn)擊“取消”按鈕,退出系統(tǒng)。(4)聯(lián)系人界面Chat_Contact.java的窗體布局整體采用邊界布局。分為北邊和中間兩部分。分別放置兩個面板p1和p2。P1采用流布局,只放置一個“聯(lián)系人:”按鈕;P2采用網(wǎng)格布局,3行1列,放置3個聯(lián)系人按鈕。(5)聊天界面Chat_Main.java的窗體整體采用邊界布局,中間部分放一個JTextArea組件,在南邊的位置放一個面板p。面板p采用網(wǎng)格布局,1行2列,依次放JTextField組件和JButton組件。1.設(shè)計(jì)思路(1)點(diǎn)擊登錄按鈕后,如果登錄成功,如何顯示聯(lián)系人界面?(2)聯(lián)系人是如何添加到聯(lián)系人界面上的?(3)點(diǎn)擊一個聯(lián)系人a2,如何彈出聊天界面?2.遇到問題【解決問題1】當(dāng)?shù)卿洺晒?,?chuàng)建聯(lián)系人界面Chat_Contact的對象wmain,設(shè)置該對象可見,同時讓登錄界面不可見。Chat_Contactwmain=newChat_Contact(); wmain.setVisible(true); this.setVisible(false);【解決問題2】正常情況下,聯(lián)系人應(yīng)該從數(shù)據(jù)庫中提取,現(xiàn)在先用一個JLabel的數(shù)據(jù)顯示a1、a2和a3三個標(biāo)簽來代替。到第十章,再修改這部分代碼。同時給每個按鈕注冊監(jiān)聽器。for(inti=0;i<3;i++){ jl[i]=newJLabel(); jl[i].setText("a"+(i+1)); jl[i].addMouseListener(this);}【解決問題3】在鼠標(biāo)點(diǎn)擊事件中,判斷如果點(diǎn)擊了標(biāo)簽,創(chuàng)建聊天界面Chat_Main的對象cm,設(shè)置該對象可見。if(e.getSource()==jl[i]){ Chat_Maincm=newChat_Main(username); cm.setName(jl[i].getText()); cm.setVisible(true); } packagep1;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassChat_LoginextendsJFrameimplementsActionListener{ JTextFieldtuser=newJTextField();JPasswordFieldtpass=newJPasswordField(); publicChat_Login(){//搭建窗體界面 this.setSize(260,120);//指定大小 this.setLocation(300,300); JPanelJtext=newJPanel();//添加文本框面板Jtext; Jtext.setLayout(newGridLayout(2,2)); JLabelluser=newJLabel("用戶名:"); JLabellpass=newJLabel("密碼:"); Jtext.add(luser); Jtext.add(tuser);//添加用戶名,密碼組件 Jtext.add(lpass); Jtext.add(tpass); JPanelJbutton=newJPanel();//添加按鈕面板Jbutton; JButtonblogin=newJButton("登錄"); JButtonbreg=newJButton("注冊"); JButtonbcancel=newJB

溫馨提示

  • 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

提交評論