Java的圖形用戶界面設(shè)計(jì)課件_第1頁
Java的圖形用戶界面設(shè)計(jì)課件_第2頁
Java的圖形用戶界面設(shè)計(jì)課件_第3頁
Java的圖形用戶界面設(shè)計(jì)課件_第4頁
Java的圖形用戶界面設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java的圖形用戶介面設(shè)計(jì)

AWT與Swing

AWT

Java抽象窗口工具集(AbstractWindowToolkit,簡稱AWT)SwingSwing屬於JavaTMFoundationClasses(簡稱JFC)的一部分,JFC包含了一組幫助程式員創(chuàng)建圖形用戶介面的功能。AWT功能有限,因此在後來的JDK版本中,又提供了功能更強(qiáng)的Swing

AWT類與繼承關(guān)係

ComponentContainerPanelAppletWindow

FrameDialogButtonTextFieldTextAreaTextComponentCheckboxMenuComponentMenuMenuItemMenuBar其他組件

獨(dú)立不獨(dú)立SWING中主要類的繼承關(guān)係

Swing與AWT不同

Swing組件在實(shí)現(xiàn)時(shí)不包含任何本地(native)代碼

Swing組件可以不受硬體平臺(tái)的限制,而具有更多的功能

Swing被稱為“羽量級(jí)(lightweight)”組件,AWT稱為“重量級(jí)(heavyweight)”組件

“重量級(jí)”組件與“羽量級(jí)”組件一同使用時(shí),如果組件區(qū)域有重疊,則“重量級(jí)”組件總是顯示在上面

Swing組件的是具有狀態(tài)(state)的組件

容器Java的圖形用戶介面由組件構(gòu)成,例如按鈕(button)、文本輸入框(textfield)、標(biāo)籤(label)等都是組件,其中有一類特殊的組件稱為容器(container),例如框架(frame)、面板(panel)等。容器是組件的容器,各種組件(包括容器)可以通過add()方法添加到容器中

頂層容器

頂層(Top

level)容器所有組件都必須包含在某個(gè)容器中,而有些容器是可以嵌套的,在這個(gè)嵌套層次的最外層,必須是一個(gè)頂層(Toplevel)容器四種頂層容器JFrame、JApplet、JDialog和JwindowJFrame是一個(gè)帶有標(biāo)題行和控制按鈕(最小化、恢復(fù)/最大化、關(guān)閉)的獨(dú)立窗口,創(chuàng)建應(yīng)用程式時(shí)需要使用JFrame。創(chuàng)建小應(yīng)用程式時(shí)使用JApplet,它被包含在流覽器窗口中。創(chuàng)建對(duì)話框時(shí)使用JDialog。JWindow是一個(gè)不帶有標(biāo)題行和控制按鈕的窗口,因此通常很少使用

JFrame創(chuàng)建應(yīng)用程式

程式7-1內(nèi)容窗格頂層容器都有一個(gè)內(nèi)容窗格(Content

Pane)頂層容器中除菜單之外的組件都是放在這個(gè)內(nèi)容窗格中

將組件放入內(nèi)容窗格通過頂層容器的getContentPane()方法獲得其缺省的內(nèi)容窗格,然後將組件添加到內(nèi)容窗格中

ContainercontentPane=frame.getContentPane();

contentPane.add(button,BorderLayout.CENTER);frame.getContentPane().add(button,BorderLayout.CENTER);將組件放入內(nèi)容窗格創(chuàng)建一個(gè)新的內(nèi)容窗格取代頂層容器缺省的內(nèi)容窗格。創(chuàng)建一個(gè)JPanel的實(shí)例,然後將組件添加到JPanel實(shí)例中,再通過頂層容器的setContentPane()方法將JPanel實(shí)例設(shè)置為新的內(nèi)容窗格(程式7-2)JPanel

