Java語言程序設計電子課件 第7章 Java事件處理模型_第1頁
Java語言程序設計電子課件 第7章 Java事件處理模型_第2頁
Java語言程序設計電子課件 第7章 Java事件處理模型_第3頁
Java語言程序設計電子課件 第7章 Java事件處理模型_第4頁
Java語言程序設計電子課件 第7章 Java事件處理模型_第5頁
已閱讀5頁,還剩78頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

WindowEvent類對應的是窗口事件,主要發生在窗口被激活、關閉、最小化、恢復等操作時。對應的監聽器接口為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);//退出系統 } publicvoidwindowDeactivated(WindowEvente){} publicvoidwindowDeiconified(WindowEvente){} publicvoidwindowIconified(WindowEvente){} publicvoidwindowOpened(WindowEvente){}}【例7-3】創建窗口,點擊標題欄中的按鈕,實現窗體的關閉。

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); //注冊窗口監聽器 } publicvoidwindowClosing(WindowEvente){ System.exit(0); //退出系統 }}【例7-4】用事件適配器完成窗口關閉功能

監聽器實現的不同方法7.1.3內部類實現監聽器

類實現本類組件的監聽器內部類實現監聽器匿名類實現監聽器

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

7.2.1鼠標拖動小球游戲7.2事件處理案例

(1)創建窗體對象f、面板對象p、顯示一個直徑為30像素的紅色小球。(2)為小球注冊鼠標的監聽事件(3)創建一個鼠標監聽器類實現鼠標移動監聽接口(4)在鼠標監聽器的鼠標移動方法中,獲取鼠標當前位置,然后在鼠標的位置重新將小球畫出來。實現鼠標拖動小球的工作。1.設計思路(1)如何注冊鼠標監聽器?(2)如何判斷當前鼠標的位置?【解決問題1】首先讓面板類實現鼠標監聽器接口,然后為面板類對象p注冊一個鼠標拖動的監聽器,也就是自身。p.addMouseMotionListener(p);【解決問題2】在鼠標監聽器中,有固定的方法獲取鼠標當前位置。鼠標事件e通過getX()方法,可以獲得鼠標當前位置的X軸坐標;鼠標事件e通過getY()方法,可以獲得鼠標當前位置的Y軸坐標;因此鼠標的當前位置(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);//鼠標拖動 w.addWindowListener(newCloseWin());//關閉按鈕 w.add(p); w.setVisible(true);}}3.程序實現classMyPanelextendsPanelimplementsMouseMotionListener{ intx=30; inty=30; publicvoidpaint(Graphicsg){ g.setColor(Color.red);//設置小球為紅色 g.fillOval(x,y,30,30);//繪制一個直徑為30像素的球 } publicvoidmouseDragged(MouseEvente){ x=e.getX();//獲取鼠標所在的坐標位置 y=e.getY(); repaint();//重畫界面 } publicvoidmouseMoved(MouseEvente){}}classCloseWinextendsWindowAdapter//創建窗體監聽器{ publicvoidwindowClosing(WindowEvente){ System.exit(0);//退出系統 }}7.2.2彈球游戲

