版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章Java的圖形用戶界面設(shè)計(jì)
本章主要內(nèi)容:AWT與Swing包——了解容器:框架和面板——重點(diǎn)布局管理——重點(diǎn),難點(diǎn)事件處理——難點(diǎn)17.1AWT與Swing
AWT
(AbstractWindowToolkit)
Java抽象窗口工具集Swing由于AWT功能有限,因此在后來(lái)的JDK版本中,又提供了功能更強(qiáng)的Swing。Swing屬于JavaTMFoundationClasses(簡(jiǎn)稱JFC)的一部分,JFC包含了一組幫助程序員創(chuàng)建圖形用戶界面的功能。2AWT類的層次模型
ComponentContainerPanelAppletWindow
FrameDialogButtonTextFieldTextAreaTextComponentCheckboxMenuComponentMenuMenuItemMenuBar其他組件
獨(dú)立不獨(dú)立3SWING中主要類的繼承關(guān)系
47.2容器Java的圖形用戶界面由組件構(gòu)成,例如按鈕(button)、文本輸入框(textfield)、標(biāo)簽(label)等都是組件。所有組件都必須包含在某個(gè)容器中,而有些容器是可以嵌套的。51頂層容器
四種頂層容器:JFrame、JApplet、JDialog和JwindowJFrame是一個(gè)帶有標(biāo)題行和控制按鈕(最小化、恢復(fù)/最大化、關(guān)閉)的獨(dú)立窗口,創(chuàng)建應(yīng)用程序時(shí)需要使用。JApplet是創(chuàng)建小應(yīng)用程序時(shí)使用,它被包含在瀏覽器窗口中。JDialog是在創(chuàng)建對(duì)話框時(shí)使用。JWindow是一個(gè)不帶有標(biāo)題行和控制按鈕的窗口,因此通常很少使用。62面板(JPanel)面板(JPanel)是一種用途廣泛的容器,但與頂層容器不同的是,面板不能獨(dú)立存在,必須被添加到某種頂層容器內(nèi)部。面板可以嵌套,由此可以設(shè)計(jì)出復(fù)雜的圖形用戶界面。73內(nèi)容窗格每種頂層容器都有一個(gè)默認(rèn)的內(nèi)容窗格(Content
Pane)。頂層容器中的所有組件(除菜單外)都必須放在內(nèi)容窗格中??梢詫⒚姘澹↗Panel)設(shè)為某個(gè)頂層容器的內(nèi)容窗格,然后再將組件放到面板中。84組件放入缺省內(nèi)容窗格通過(guò)頂層容器的getContentPane()方法獲得其缺省的內(nèi)容窗格,然后將組件添加到內(nèi)容窗格中。方式1:ContainercontentPane=frame.getContentPane();contentPane.add(button,BorderLayout.CENTER);方式2:frame.getContentPane().add(button,BorderLayout.CENTER);94使用JFrame創(chuàng)建應(yīng)用程序示例
程序7-1105將組件放入面板內(nèi)容窗格創(chuàng)建一個(gè)面板(JPanel)的實(shí)例,再通過(guò)頂層容器的setContentPane()方法將JPanel實(shí)例設(shè)置為新的內(nèi)容窗格,取代頂層容器缺省的內(nèi)容窗格(程序7-2)。典型的代碼:JPanelcontentPane=newJPanel();contentPane.setLayout(newBorderLayout());contentPane.add(button,BorderLayout.CENTER);frame.setContentPane(contentPane);11注意因此可能需要為JPanel實(shí)例設(shè)置一個(gè)BorderLayout布局管理器
12程序7-3創(chuàng)建一個(gè)黃色面板,通過(guò)add()方法在面板中添加了一個(gè)按鈕,然后將該面板添加到一個(gè)JFrame的實(shí)例中,JFrame實(shí)例的背景被設(shè)置為藍(lán)綠色。importjava.awt.*;importjavax.swing.*;publicclassFrameWithPanel{ publicstaticvoidmain(Stringargs[]){ JFrameframe=newJFrame("FramewithPanel"); ContainercontentPane=frame.getContentPane(); contentPane.setBackground(Color.CYAN);
JPanelpanel=newJPanel();
panel.setBackground(Color.yellow);
JButtonbutton=newJButton("Pressme"); panel.add(button);
contentPane.add(panel,BorderLayout.SOUTH); frame.setSize(300,200); frame.setVisible(true); }}
137.3布局布局:指的是容器內(nèi)組件的位置和大小放置安排,通常由布局管理器(LayoutManager)負(fù)責(zé)安排。每種容器都有一個(gè)缺省的布局方式,但可以通過(guò)容器的setLayout()方法改變?nèi)萜鞯牟季止芾砥鳌?4常見(jiàn)的布局管理器常見(jiàn)的布局管理器java.awt.FlowLayout
流式布局java.awt.BorderLayout邊界布局java.awt.GridLayout
網(wǎng)格布局java.awt.CardLayout
卡片式布局javax.swing.BoxLayout盒式布局注意:頂層容器缺省的布局管理器是BorderLayout,而JPanel缺省的布局管理器是FlowLayout。15程序7-4importjava.awt.*;importjavax.swing.*;
publicclassExGui{ privateJFrameframe; privateJButtonb1; privateJButtonb2;
publicstaticvoidmain(Stringargs[]){ ExGuithat=newExGui();
that.go(); }
16程序7-4publicvoidgo(){frame=newJFrame("GUIexample"); //創(chuàng)建一個(gè)JFrame實(shí)例ContainercontentPane=frame.getContentPane();//獲取內(nèi)容窗格
//為內(nèi)容窗格設(shè)置FlowLayout布局管理器contentPane.setLayout(newFlowLayout());
b1=newJButton("Pressme");//創(chuàng)建JButton實(shí)例b2=newJButton("Don'tpressMe");
contentPane.add(b1);//添加按鈕contentPane.add(b2);
frame.pack();frame.setVisible(true); }}171FlowLayout布局管理器
FlowLayout定義在java.awt包中。布局方式:將組件逐個(gè)地安放在容器中的一行上,一行放滿后就自動(dòng)另起一個(gè)新行。在缺省情況下,將組件居中放置在容器的某一行上。
FlowLayout布局管理器并不強(qiáng)行設(shè)定組件的大小,布局管理器可以通過(guò)調(diào)用getPreferredSize()方法取得每個(gè)組件希望的大小。
18FlowLayout構(gòu)造方法
publicFlowLayout()publicFlowLayout(intalign)publicFlowLayout(intalign,inthgap,intvgap)參數(shù)說(shuō)明:align:有FlowLayout.LEFT、FlowLayout.RIGHT和FlowLayout.CENTER三種形式。hgap和vgap:組件的水平間距和垂直間距。19程序7-5程序7-5202BorderLayout布局管理器
由BorderLayout管理的容器被劃分成北(North)南(South)西(West)東(East)中(Center)五個(gè)區(qū)域,分別代表容器的上、下、左、右和中部,用常量BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.EAST、BorderLayout.CENTER表示。21BorderLayout構(gòu)造方法BorderLayout()構(gòu)造一個(gè)各部分間間距為0的BorderLayout實(shí)例。
BorderLayout(int,int)構(gòu)造一個(gè)各部分間具有指定間距的BorderLayout實(shí)例。22組件加入規(guī)則
frame=newJFrame(“FrameTitle”);button=newJButton(“PressMe”);frame.getContentPane().add(b,BorderLayout.SOUTH);
1、在BorderLayout布局管理器的管理下,組件必須通過(guò)add()方法加入到容器中的指定區(qū)域。例如:232、如果在add()方法中沒(méi)有指定將組件放到哪個(gè)區(qū)域,那么它將會(huì)缺省地被放置在Center區(qū)域。frame.getContentPane().add(button);按鈕將被放在框架的中部例如:243、在容器的每個(gè)區(qū)域只能加入一個(gè)組件,如果向某個(gè)區(qū)域中加入多個(gè)組件,那么只有最后一個(gè)組件是有效的。frame.getContentPane().add(newJButton(“buttonA”),BorderLayout.SOUTH);frame.getContentPane().add(newJButton(“buttonB”),BorderLayout.SOUTH);frame.getContentPane().add(newJButton(“buttonC”),BorderLayout.SOUTH);最后只有buttonC顯示在South區(qū)域。
例如:25如果希望在某個(gè)區(qū)域顯示多個(gè)組件,可以首先在該區(qū)域放置一個(gè)內(nèi)部容器——JPanel組件,然后將所需的多個(gè)組件放到JPanel中,通過(guò)內(nèi)部容器的嵌套構(gòu)造復(fù)雜的布局。四個(gè)邊界區(qū)域(North、South、West、East
)如果有些沒(méi)有使用,大小將變?yōu)榱悖?/p>
Center區(qū)域?qū)?huì)擴(kuò)展并占據(jù)這個(gè)未用區(qū)域的位置。如果均沒(méi)有使用,
Center區(qū)域?qū)?huì)占據(jù)整個(gè)窗口.注意26程序7-6程序7-6當(dāng)窗口大小改變時(shí),窗口中按鈕的相對(duì)位置并不會(huì)發(fā)生變化,但按鈕的大小會(huì)改變。
273GridLayout布局管理器布局方式:是一種網(wǎng)格式的布局管理器,它將容器空間劃分成若干行乘若干列的網(wǎng)格,組件依次放入其中,每個(gè)組件占據(jù)一格。網(wǎng)格每列的寬(高)度都是相同的,這個(gè)寬度大致等于容器的寬度除以網(wǎng)格的列(行)數(shù)。28組件被放入容器的次序決定了它所占據(jù)的位置。每行網(wǎng)格從左至右依次填充,一行用完之后轉(zhuǎn)入下一行當(dāng)容器的大小改變時(shí),GridLayout所管理的組件的相對(duì)位置不會(huì)發(fā)生變化,但組件的大小會(huì)隨之改變。29GridLayout構(gòu)造方法publicGridLayout():創(chuàng)建一個(gè)只有一行的網(wǎng)格,網(wǎng)格的列數(shù)根據(jù)實(shí)際需要而定。publicGridLayout(introws,intcols)其中:rows和cols分別指定網(wǎng)格的行數(shù)和列數(shù)
rows和cols中的一個(gè)值可以為0,但是不能兩個(gè)都是0。publicGridLayout(introws,intcols,inthgap,intvgap)其中:hgap和vgap分別表示網(wǎng)格間的水平間距和垂直間距
30程序7-7程序7-7
314CardLayout布局管理器
布局方式:是一種卡片式的布局管理器,它將容器中的組件處理為一系列卡片,每一時(shí)刻只顯示出其中的一張。在javax.swing包中定義了JTabbedPane類,它的使用效果與CardLayout類似但更為簡(jiǎn)單。32
CardLayout常用方法常用方法:1.publicvoidfirst(Containerparent)
顯示第一張卡片。2.publicvoidlast(Containerparent)3.publicvoidnext(Containerparent)循環(huán)顯示下一張。4.publicvoidprevious(Containerparent)33程序7-8為JFrame實(shí)例的內(nèi)容窗格指定了一個(gè)CardLayout類型的布局管理器,然后向其中加入了五張卡片,每張卡片都是JPanel類的一個(gè)實(shí)例,并且具有不同的背景色。每當(dāng)在程序窗口按動(dòng)鼠標(biāo),下一張卡片就會(huì)顯示出來(lái)。程序7-8345BoxLayout布局管理器
BoxLayout是定義在javax.swing包中的布局管理器。
布局方式:它將容器中的組件按水平方向排成一行或按垂直方向排成一列。當(dāng)組件排成一行時(shí),每個(gè)組件可以有不同的寬度;當(dāng)組件排成一列時(shí),每個(gè)組件可以有不同的高度。35BoxLayout構(gòu)造方法BoxLayout(Containertarget,intaxis)其中:參數(shù)target:指明是為哪個(gè)容器設(shè)置布局管理器。參數(shù)axis:指明組件的排列方向,BoxLayout.X_AXIS
水平方向排列
BoxLayout.Y_AXIS
垂直方向排列
36程序7-9
程序7-9
376Box類—與BoxLayout相似Box類定義在javax.swing包中,該類提供了靜態(tài)的方法可用來(lái)創(chuàng)建水平或者垂直方向的BoxLayout。具體方法如下:①publicstaticBoxcreateHorizontalBox()
使用使用水平方向的BoxLayout②publicstaticBoxcreateVerticalBox()
使用垂直方向的BoxLayout38Box類還提供了一些方法,用來(lái)創(chuàng)建一些不可見(jiàn)的組件,以增加可見(jiàn)組件之間的間距。具體如下:①publicstaticComponentcreateHorizontalGlue()②publicstaticComponentcreateVerticalGlue()③publicstaticComponentcreateHorizontalStrut(intwidth)④publicstaticComponentcreateVerticalStrut(intheight)⑤publicstaticComponentcreateRigidArea(Dimensiond)
39程序7-10,7-11
程序7-10改寫7-9,使用Box容器
程序7-11演示Glue和Strut的效果
GlueStrutRigidBox1是沒(méi)有添加不可見(jiàn)組件時(shí)的形式,Box2、3和4是分別添加了不可見(jiàn)組件Glue、Strut和Rigid之后的形式,從中可以看出,Glue將填滿所有剩余水平(或垂直)空間,Strut和Rigid則具有指定的寬度(或高度)
407其他布局管理器GridBagLayout布局管理器
java.awt中定義。以網(wǎng)格為基礎(chǔ),允許組件使用最適當(dāng)?shù)拇笮?,既可以占多行,也可以占多列,各組件可以有不同的高度和寬度。
SpringLayout等布局管理器
javax.swing中定義。418不使用布局管理器1調(diào)用容器的setLayout(null)方法,將布局管理器設(shè)置為空。2調(diào)用組件的setBounds()方法,設(shè)置組件的位置和大小42setBounds()方法的格式:
setBounds(intx,inty,intwidth,intheight)其中:
前兩個(gè)int型參數(shù)用于設(shè)置組件的坐標(biāo)位置;后兩個(gè)int型參數(shù)用于設(shè)置組件的寬度和高度
43不使用布局管理器的例子
程序7-12447.4事件處理
用戶事件(Event):
用戶在程序界面所進(jìn)行的操作。Java中定義了很多事件類,用于描述不同的用戶行為。例如:MouseEvent類:鼠標(biāo)事件
KeyEvent類:鍵盤事件
ActionEvent類:操作事件
45①在組件上進(jìn)行某種操作,事件處理系統(tǒng)便會(huì)生成一個(gè)事件類對(duì)象;②每類事件都對(duì)應(yīng)一個(gè)listener監(jiān)聽(tīng)程序接口,它規(guī)定了接收并處理該類事件的方法規(guī)范。③組件通過(guò)addXXXListener()方法注冊(cè)相應(yīng)的事件處理的監(jiān)聽(tīng)程序。事件處理模型46程序7-13
一個(gè)ActionEvent事件處理的例子:
用到一個(gè)帶單個(gè)按鈕的框架,按鈕組件注冊(cè)了一個(gè)ButtonHandler對(duì)象作為ActionEvent事件的監(jiān)聽(tīng)程序,而ButtonHandler類實(shí)現(xiàn)了ActionListener接口,在該類的actionPerformed()方法中給出了ActionEvent事件是如何處理的。當(dāng)用戶單擊按鈕時(shí),產(chǎn)生ActionEvent事件,該方法將會(huì)被調(diào)用。程序7-13
47程序7-14事件的監(jiān)聽(tīng)程序也可以定義在組件類中。程序7-1448MyButton類
importjavax.swing.*;importjava.awt.event.*;
publicclassMyButtonextendsJButtonimplementsActionListener{ publicMyButton(Stringtext){ super(text);
//注冊(cè)事件的監(jiān)聽(tīng)程序
addActionListener(this); }
//出現(xiàn)ActionEvent事件時(shí),將結(jié)束程序的運(yùn)行
publicvoidactionPerformed(ActionEvente){ System.exit(0); }}
MyButton組件繼承JButton,同時(shí)實(shí)現(xiàn)ActionListener接口,因此MyButton組件對(duì)象也可作事件監(jiān)聽(tīng)程序
通過(guò)addActionListener(this)將自身注冊(cè)為自己的監(jiān)聽(tīng)程序
497.4.2事件的種類java.awt.event和javax.swing.event包中定義了很多事件。
每種事件都有一個(gè)對(duì)應(yīng)的接口,接口中聲明了一個(gè)或多個(gè)抽象的事件處理方法,凡是需要接收并處理事件對(duì)象的類,必須實(shí)現(xiàn)接口中的全部抽象方法。
50常用事件類型及接口
鼠標(biāo)拖動(dòng)和移動(dòng)鼠標(biāo)按下、松開(kāi)、進(jìn)入、離開(kāi)、單擊鍵按下、松開(kāi)、鍵入5152537.4.3程序7-15
程序功能:檢測(cè)鼠標(biāo)的拖動(dòng)、鼠標(biāo)進(jìn)入和離開(kāi)窗口的情況。
程序中TwoListener類同時(shí)實(shí)現(xiàn)MouseMotionListener和MouseListener兩個(gè)接口中的全部方法。f.addMouseListener(this);f.addMouseMotionListener(this);547.4.4多監(jiān)聽(tīng)程序的概念
事件監(jiān)聽(tīng)模式允許為一個(gè)組件注冊(cè)多個(gè)監(jiān)聽(tīng)程序。
允許根據(jù)需要多次調(diào)用addListener()方法為某個(gè)組件的同一事件注冊(cè)多個(gè)不同的監(jiān)聽(tīng)程序,當(dāng)事件發(fā)生時(shí),所有相關(guān)的監(jiān)聽(tīng)程序都會(huì)被調(diào)用,但調(diào)用順序是不確定的。
557.4.5事件適配器類
為了編程方便,Java為一些Listener接口提供了相對(duì)應(yīng)的適配器(Adapter)類,在適配器類中已經(jīng)實(shí)現(xiàn)了相應(yīng)接口中的全部方法,只是這些方法的內(nèi)容為空。用戶可以根據(jù)需要重寫其中有用的方法。
例如:MouseListener接口publicinterfaceMouseListenerextendsEv
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年高檔打印裝置合作協(xié)議書
- 2024年X50以上系列管線鋼項(xiàng)目建議書
- Unit 2 知識(shí)梳理 人教版英語(yǔ)八年級(jí)上冊(cè)
- 2024年室內(nèi)環(huán)保檢測(cè)儀器項(xiàng)目合作計(jì)劃書
- 2024年口服降血糖藥合作協(xié)議書
- 2023屆新高考新教材化學(xué)人教版一輪學(xué)案-第二章第2講 氧化還原反應(yīng)
- 玉溪師范學(xué)院《國(guó)際貿(mào)易》2022-2023學(xué)年第一學(xué)期期末試卷
- 玉溪師范學(xué)院《不動(dòng)產(chǎn)估價(jià)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鹽城師范學(xué)院《展示技術(shù)與應(yīng)用》2022-2023學(xué)年第一學(xué)期期末試卷
- 鹽城師范學(xué)院《幼兒社會(huì)教育與活動(dòng)指導(dǎo)》2021-2022學(xué)年第一學(xué)期期末試卷
- 談?wù)劰舱攮h(huán)境對(duì)公共政策的影響
- 專利文獻(xiàn)檢索方法與步驟課件
- 三年級(jí)數(shù)學(xué)期中測(cè)質(zhì)量分析課件
- 第5講-申論大作文課件
- 大咯血的護(hù)理及急救課件
- 讀《學(xué)生的精神》有感
- Module 5 Museums模塊測(cè)試題二(含答案)(外研版九年級(jí)上冊(cè))
- 張家爺爺?shù)男』ü?
- 怎樣通知最快(課件)五年級(jí)下冊(cè)數(shù)學(xué)人教版
- 《通用量具培訓(xùn)》教材課件
- 第五章量綱分析和相似原理
評(píng)論
0/150
提交評(píng)論