Java的图形用户界面设计课件_第1页
Java的图形用户界面设计课件_第2页
Java的图形用户界面设计课件_第3页
Java的图形用户界面设计课件_第4页
Java的图形用户界面设计课件_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java的圖形用戶介面設計

AWT與Swing

AWT

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

AWT類與繼承關係

ComponentContainerPanelAppletWindow

FrameDialogButtonTextFieldTextAreaTextComponentCheckboxMenuComponentMenuMenuItemMenuBar其他組件

獨立不獨立SWING中主要類的繼承關係

Swing與AWT不同

Swing組件在實現時不包含任何本地(native)代碼

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

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

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

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

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

頂層容器

頂層(Top

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

JFrame創建應用程式

程式7-1內容窗格頂層容器都有一個內容窗格(Content

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

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

ContainercontentPane=frame.getContentPane();

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

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

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

程式7-3創建一個黃色面板,通過add()方法在面板中添加了一個按鈕,然後將該面板添加到一個JFrame的實例中,JFrame實例的背景被設置為藍綠色

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)負責安排每個容器都有一個缺省的佈局管理器通過容器的setLayout()方法改變容器的佈局管理器多種佈局管理器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()方法在這個例子中,main()方法有兩個作用。首先,它創建了一個ExGui類的實例,在這個實例創建之前,並沒有實際可用的b1和b2資料項目。其次,當ExGui實例創建好以後,main()又調用了該實例的go()方法,在這個方法中,程式的實際功能得以實現。

程式7-4publicvoidgo(){ frame=newJFrame("GUIexample"); //創建一個JFrame實例

ContainercontentPane=frame.getContentPane();//獲取內容窗格

//為內容窗格設置FlowLayout佈局管理器

contentPane.setLayout(newFlowLayout());

b1=newJButton("Pressme");//創建JButton實例

b2=newJButton("Don'tpressMe");

contentPane.add(b1);//添加按鈕

contentPane.add(b2);

frame.pack(); frame.setVisible(true); }}newJFrame(“GUIexample”)這條語句的功能是創建JFrame類的一個實例。JFrame

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

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

newJButton(“PressMe”)這條語句的功能是創建javax.swing.JButton類的一個實例,該實例是窗口中的標準按鈕(button),按鈕上的標籤由構造方法中String型參數“PressMe”指定。

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

frame.setVisible(true)這條語句的功能是使得框架frame以及它所包含的組件對用戶可見,在此之前,框架和組件雖然已經創建好了,但是並沒有顯示出來,只有調用了setVisible(true)方法後,它們才變為可見。

FlowLayout佈局管理器

FlowLayout定義在java.awt包中,Fl對容器中組件進行佈局的方式是將組件逐個地安放在容器中的一行上,一行放滿後就另起一個新行。在缺省情況下,將組件居中放置在容器的某一行上

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

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

FlowLayout構造方法

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

hgap,int

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

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

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

構造一個各部分間間距為0的BorderLayout實例

BorderLayout(int,int)

構造一個各部分間具有指定間距的BorderLayout實例

組件加入

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

frame.getContentPane().add(button);

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

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

在容器的每個區域,只能加入一個組件,如果向某個區域中加入多個組件,那麼只有最後一個組件是有效的frame.getContentPane().add(newJButton(“buttonA”),BorderLayout.SOUTH);frame.getContentPane().add(newJButton(“buttonB”),BorderLayout.SOUTH);frame.getContentPane().add(newJButton(“buttonC”),BorderLayout.SOUTH);最後只有buttonC顯示在South區域。

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

四個邊界區域,如果沒有使用,大小將變為零,

Center區域將會擴展並佔據這個未用區域的位置。如果均沒有使用,

Center區域將會佔據整個窗口程式7-6程式7-6當窗口大小改變時,窗口中按鈕的相對位置並不會發生變化,但按鈕的大小會改變。

