《Java程序設(shè)計教程》09 圖形用戶界面_第1頁
《Java程序設(shè)計教程》09 圖形用戶界面_第2頁
《Java程序設(shè)計教程》09 圖形用戶界面_第3頁
《Java程序設(shè)計教程》09 圖形用戶界面_第4頁
《Java程序設(shè)計教程》09 圖形用戶界面_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第9章圖形用戶界面本章學(xué)習(xí)目標(biāo)了解圖形用戶界面的歷史及其設(shè)計原則。掌握AWT組件集中的各類組件。理解AWT事件處理機制。學(xué)會編寫常見事件處理程序。了解Swing組件集及其簡單編程。9.1概述圖形用戶界面,英文全稱為GraphicalUserInterface,一般習(xí)慣簡稱為GUI。圖形化用戶界面大大方便了人機交互,是一種結(jié)合計算機科學(xué)、美學(xué)、心理學(xué)、行為學(xué),及各商業(yè)領(lǐng)域需求分析的人機系統(tǒng)工程,強調(diào)人—機—環(huán)境三者作為一個系統(tǒng)進行總體設(shè)計。1973年施樂公司帕洛阿爾托研究中心(XeroxPARC)開發(fā)了第一臺帶真正GUI的計算機,Xerox,并建構(gòu)了WIMP圖形界面。WIMP(Window/Icon/Menu/PointingDevice)設(shè)計原則用戶至上的原則交互界面要友好配色方案要合理當(dāng)年主流開發(fā)工具集基于Java的圖形用戶界面開發(fā)工具(即組件集)以前最主流的有三種:AWTSwingSWT/JFace隨Sun(Oracle)的JDK一起發(fā)布

源于IBM的Eclipse開源項目

使用AWT或Swing,則只要機器上安裝了JDK或JRE,發(fā)布軟件時便無須附帶其他的類庫。

但如果使用的是SWT,那么在發(fā)布時就必須要附帶上SWT的*.dll(Windows平臺)或*.so(Linux&Unix平臺)文件連同相關(guān)的*.jar打包文件。

雖然SWT最初僅僅是Eclipse組織為了開發(fā)EclipseIDE環(huán)境所編寫的一組底層圖形界面API,但SWT在性能和外觀上都是不錯的。本章重點介紹基礎(chǔ)性的AWT組件集,同時對Swing組件集做一個簡單介紹。特別說明:AWT是JDK的第一代GUI框架,Swing則是在AWT基礎(chǔ)上推出的第二代GUI技術(shù),它們都是用來開發(fā)桌面窗體程序,但由于各種原因,目前市場上的主流桌面GUI開發(fā)都不是采用Java的技術(shù),它們已經(jīng)算是過時了。然而,AWT和Swing都是JDK自帶的功能,并且很好地體現(xiàn)了Java語言在OOP上的設(shè)計,所以本教程沒有放棄它們,畢竟教程是針對零編程基礎(chǔ)的讀者而寫,知今宜鑒古,理解它們對于讀者當(dāng)下打基礎(chǔ)和將來學(xué)習(xí)更先進GUI技術(shù)仍然是有很大幫助的。對于IT開發(fā)人員而言,工具很重要,但編程思想更重要!不會過時9.2AWT組件集AWT由JDK的java.awt包提供,里面包含了許多可以用來建立圖形用戶界面(GUI)的類,一般稱這些類為組件(component)圖9-1AWT組件的繼承關(guān)系圖AWT組件集

AWT組件大致可以分為以下三類:

(1)容器類組件

(2)布局類組件