contentPane=newJPanel();contentPane.setLayout(newBorderLayout());contentPane.add(button,BorderLayout.CENTER);frame.setContentPane(contentPane);注意向頂層容器的內(nèi)容窗格添加組件時(shí),可以直接調(diào)用頂層容器的add()方法,這與調(diào)用內(nèi)容窗格的add()方法是等價(jià)的(從J2SE1.5開始)頂層容器缺省內(nèi)容窗格的佈局管理器是BorderLayout,而JPanel缺省的佈局管理器是FlowLayout,因此可能需要為JPanel實(shí)例設(shè)置一個(gè)BorderLayout佈局管理器

面板(JPanel)面板(JPanel)是一種用途廣泛的容器與頂層容器不同的是,面板不能獨(dú)立存在,必須被添加到其他容器內(nèi)部面板可以嵌套,由此可以設(shè)計(jì)出複雜的圖形用戶介面

程式7-3創(chuàng)建一個(gè)黃色面板,通過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); }}

佈局組件的佈局,包括位置和大小,通常由佈局管理器(LayoutManager)負(fù)責(zé)安排每個(gè)容器都有一個(gè)缺省的佈局管理器通過容器的setLayout()方法改變?nèi)萜鞯膩丫止芾砥鞫喾N佈局管理器java.awt.FlowLayout、java.awt.BorderLayout、java.awt.GridLayout、java.awt.GridBagLayout、java.awt.CardLayout、javax.swing.BoxLayout和javax.swing.SpringLayout

程式7-4importjava.awt.*;importjavax.swing.*;

publicclassExGui{ privateJFrameframe; privateJButtonb1; privateJButtonb2;

publicstaticvoidmain(Stringargs[]){

ExGuithat=newExGui();

that.go(); }

main()方法在這個(gè)例子中,main()方法有兩個(gè)作用。首先,它創(chuàng)建了一個(gè)ExGui類的實(shí)例,在這個(gè)實(shí)例創(chuàng)建之前,並沒有實(shí)際可用的b1和b2資料項(xiàng)目。其次,當(dāng)ExGui實(shí)例創(chuàng)建好以後,main()又調(diào)用了該實(shí)例的go()方法,在這個(gè)方法中,程式的實(shí)際功能得以實(shí)現(xiàn)。

程式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); }}newJFrame(“GUIexample”)這條語句的功能是創(chuàng)建JFrame類的一個(gè)實(shí)例。JFrame

是一個(gè)頂層級(jí)窗口,它帶有標(biāo)題框(標(biāo)題由構(gòu)造方法中的String型參數(shù)“GUIexample”指定)並且可以改變大小。需要注意的是,在剛剛創(chuàng)建時(shí),JFrame的大小為0,並且不可見。frame.getContentPane()這條語句獲取JFrame實(shí)例缺省的內(nèi)容窗格,此後可以修改它的佈局管理器,並添加組件。

contentPane.setLayout(newFlowLayout())這條語句創(chuàng)建了一個(gè)FlowLayout型的佈局管理器,並通過調(diào)用setLayout()方法將該佈局管理器指定給前面已經(jīng)獲得的JFrame實(shí)例的缺省內(nèi)容窗格。

newJButton(“PressMe”)這條語句的功能是創(chuàng)建javax.swing.JButton類的一個(gè)實(shí)例,該實(shí)例是窗口中的標(biāo)準(zhǔn)按鈕(button),按鈕上的標(biāo)籤由構(gòu)造方法中String型參數(shù)“PressMe”指定。

frame.pack()這條語句通知框架frame設(shè)定一個(gè)適當(dāng)?shù)拇笮?,以便能夠以“緊縮”的形式包容各個(gè)組件。為了做到這一點(diǎn),frame需要通知佈局管理器,由佈局管理器安排每個(gè)組件的大小和位置。

frame.setVisible(true)這條語句的功能是使得框架frame以及它所包含的組件對(duì)用戶可見,在此之前,框架和組件雖然已經(jīng)創(chuàng)建好了,但是並沒有顯示出來,只有調(diào)用了setVisible(true)方法後,它們才變?yōu)榭梢姟?/p>