GridLayout佈局管理器GridLayout是一種網格式的佈局管理器,它將容器空間劃分成若干行乘若干列的網格,組件依次放入其中,每個組件佔據一格

網格每列的寬(高)度都是相同的,這個寬度大致等於容器的寬度除以網格的列(行)數組件被放入容器的次序決定了它所佔據的位置。每行網格從左至右依次填充,一行用完之後轉入下一行當容器的大小改變時,GridLayout所管理的組件的相對位置不會發生變化,但組件的大小會隨之改變GridLayout構造方法

publicGridLayout()創建一個只有一行的網格,網格的列數根據實際需要而定

publicGridLayout(introws,intcols)rows和cols兩個參數分別指定網格的行數和列數

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

hgap,int

vgap)hgap和vgap分別表示網格間的水準間距和垂直間距

程式7-7程式7-7

CardLayout佈局管理器

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

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

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

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

它將容器中的組件按水準方向排成一行或按垂直方向排成一列當組件排成一行時,每個組件可以有不同的寬度;當組件排成一列時,每個組件可以有不同的高度BoxLayout構造方法

BoxLayout(Containertarget,intaxis)

Container型參數target指明是為哪個容器設置此BoxLayout佈局管理器

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

水準方向排列

BoxLayout.Y_AXIS

垂直方向排列

程式7-9

程式7-9

Box容器在javax.swing包中定義

創建Box實例的靜態方法

publicstaticBoxcreateHorizontalBox()

使用使用水準方向的BoxLayou

publicstaticBoxcreateVerticalBox()

使用垂直方向的BoxLayout

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

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

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

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

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

java.awt中定義

以網格為基礎,允許組件使用最適當的大小,既可以占多行,也可以占多列,各組件可以有不同的高度和寬度

SpringLayout等佈局管理器

javax.swing中定義

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

setBounds()方法的格式:

setBounds(intx,inty,intwidth,intheight)

前兩個int型參數設置組件的位置,後兩個int型參數設置組件的寬度和高度

不使用佈局管理器的例子

程式7-12事件處理

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

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

一個ActionEvent事件處理的例子用到一個帶單個按鈕的框架,按鈕組件註冊了一個ButtonHandler對象作為ActionEvent事件的監聽程式,而ButtonHandler類實現了ActionListener介面,在該類的actionPerformed()方法中給出了ActionEvent事件是如何處理的。當用戶單擊按鈕時,產生ActionEvent事件,該方法將會被調用。程式7-14

程式7-15

事件的監聽程式定義在組件類中程式7-15MyButton類

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

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

//註冊事件的監聽程式

addActionListener(this); }

//出現ActionEvent事件時,將結束程式的運行

publicvoidactionPerformed(ActionEvente){ System.exit(0); }}

MyButton組件繼承JButton,同時實現ActionListener介面,因此MyButton組件對象也可作事件監聽程式

通過addActionListener(this)將自身註冊為自己的監聽程式

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

例如ItemEvent、MouseEvent和KeyEvent等,並且第三方內容也可加入其中每種事件類都有一個對應的介面,介面中聲明了一個或多個抽象的事件處理方法,凡是需要接收並處理事件類對象的類,都需要實現相應的介面

常用事件類型及介面

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

TwoListener類同時實現MouseMotionListener和MouseListener兩個介面監聽多類事件

獲取事件的細節程式7-16

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

事件監聽模式允許為一個組件註冊多個監聽程式

允許根據需要多次調用addListener方法為某個組件的同一事件註冊多個不同的監聽程式,當事件發生時,所有相關的監聽程式都會被調用

當事件發生時,單個事件的多個監聽程式的調用順序是不確定的如果在某個程式中,各個監聽程式的調用順序很重要,那麼它們之間就不是不相關的,在這種情況下,你就不能再為同一事件註冊多個監聽程式,而是只註冊唯一一個監聽程式,然後再在該監聽程式中調用所需的其他方法

事件適配器

為了進行事件處理,我們需要創建實現Listen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论