(3)普通組件類9.2.1容器類組件容器類組件由Container類派生而來,常用的有Frame類和Dialog類,以及Panel類和Applet類。這些容器類組件可以用來容納其他普通組件或者甚至是容器組件自身,起到組織用戶界面的作用。容器類組件有一定的范圍和位置,并且它們的布局從整體上也決定了所容納組件的位置。因此,在界面設(shè)計的初始階段,首要考慮的就是容器類組件的布局。9.2.2布局組件類布局類組件是非可視組件,它們能很好地在容器中布置其他可視組件。AWT提供了五種基本的布局方式:FlowLayout、BorderLayout、GridLayout、GridBagLayout和CardLayout等,它們均為Object類的子類,如下圖9-2所示。圖9-2布局方式FlowLayoutFlowLayout是最簡單的一種布局方式,被容納的可視組件從左向右,從上至下依次排列,若一組件在本行放置不下,就自動排到下一行的開始處,該方式為Panel類和Applet類容器的默認(rèn)布局方式。圖9-3FlowLayout顯示效果圖9-4FlowLayout換行【例9-2】在Frame容器中設(shè)置FlowLayout布局方式。圖9-5Frame類容器的FlowLayout布局圖9-6居左的FlowLayout布局myButtons1.java如果去掉“frame.setLayout(newFlowLayout());”這一設(shè)置布局方式的語句,則會呈現(xiàn)如圖9-7所示的默認(rèn)BorderLayout的布局界面。圖9-7默認(rèn)BorderLayout布局BorderLayoutBorderLayout布局方式的特點是:將容器劃分為“東”“西”“南”“北”“中”五個區(qū)。每個區(qū)可以擺放一個組件,因此最多可以在BorderLayout的容器組件中放置五個子組件。Frame或Dialog容器類組件的默認(rèn)布局方式。示例9-3源程序圖9-8BorderLayout布局圖9-93個按鈕的情況myButtons2.javaGridLayoutGridLayout布局將容器劃分為行和列的網(wǎng)格,每個網(wǎng)格單元可以放置一個組件,組件通過add()方法從上到下,從左至右順序加入網(wǎng)格各個單元中。GridLayout布局允許在組件之間設(shè)置水平和垂直間距,間距同樣以像素為單位表示,如下為創(chuàng)建6行6列,水平間隔和垂直間隔均為10個像素的GridLayout布局對象:

setLayout(newGridLayout(6,6,10,10));圖9-10GridLayout布局界面示例9-4源程序myButtons3.javaGridBagLayoutGridBagLayout是所有AWT布局管理方式中最繁的,同時也是功能最強的。GridBagLayout設(shè)置的所有行和列可以大小不同。GridBagLayout允許不同組件在容器中占據(jù)不同大小的矩形區(qū)域。GridBagLayout由一個專用的類來對布局行為進行約束,該類為GridBagConstraints,它的所有成員都是public(公有)的,要掌握如何使用GridBagLayout布局,關(guān)鍵在于熟悉這些約束變量,以及如何進行設(shè)置。GridBagConstraints的常用屬性

publicgirdx//組件所處位置的起始單元格列號

publicgridy//組件所處位置的起始單元格行號

publicgridheight//組件在垂直方向占據(jù)的單元格個數(shù)

publicgridwidth//組件在水平方向占據(jù)的單元格個數(shù)

publicdoubleweightx //容器縮放時,單元格在水平方向的縮放比例

publicdoubleweighty//容器縮放時,單元格在垂直方向的縮放比例

publicintanchor//當(dāng)組件較小時指定其在網(wǎng)格中的起始位置

publicintfill//當(dāng)組件分布區(qū)域變大時指明是否縮放,以及如何縮放

publicInsetsinsets//組件與外部分布區(qū)域邊緣的間距

publicintipadx//組件在水平方向的內(nèi)部縮進

publicintipady//組件在垂直方向的內(nèi)部縮進示例9-5源程序示例9-6源程序圖9-11GridBagLayout布局1圖9-12GridBagLayout布局2GridBag1.javaCardLayoutCardLayout布局將組件(通常是Panel類的容器組件)象撲克牌(卡片)一樣摞起來,每次只能顯示其中的一張,實現(xiàn)分頁的效果,每一頁中可以有各自的界面,這樣就相當(dāng)于擴展了原本有限的屏幕區(qū)域。CardLayout布局組件提供了以下方法來對各張Card頁面進行切換:

publicvoidfirst(Containerparent)

//顯示第一張卡片

publicvoidnext(Containerparent)

//顯示下一張卡片

publicvoidprevious(Containerparent)

//顯示上一張卡片

publicvoidshow(Containerparent,Stringname)

//顯示指定卡片

publicvoidlast(Containerparent)