FlowLayout佈局管理器

FlowLayout定義在java.awt包中,F(xiàn)l對(duì)容器中組件進(jìn)行佈局的方式是將組件逐個(gè)地安放在容器中的一行上,一行放滿後就另起一個(gè)新行。在缺省情況下,將組件居中放置在容器的某一行上

FlowLayout佈局管理器並不強(qiáng)行設(shè)定組件的大小,而是允許組件擁有它們自己所希望的尺寸

每個(gè)組件都有一個(gè)getPreferredSize()方法,佈局管理器會(huì)調(diào)用這一方法取得每個(gè)組件希望的大小

FlowLayout構(gòu)造方法

publicFlowLayout()publicFlowLayout(intalign)publicFlowLayout(intalign,int

hgap,int

vgap)align對(duì)齊方式的可選項(xiàng),align的可取值有FlowLayout.LEFT、FlowLayout.RIGHT和FlowLayout.CENTER三種形式

hgap和vgap,可以設(shè)定組件的水準(zhǔn)間距和垂直間距程式7-5程式7-5BorderLayout佈局管理器

BorderLayout是頂層容器中內(nèi)容窗格的缺省佈局管理器由BorderLayout管理的容器被劃分成北(North)南(South)西(West)東(East)中(Center)五個(gè)區(qū)域,分別代表容器的上、下、左、右和中部,用常量BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.EAST、BorderLayout.CENTER表示BorderLayout定義在java.awt包中BorderLayout構(gòu)造方法BorderLayout()

構(gòu)造一個(gè)各部分間間距為0的BorderLayout實(shí)例

BorderLayout(int,int)

構(gòu)造一個(gè)各部分間具有指定間距的BorderLayout實(shí)例

組件加入

frame=newJFrame(“FrameTitle”);button=newJButton(“PressMe”);frame.getContentPane().add(b,BorderLayout.SOUTH);

frame.getContentPane().add(button);

按鈕將被放在框架的中部在BorderLayout佈局管理器的管理下,組件必須通過add()方法加入到容器中的指定區(qū)域

如果在add()方法中沒有指定將組件放到哪個(gè)區(qū)域,那麼它將會(huì)缺省地被放置在Center區(qū)域

在容器的每個(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ū)域。

組件加入如果希望在某個(gè)區(qū)域顯示多個(gè)組件,可以首先在該區(qū)域放置一個(gè)內(nèi)部容器——JPanel組件,然後將所需的多個(gè)組件放到JPanel中,通過內(nèi)部容器的嵌套構(gòu)造複雜的佈局

四個(gè)邊界區(qū)域,如果沒有使用,大小將變?yōu)榱悖?/p>

Center區(qū)域?qū)?huì)擴(kuò)展並佔(zhàn)據(jù)這個(gè)未用區(qū)域的位置。如果均沒有使用,

Center區(qū)域?qū)?huì)佔(zhàn)據(jù)整個(gè)窗口程式7-6程式7-6當(dāng)窗口大小改變時(shí),窗口中按鈕的相對(duì)位置並不會(huì)發(fā)生變化,但按鈕的大小會(huì)改變。

GridLayout佈局管理器GridLayout是一種網(wǎng)格式的佈局管理器,它將容器空間劃分成若干行乘若干列的網(wǎng)格,組件依次放入其中,每個(gè)組件佔(zhàn)據(jù)一格

網(wǎng)格每列的寬(高)度都是相同的,這個(gè)寬度大致等於容器的寬度除以網(wǎng)格的列(行)數(shù)組件被放入容器的次序決定了它所佔(zhàn)據(jù)的位置。每行網(wǎng)格從左至右依次填充,一行用完之後轉(zhuǎn)入下一行當(dāng)容器的大小改變時(shí),GridLayout所管理的組件的相對(duì)位置不會(huì)發(fā)生變化,但組件的大小會(huì)隨之改變GridLayout構(gòu)造方法