(1)創建窗體對象frame,在窗體上繪制一個小球。(2)通過循環控制小球的橫、縱坐標在窗體寬度和高度范圍內按當前移動方向變化。(3)引入線程,通過線程控制小球的移動,在小球撞墻的那一刻,改變小球移動方向。(4)當小球撞擊界面的下邊緣時,判定木棒是否接住了小球。如果接住了,小球正常彈回,如果沒有接住,游戲結束。1.設計思路(1)如何畫一個木棒?(2)如何判定木棒接住了小球?(3)如何結束程序,顯示gameover?【解決問題1】通過繪制一個矩形,實現在界面上畫出一個木棒。設置矩形的長度和高度,顯示木棒的長短和粗細。g.fillRect(xp,yp,w,h);【解決問題2】通過設置一個布爾型的變量flag,判斷每次小球撞擊下邊界的位置是否在木棒出現的范圍內。如果正好在區域內,說明木棒接住了小球,布爾值flag為真,否則,木棒沒有接住小球,布爾值flag為假。2.遇到問題if(小球左邊界+直徑>=木棒的起始位置&&小球左邊界<=木棒的右邊界) {小球正常彈回;} else{ flag=false;用break結束循環; }【解決問題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//匿名類實現窗體監聽接口 publicvoidwindowClosing(WindowEvente){ //TODOAuto-generatedmethodstub System.exit(0); } }); t.start();//啟動線程 f.setSize(500,550); f.add(p); f.setVisible(true);//窗口可見 }}3.程序實現classMyPanelextendsPanelimplementsRunnable,KeyListener{ privateintx=20; privateinty=20;//小球出現的起始位置 privateintxp=200; privateintyp=448;//木棒出現的起始位置 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){//如果沒接住小球,程序結束 g.setFont(newFont("",Font.BOLD,40)); g.drawString("gameover",50,50); } }