//顯示最后一張卡片示例9-7源程序當(dāng)上述程序運行時,界面首先顯示第1頁(即“按鈕1”),然后通過調(diào)用“cardLayout.show(frame,"第2頁");”顯示第2頁(即“按鈕2”),接著通過調(diào)用其他方法陸續(xù)顯示第1頁、第2頁、第1頁和最后的第3頁,每一頁的顯示時間間隔為1000ms,即1秒。cardLayout.java順序:121213【例9-8】CardLayout布局2。該程序與【例9-7】有所不同?!纠?-7】的程序是通過Thread.sleep()來自動切換不同的卡片頁,而本程序則借助事件(鼠標(biāo)單擊按鈕)處理來實現(xiàn)翻頁功能。事實上,事件處理在GUI設(shè)計中占據(jù)非常重要的地位,圖形界面中各元素的設(shè)計功能以及界面的變換都需要依靠事件處理來實現(xiàn)。關(guān)于事件處理的相關(guān)知識,將在9.2.4節(jié)進行詳細(xì)介紹。Hint有些JavaIDE(如JBuilder)也提供廣大編程者所熟悉的基于絕對像素坐標(biāo)的XYLayout布局方式(用戶在此布局方式下可以進行可視化的拖放操作)Java用戶界面設(shè)計的獨到之處恰恰在于其與平臺無關(guān)的布局方式。一般不建議采用XYLayout布局,它不但使用起來要依賴于特定的包,還有損Java獨立性,不利于程序移植,除非用戶認(rèn)定所編寫的程序就只在某特定平臺(如Windows)下進行運行。9.2.3普通組件AWT提供了一系列的普通組件以構(gòu)建用戶圖形界面,它們主要包括:標(biāo)簽、文本框、文本域、按鈕、復(fù)選框、單選框、列表框、下拉框、滾動條和菜單等。標(biāo)簽標(biāo)簽是很簡單的一種組件,一般用來顯示標(biāo)識性的文本信息,常被放置于其他組件的旁邊起提示作用。AWT提供的標(biāo)簽類為Label,因此,可以通過創(chuàng)建Label對象來使用標(biāo)簽。例9-9源程序文本框文本框是圖形界面中常用于接收用戶輸入或程序輸出的一種組件,它只允許輸入或顯示單行的文本信息,且用戶還可以限定文本框的寬度。AWT提供的文本框類為TextField,它直接繼承于TextComponent,而TextComponent則從Component類繼承而來。關(guān)于TextField類的常用方法有:publicStringgetText()//獲取文本框中的輸入文本publicStringgetSelectedText()

//獲取文本框中選中的文本publicboolean