publicGridLayout()創(chuàng)建一個(gè)只有一行的網(wǎng)格,網(wǎng)格的列數(shù)根據(jù)實(shí)際需要而定

publicGridLayout(introws,intcols)rows和cols兩個(gè)參數(shù)分別指定網(wǎng)格的行數(shù)和列數(shù)

rows和cols中的一個(gè)值可以為0,但是不能兩個(gè)都是0。如果為0,那麼網(wǎng)格行(列)數(shù)將根據(jù)實(shí)際需要而定publicGridLayout(introws,intcols,int

hgap,int

vgap)hgap和vgap分別表示網(wǎng)格間的水準(zhǔn)間距和垂直間距

程式7-7程式7-7

CardLayout佈局管理器

是一種卡片式的佈局管理器,它將容器中的組件處理為一系列卡片,每一時(shí)刻只顯示出其中的一張

在javax.swing包中定義了JTabbedPane類,它的使用效果與CardLayout類似但更為簡單

程式7-8為JFrame實(shí)例的內(nèi)容窗格指定了一個(gè)CardLayout類型的佈局管理器,然後向其中加入了五張卡片,每張卡片都是JPanel類的一個(gè)實(shí)例,並且具有不同的背景色。每當(dāng)在程式窗口按動(dòng)滑鼠,下一張卡片就會(huì)顯示出來。程式7-8BoxLayout佈局管理器

BoxLayout是定義在javax.swing包中的佈局管理器

它將容器中的組件按水準(zhǔn)方向排成一行或按垂直方向排成一列當(dāng)組件排成一行時(shí),每個(gè)組件可以有不同的寬度;當(dāng)組件排成一列時(shí),每個(gè)組件可以有不同的高度BoxLayout構(gòu)造方法

BoxLayout(Containertarget,intaxis)

Container型參數(shù)target指明是為哪個(gè)容器設(shè)置此BoxLayout佈局管理器

int型參數(shù)axis指明組件的排列方向,BoxLayout.X_AXIS

水準(zhǔn)方向排列

BoxLayout.Y_AXIS

垂直方向排列

程式7-9

程式7-9

Box容器在javax.swing包中定義

創(chuàng)建Box實(shí)例的靜態(tài)方法

publicstaticBoxcreateHorizontalBox()

使用使用水準(zhǔn)方向的BoxLayou

publicstaticBoxcreateVerticalBox()

使用垂直方向的BoxLayout

創(chuàng)建不可見(invisible)組件的方法,可以增加可見組件之間的距離publicstaticComponentcreateHorizontalGlue()publicstaticComponentcreateVerticalGlue()publicstaticComponentcreateHorizontalStrut(intwidth)publicstaticComponentcreateVerticalStrut(intheight)publicstaticComponentcreateRigidArea(Dimensiond)程式7-10,7-11

程式7-10改寫7-9,使用Box容器

程式7-11演示Glue和Strut的效果

GlueStrutRigidBox1是沒有添加不可見組件時(shí)的形式,Box2、3和4是分別添加了不可見組件Glue、Strut和Rigid之後的形式,從中可以看出,Glue將填滿所有剩餘水準(zhǔn)(或垂直)空間,Strut和Rigid則具有指定的寬度(或高度)

其他佈局管理器GridBagLayout佈局管理器

java.awt中定義

以網(wǎng)格為基礎(chǔ),允許組件使用最適當(dāng)?shù)拇笮?,既可以占多行,也可以占多列,各組件可以有不同的高度和寬度

SpringLayout等佈局管理器

javax.swing中定義

不使用佈局管理器1調(diào)用容器的setLayout(null)將佈局管理器設(shè)置為空2調(diào)用組件的setBounds()方法設(shè)置組件的位置和大小不使用佈局管理器

setBounds()方法的格式:

setBounds(intx,inty,intwidth,intheight)

前兩個(gè)int型參數(shù)設(shè)置組件的位置,後兩個(gè)int型參數(shù)設(shè)置組件的寬度和高度