publicvoidrun(){ intix=2; intiy=4; while(true){//小球四個方向進行彈球 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){//在鍵盤按下方法中實現木棒移動 intkc=e.getKeyCode(); if(kc==37||kc=='a'){ xp-=10;//如果是左箭頭或者字母a鍵,木棒向左移動 }elseif(kc==39||kc=='d'){ xp+=10;//如果是右箭頭或者字母d鍵,木棒向右移動 } repaint(); } publicvoidkeyReleased(KeyEvente){ } publicvoidkeyTyped(KeyEvente){}}美國斷芯可能會給中興帶來困難,甚至造成中興倒閉,然而對于擁有世界上最完整工業體系的中國來說,豈是誰斷貨就能休克得了的。從空間站、探月、北斗導航、通訊衛星、高清探測遙感衛星、氣象衛星、廣播電視衛星、量子通訊衛星、鵲橋號中繼星,悟空暗物質探測衛星,到洲際彈道導彈、關島快遞東風26航母殺手、艦艦導彈、空地導彈、反導系統、反隱身雷達、以及水下飛行器;從殲20、運20、直20、預警機、察打一體無人機、世界首款第六代無人隱身戰斗機,到戰略導彈核潛艇、萬噸級驅逐艦、航母、深潛技術、電磁炮、電磁推進和電磁彈射技術、深潛技術、乘波體高超音速飛行器、以及現代化的兩彈;凡是世界上有的主要工業產業,中國都有,而且大部分都已經達到或接近世界先進水平。我們既要承認差距,也要充滿自信,我們既要樹立遠大目標,也要腳踏實地從當下做起。課后閱讀:中國人要敢于正視差距,但更要自信。7.3.1AWT工具集簡介7.3AWT工具集和Swing組件

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

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

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

在AWT的基礎上構建的一套新的圖形用戶界面系統,采用純Java語言編寫,包含AWT所提供的所有功能。這些Swing組件位于javax.swing包中,成為JDK基礎類庫的一部分。它不依賴于本地操作系統的圖形用戶界面,可以做到跨平臺運行。絕大多數的Swing組件派生自JCompomnent類,Swing組件的類層次結構如圖7-11所示。頂層容器包括JFrame、JApplet、JDialog。(1)JFrameJFrame類用于創建Swing窗口對象。它的用法與Frame用法類似。但是二者最大的區別是,JFrame不能直接通過add()方法加入組件,也不能直接通過setLayout()方法設置布局。1.頂層容器第一步:獲取窗口的內容面板JFramejf=newJFrame();Containerc=jf.getContentPane();第二步:對內容面板設置布局(Container的默認布局是BorderLayout)c.setLayout(newFlowLayout());//設置順序布局第三步:將組件加入到內容面板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);//設置窗口的位置和尺寸 jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);

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

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

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

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

【7-14】下拉列表框示例 title.setFont(newFont("黑體",Font.BOLD,28));//設置字體 c.add(title); c.add(jcb); jcb.addItemListener(this);//為下拉列表注冊監視器 c.add(jl); jf.setVisible(true);} publicvoiditemStateChanged(ItemEvente){ //監視器實現jl.setText("您選擇的是:"+jcb.getSelectedItem().toString());//獲取選項 } publicstaticvoidmain(String[]args){ newExample7_14(); }}importjava.awt.*;importjavax.swing.*;importjavax.swing.event.*;//事件所在包publicclassExample7_15implementsListSelectionListener{ JFramejf=newJFrame("列表框示例"); Stringselect[]={"香蕉","菠蘿","蘋果","柚子"};// JLabeljl1=newJLabel("請選擇您喜歡的水果:"); JLabeljl2=newJLabel(); JListjlist=newJList(select);//創建列表,列表項來自select數組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);//為列表注冊監視器 jf.setVisible(true); } publicvoidvalueChanged(ListSelectionEvente){ StringBuffers=newStringBuffer();//創建緩沖字符串 Objectobj[]; obj=jlist.getSelectedValues();//獲得多個選項,返回值為object數組 for(inti=0;i<obj.length;i++){ s.append(obj[i].toString()+"");//將數組值逐個取出轉為String類型,逐個追加 } jl2.setText("您選擇了:"+s); } publicstaticvoidmain(String[]args){ newExample7_15(); }}菜單是圖形用戶界面常用的一種組件,主要有兩種形式:一種是基于菜單條的,一般加在JFrame組件上,一種是單擊右鍵的彈出式菜單。(1)菜單條菜單菜單條菜單由三部分組成:菜單(JMenu)、菜單條(JMenuBar)、菜單項(JMenuItem)。上述三者的關系是:JMenu必須放在一個JMenuBar上,JMenuItem必須放在一個JMenu上,JMenu的子項可以是JMenu、JMenuItem和分隔符。(2)彈出式菜單JPopupMenu彈出式菜單是一種特殊形式的菜單,其性質與菜單幾乎相同。但是彈出式菜單并不固定在窗口的任何一個位置,而是由鼠標和系統判斷決定位置。彈出式菜單發生在用戶按下或松開鼠標右鍵時觸發MouseEvent事件。7.菜單JMenu7.4.1順序布局順序布局(FlowLayout)是最基本的一種布局,對應于java.awt.FlowLayout類。Panel及其子類的默認布局方式均為順序布局。順序布局是指根據顯示區域的大小,把組件按照從左到右的順序排列,一行排滿后就轉到下一行繼續排列,直到把所有組件都顯示出來。在順序布局方式下,組件使用容器的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());//設置窗口的布局為順序布局 f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5); f.setVisible(true); }}【例7-17】使用順序布局放5個按鈕邊界布局(BorderLayout)是一種簡單的布局策略,對應于java.awt.BorderLayout類。Window及其子類(Frame、Dialog)的默認布局方式均為邊界布局。邊界布局將一個容器分為5個部分:東、南、西、北、中。這幾部分的分布規律是“上北下南,左西右東”。東南西北四個邊界內的組件占據了它們所需的盡可能多的空間,中間區域則占據了剩余的全部空間。每加入一個組件都應該指明把這個組件加在哪個區域中,區域由BorderLayout中的靜態常量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();//創建邊界布局對象 f.setLayout(bor);//為窗口設置邊界布局 //將五個按鈕按照方向依次放入窗口對應的五個區域 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個按鈕組件網格布局(GridLayout)是一種使用較多的布局,對應于java.awt.GridLayout類。網格布局是指將一個容器分成若干個網格,將組件安放到網格的行和列中。組件首先被添加到網格的第一行的第一個單元,向右繼續排列。當第一行內所有的單元都被占滿時,下一個組件被添加到網格第二行的第一個單元,以此類推。7.4.3網格布局importjava.awt.*;publicclassExample7_19{ publicstaticvoidmain(String[]args){ Framef=newFrame("網格布局示例"); GridLayoutgri=newGridLayout(3,3);//3行3列的網格 f.setSize(300,200); f.setLayout(gri); for(inti=1;i<=9;i++){ f.add(newButton("按鈕"+i)); } f.setVisible(true); }}【7-19】創建一個具有3行3列的網格卡片布局(CardLayout)可以容納多個組件。對應于java.awt.CardLayout類。卡片布局是指將組件像卡片一樣疊放起來,在任何時候只有一張卡片是可見的,就像一疊“撲克牌”一樣,這個被顯示的組件將占據容器的整個空間。7.4.4卡片布局假設有容器f,使用CardLayout的步驟如下:(1)創建CardLayout對象作為布局,如:CardLayoutcard=newCardLayout();(2)容器使用setLayout方法設置布局,如:f.setLayout(card);(3)容器調用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);

//設置卡片布局,水平間距為10,垂直間距為5 Buttonb1=newButton("1號卡片"); Buttonb2=newButton("2號卡片"); Buttonb3=newButton("3號卡片"); f.setSize(300,200); f.setLayout(card); f.add("1",b1);//將b1加入f中,設置代號為"1" f.add("2",b2);//將b2加入f中,設置代號為"2" f.add("3",b3);//將b3加入f中,設置代號為"3" card.show(f,"2");//卡片布局顯示第二張卡片 f.setVisible(true); }}【7-20】創建一個卡片布局,并顯示第二張卡片首先用戶先進行登錄,通過服務器的驗證,登錄到服務器上。顯示當前在線的用戶,雙擊某個用戶名,可以與該用戶互相發送信息,發送文件。當某個用戶退出登錄后,在其他用戶列表上顯示該用戶不在線。7.5圖形用戶界面案例(1)在工程的src文件夾中創建p1文件夾,分別創建三個java文件,登錄界面Chat_Login.java、聯系人界面Chat_Contact.java、聊天界面Chat_Main.java。(2)登錄界面Chat_Login.java的窗體布局整體采用邊界布局,用戶名、密碼組件放置在面板p1中,并將p1放在窗體的Center位置,將三個按鈕放在面板p2中,并將P2放在面板的South位置。(3)為兩個按鈕注冊監聽器。當點擊“登錄”按鈕時,將用戶名、密碼與先前設定的值進行比較,匹配則顯示信息成功,否則顯示信息失敗。當點擊“取消”按鈕,退出系統。(4)聯系人界面Chat_Contact.java的窗體布局整體采用邊界布局。分為北邊和中間兩部分。分別放置兩個面板p1和p2。P1采用流布局,只放置一個“聯系人:”按鈕;P2采用網格布局,3行1列,放置3個聯系人按鈕。(5)聊天界面Chat_Main.java的窗體整體采用邊界布局,中間部分放一個JTextArea組件,在南邊的位置放一個面板p。面板p采用網格布局,1行2列,依次放JTextField組件和JButton組件。1.設計思路(1)點擊登錄按鈕后,如果登錄成功,如何顯示聯系人界面?(2)聯系人是如何添加到聯系人界面上的?(3)點擊一個聯系人a2,如何彈出聊天界面?2.遇到問題【解決問題1】當登錄成功后,創建聯系人界面Chat_Contact的對象wmain,設置該對象可見,同時讓登錄界面不可見。Chat_Contactwmain=newChat_Contact(); wmain.setVisible(true); this.setVisible(false);【解決問題2】正常情況下,聯系人應該從數據庫中提取,現在先用一個JLabel的數據顯示a1、a2和a3三個標簽來代替。到第十章,再修改這部分代碼。同時給每個按鈕注冊監聽器。for(inti=0;i<3;i++){ jl[i]=newJLabel(); jl[i].setText("a"+(i+1)); jl[i].addMouseListener(this);}【解決問題3】在鼠標點擊事件中,判斷如果點擊了標簽,創建聊天界面Chat_Main的對象cm,設置該對象可見。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論