isEditable()//返回文本框是否可輸入publicvoidsetEditable(booleanb)//設(shè)置文本框的狀態(tài):可輸入或不可輸入publicintgetColumns()//獲取文本框的寬度publicvoidsetColumns(intcolumns)//設(shè)置文本框的寬度publicvoidsetText(Stringt)//設(shè)置文本框中的文本為t【例9-10】圖9-14文本框組件文本域文本域組件也是用來接收用戶輸入或程序輸出的,不過與文本框不同的是,它允許進行多行輸入或輸出,因而它一般用于處理大量文本的情形。AWT提供的文本域組件為TextArea類,它也是從TextComponent類繼承而來?!纠?-11】TextArea文本域組件。圖9-15TextArea文本域組件按鈕AWT提供的按鈕類為Button,它是從Component類直接繼承而來。復(fù)選框復(fù)選框組件也是圖形界面上用于接受用戶輸入的一種快捷方式,一般是在界面上提供多個復(fù)選框選項,用戶根據(jù)實際情況,可以多選也可以都不選。AWT提供的復(fù)選框類為Checkbox。事實上,該組件類類似于具有開關(guān)選項的按鈕,用戶單擊選中,再單擊則取消選中。【例9-12】復(fù)選框組件。圖9-16復(fù)選框組件單選框在有些情況,程序界面可能給用戶提供多個選項,但是只允許用戶選中其中一個,這就是單選框的概念。事實上,單選框是從上面復(fù)選框衍生而來的,它也采用Checkbox作為其組件類,不過為了實現(xiàn)單選效果,還需要另外一個組件類:CheckboxGroup,當(dāng)我們把Checkbox類對象添加進某個CheckboxGroup對象后,它就成為了單選框?!纠?-13】單選框組件。圖9-17單選框組件列表框列表框組件看起來像文本域,可以有多行,每一行文本代表一個選項,文本域組件多用于用戶編輯之用,而列表框多用于給用戶幾個選項進行選擇,可以多選也可以單選。AWT提供的列表框類為List,它直接繼承于Component類?!纠?-14】列表框組件。圖9-18列表框組件下拉框下拉框組件提供一些選項供用戶來選擇,每次只能選一個,選中的選項會被單獨顯示出來,而改變選項則可以通過單擊組件邊上的箭頭,再從下拉框中進行選擇來完成。下拉框相比列表框而言,占據(jù)較小的界面區(qū)域。AWT提供的下拉框類為Choice,它直接繼承于Component類。【例9-15】下拉框組件。圖9-19下拉框組件滾動條滾動條是圖形用戶界面中常見的組件之一,它既可以用作取值器,也可以用來滾動顯示某些較長文本信息。AWT提供的滾動條類為Scrollbar,它也是直接從Component組件繼承而來?!纠?-16】菜單菜單將系統(tǒng)的各種功能選項以直觀的方式展現(xiàn)出來,供用戶選擇,大大方便了用戶與系統(tǒng)間的交互。菜單相比其他組件類特殊,它是由幾個菜單相關(guān)類共同構(gòu)成的菜單系統(tǒng)。AWT提供的菜單系統(tǒng)類包括:MenuBar、MenuItem、Menu、CheckboxMenuItem以及PopupMenu。它們之間的繼承關(guān)系如下圖所示:MenuBar類對應(yīng)菜單系統(tǒng)的整體,Menu類對應(yīng)菜單系統(tǒng)中的一列菜單(實際上它只是一種特殊的菜單項),MenuItem和CheckboxMenuItem類則對應(yīng)具體的菜單項,其中CheckboxMenuItem為帶復(fù)選框的菜單項,而PopupMenu類對應(yīng)彈出式菜單,它是菜單Menu類的子類。注意由于各個類間存在繼承關(guān)系,因而子類可以調(diào)用父類提供的部分常用方法。菜單系統(tǒng)創(chuàng)建好后,最后必須調(diào)用Frame類的setMenuBar()方法將其加入到框架界面中?!纠?-17】圖9-22菜單組件myMenu1.java9.2.4事件處理在早先的JDK1.0版本中提供的是稱為層次事件模型的事件處理機制。在JDK1.1以后版本中便被基于事件監(jiān)聽模型的事件處理機制替代了,這種機制也稱之為事件派遣機制或授權(quán)事件機制,它的處理效率相比層次事件模型大為提高。事件類及其對應(yīng)的監(jiān)聽器AWT提供了很多的事件類及其對應(yīng)的監(jiān)聽器(其實就是接口),它們都被放置到JDK的java.awt.event包中。ActionEvent類表示一個廣義的行為事件,可以是鼠標(biāo)單擊按鈕或者菜單,也可以是列表框的某選項被雙擊或文本框中的回車行為。ActionEvent類對應(yīng)的監(jiān)聽器為ActionListener接口,該接口只有一個抽象方法:

publicabstractvoidactionPerformed(ActionEventactionevent);注冊該監(jiān)聽器需要調(diào)用組件的addActionListener()方法,撤銷則調(diào)用組件的removeActionListener()方法。KeyEvent類當(dāng)用戶按下或釋放鍵時產(chǎn)生該類事件,也稱為鍵盤事件。對應(yīng)的監(jiān)聽器為KeyListener接口,該接口定義有三個抽象方法:publicabstractvoidkeyTyped(KeyEventkeyevent);publicabstractvoidkeyPressed(KeyEventkeyevent);publicabstractvoidkeyReleased(KeyEventkeyevent);注冊鍵盤監(jiān)聽器可以通過調(diào)用組件的addKeyListener()方法來實現(xiàn)。MouseEvent類當(dāng)用戶按下鼠標(biāo)、釋放鼠標(biāo)或移動鼠標(biāo)時會產(chǎn)生鼠標(biāo)事件。該事件對應(yīng)兩種監(jiān)聽器:MouseListener和MouseMotionListener接口。鼠標(biāo)按鈕相關(guān)事件監(jiān)聽器由實現(xiàn)MouseListener接口的對象表示,而鼠標(biāo)移動相關(guān)事件監(jiān)聽器則由實現(xiàn)MouseMotionListener接口的對象表示。MouseListener接口定義的抽象方法有5個:

publicabstractvoidmouseClicked(MouseEventmouseevent); publicabstractvoidmousePressed(MouseEventmouseevent); publicabstractvoidmouseReleased(MouseEventmouseevent); publicabstractvoidmouseEntered(MouseEventmouseevent); publicabstractvoidmouseExited(MouseEventmouseevent);MouseEvent類MouseMotionListener接口定義的方法則有2個:

publicabstractvoidmouseDragged(MouseEventmouseevent); publicabstractvoidmouseMoved(MouseEventmouseevent);注冊鼠標(biāo)事件監(jiān)聽器可以調(diào)用相應(yīng)的addMouseListener()和addMouseMotionListener()方法。TextEvent類當(dāng)一個文本框或文本域的內(nèi)容發(fā)生改變時就會產(chǎn)生相應(yīng)的TextEvent事件。該事件對應(yīng)的監(jiān)聽器為TextListener接口,它僅定義了一個抽象方法:publicabstractvoidtextValueChanged(TextEventtextevent);注冊文本事件監(jiān)聽器必須調(diào)用組件的addTextListener()方法。FocusEvent類當(dāng)一個組件得到或失去焦點時,就會發(fā)生焦點事件。在當(dāng)前活動窗口中,有且只有一個組件擁有焦點,當(dāng)用戶用Tab鍵操作或用鼠標(biāo)單擊其他組件時,一般焦點就會轉(zhuǎn)移至其他組件上,此時就發(fā)生了FocusEvent事件。該事件對應(yīng)的監(jiān)聽器為FocusListener接口,它有2個抽象方法:

publicabstractvoidfocusGained(FocusEventfocusevent); publicabstractvoidfocusLost(FocusEventfocusevent);注冊焦點事件監(jiān)聽器需要調(diào)用組件的addFocusListener方法。WindowEvent類當(dāng)一個窗口被打開、關(guān)閉、激活、撤消激活、圖標(biāo)化或撤消圖標(biāo)化時就會產(chǎn)生窗口事件。WindowEvent類對應(yīng)的監(jiān)聽器為WindowListener接口,該接口定義了7個抽象方法:publicabstractvoidwindowOpened(WindowEventwindowevent);publicabstractvoidwindowClosing(WindowEventwindowevent);publicabstractvoidwindowClosed(WindowEventwindowevent);publicabstractvoidwindowIconified(WindowEventwindowevent);publicabstractvoidwindowDeiconified(WindowEventwindowevent);publicabstractvoidwindowActivated(WindowEventwindowevent);publicabstractvoidwindowDeactivated(WindowEventwindowevent);注冊窗口事件監(jiān)聽器需要調(diào)用組件的addWindowListener()方法。事件處理程序的編寫步驟:(1)實現(xiàn)某一事件的監(jiān)聽器接口(定義事件處理類并實現(xiàn)監(jiān)聽器接口)。(2)在事件處理類中根據(jù)實際需要實現(xiàn)相應(yīng)的抽象方法。(3)給組件注冊相應(yīng)事件監(jiān)聽器以指明該事件的事件源有哪些?!纠?-18】ActionEvent行為事件處理。【例9-19】菜單事件處理。圖9-24行為事件處理圖9-25菜單事件處理ActionEvent1.javamyMenu2.java【例9-20】鼠標(biāo)事件處理?!纠?-21】鍵盤事件處理。圖9-26鼠標(biāo)事件處理MouseEvent1.javaAdapter(適配器)Java規(guī)定:實現(xiàn)一個接口時必須對該接口的所有抽象方法進行具體的實現(xiàn),為此,Java提供了一種叫做Adapter(適配器)的抽象類來簡化事件處理程序的編寫。適配器類很簡單,它其實就是一個實現(xiàn)了接口中所有抽象方法的“空”類,本身不提供實際功能。Java為具有多個抽象方法的監(jiān)聽接口提供相對應(yīng)的適配器類,比如WindowListener、WindowStateListener和WindowFocusListener一起對應(yīng)一個WindowAdapter、KeyListener對應(yīng)KeyAdapter、MouseListener對應(yīng)MouseAdapter等,大家不妨到j(luò)ava.awt.event包中看看。舉例//處理窗口關(guān)閉事件的常用方法(匿名適配器類) f.addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(Window

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論