不使用佈局管理器的例子

程式7-12事件處理

事件處理模型用戶在程式介面所進(jìn)行的操作稱為用戶事件(Event)

Java中定義了很多事件類,用於描述不同的用戶行為代表滑鼠事件的MouseEvent類和代表鍵盤事件的KeyEvent類在組件上進(jìn)行某種操作,事件處理系統(tǒng)便會(huì)生成一個(gè)事件類對(duì)象每類事件對(duì)應(yīng)一個(gè)的listener監(jiān)聽程式介面,它規(guī)定了接收並處理該類事件的方法的規(guī)範(fàn)組件必須註冊(cè)相應(yīng)的事件處理程式,這種事件處理程式稱為事件的監(jiān)聽程式(Listener)通過類似addXXXListener(XXXListener)的方法程式7-14

一個(gè)ActionEvent事件處理的例子用到一個(gè)帶單個(gè)按鈕的框架,按鈕組件註冊(cè)了一個(gè)ButtonHandler對(duì)象作為ActionEvent事件的監(jiān)聽程式,而ButtonHandler類實(shí)現(xiàn)了ActionListener介面,在該類的actionPerformed()方法中給出了ActionEvent事件是如何處理的。當(dāng)用戶單擊按鈕時(shí),產(chǎn)生ActionEvent事件,該方法將會(huì)被調(diào)用。程式7-14

程式7-15

事件的監(jiān)聽程式定義在組件類中程式7-15MyButton類

importjavax.swing.*;importjava.awt.event.*;

publicclassMyButtonextendsJButtonimplementsActionListener{ publicMyButton(Stringtext){ super(text);

//註冊(cè)事件的監(jiān)聽程式

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)聽程式

通過addActionListener(this)將自身註冊(cè)為自己的監(jiān)聽程式

事件的種類java.awt.event包和javax.swing.event包中定義了很多事件類

例如ItemEvent、MouseEvent和KeyEvent等,並且第三方內(nèi)容也可加入其中每種事件類都有一個(gè)對(duì)應(yīng)的介面,介面中聲明了一個(gè)或多個(gè)抽象的事件處理方法,凡是需要接收並處理事件類對(duì)象的類,都需要實(shí)現(xiàn)相應(yīng)的介面

常用事件類型及介面

常用事件類型及介面常用事件類型及介面例子程式將檢測滑鼠的拖動(dòng)(即按住滑鼠鍵並同時(shí)移動(dòng)滑鼠的操作)以及滑鼠進(jìn)入和離開窗口的情況

TwoListener類同時(shí)實(shí)現(xiàn)MouseMotionListener和MouseListener兩個(gè)介面監(jiān)聽多類事件

獲取事件的細(xì)節(jié)程式7-16

f.addMouseListener(this);f.addMouseMotionListener(this);多監(jiān)聽程式

事件監(jiān)聽模式允許為一個(gè)組件註冊(cè)多個(gè)監(jiān)聽程式

允許根據(jù)需要多次調(diào)用addListener方法為某個(gè)組件的同一事件註冊(cè)多個(gè)不同的監(jiān)聽程式,當(dāng)事件發(fā)生時(shí),所有相關(guān)的監(jiān)聽程式都會(huì)被調(diào)用

當(dāng)事件發(fā)生時(shí),單個(gè)事件的多個(gè)監(jiān)聽程式的調(diào)用順序是不確定的如果在某個(gè)程式中,各個(gè)監(jiān)聽程式的調(diào)用順序很重要,那麼它們之間就不是不相關(guān)的,在這種情況下,你就不能再為同一事件註冊(cè)多個(gè)監(jiān)聽程式,而是只註冊(cè)唯一一個(gè)監(jiān)聽程式,然後再在該監(jiān)聽程式中調(diào)用所需的其他方法

事件適配器

為了進(jìn)行事件處理,我們需要?jiǎng)?chuàng)建實(shí)現(xiàn)Listen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論