swing入門 | ||||||
1 2005-12-30 12:15:26.0 | ||||||
![]() | ||||||
開始之前
本教程面向的是 Swing 的初學(xué)者。您可能知道其他人也在使用它,或者在您使用的應(yīng)用程序中曾看見過它。再或者您可能已經(jīng)親自嘗試使用過它。不管屬于哪種情況,本教程都將帶您經(jīng)歷構(gòu)建一個(gè)基本的 Swing 應(yīng)用程序的過程,先從最常見的 HelloWorld 應(yīng)用程序開始。當(dāng)您在自己的機(jī)器上運(yùn)行它之后,我們將向您介紹一些關(guān)于 Swing 的知識(shí):創(chuàng)建一個(gè)航班預(yù)訂系統(tǒng),逐漸向其中添加內(nèi)容,直到您得到一個(gè)基本的,但卻完全能夠工作的應(yīng)用程序. 在學(xué)習(xí)本教程期間,您將了解 Swing 中的所有入門組件;所謂入門組件,指的是您用來構(gòu)造簡單用戶界面(UI)的組件。您將學(xué)習(xí)如何用基本的方法來設(shè)計(jì)這些組件的屬性,以及如何讓這些 Swing 組件與其他組件交互。您還將學(xué)習(xí)完成 Swing 知識(shí)還需要的其他 UI 概念,其中包括布局、事件/偵聽器和數(shù)據(jù)模型。在結(jié)束這篇教程的時(shí)候,您應(yīng)當(dāng)能夠構(gòu)建一個(gè)簡單的 Swing 應(yīng)用程序。 請注意,本教程 不是 面向 Swing 初學(xué)者的全面指南。有專門用于 Swing 學(xué)習(xí)的整本的書籍,所以我不打算在這里重復(fù)這份工作。本教程的側(cè)重點(diǎn)是初學(xué)者,將介紹一些在實(shí)際工作中最可能運(yùn)行的最常用的組件和函數(shù)。 如果在完成這篇教程后,您有興趣進(jìn)一步擴(kuò)展自己的 Swing 編程知識(shí),那么您應(yīng)當(dāng)閱讀稱為“中級 Swing”的同一系列教程,它建立在這篇教程介紹的概念和開發(fā)的示例應(yīng)用程序之上。
要完成本教程,需要以下工具: 關(guān)于作者 Michael Abernethy 目前是位于德克薩斯澳斯汀的 IBM WebSphere System Management 團(tuán)隊(duì)的測試小組組長。在這篇工作之前,他是多個(gè)客戶地點(diǎn)的 Swing UI 開發(fā)人員。 Swing簡介 UI 組件簡介 在開始學(xué)習(xí) Swing 之前,必須回答針對真正初學(xué)者的一個(gè)問題:什么是 UI?初學(xué)者的答案是“用戶界面”。但是因?yàn)楸窘坛痰哪繕?biāo)是要保證您不再只是個(gè)初學(xué)者,所以我們需要比這個(gè)定義更高級的定義。 所以,我再次提出這個(gè)問題:什么是 UI?您可能把它定義成您按下的按鈕、打字的地址欄 、打開和關(guān)閉的窗口,等等,這些都是 UI 的元素,但是除了在屏幕上看到的這些之外,還有更多都是 UI 元素。比如鼠標(biāo)、鍵盤、音量、屏幕顏色、使用的字體,以及一個(gè)對象相對于另一個(gè)對象的位置,這些都包含在 UI 之中。實(shí)際上,在計(jì)算機(jī)和用戶的交互之中扮演角色的任何對象都是 UI 的組成部分。這看起來足夠簡單,但是您應(yīng)當(dāng)驚訝的是,有許多人和大型公司已經(jīng)為它努力了很多年。實(shí)際上,現(xiàn)在有的大學(xué)專業(yè)的惟一課程就是研究這種交互。 Swing 的角色 Swing 是 Java 平臺(tái)的 UI —— 它充當(dāng)處理用戶和計(jì)算機(jī)之間全部交互的軟件。它實(shí)際上充當(dāng)用戶和計(jì)算機(jī)內(nèi)部之間的中間人。Swing 到底是如何做這項(xiàng)工作的呢?它提供了處理前面一節(jié)中描述的 UI 各方面內(nèi)容的機(jī)制:
無論如何,Swing 為您提供了創(chuàng)建自己的 UI 所需要的所有工具。 MVC Swing 甚至走得更遠(yuǎn)一步,在基本的 UI 原則之上又放上了一個(gè)公共的設(shè)計(jì)模式。這個(gè)設(shè)計(jì)模式叫做模型-視圖-控制器(Model-View-Controller,MVC),它試圖“把角色分開”。MVC 讓負(fù)責(zé)顯示的代碼、處理數(shù)據(jù)的代碼、對交互進(jìn)行響應(yīng)并驅(qū)動(dòng)變化的代碼彼此分離。 有點(diǎn)迷惑?如果我為這個(gè)設(shè)計(jì)模式提供一個(gè)現(xiàn)實(shí)世界的非技術(shù)性示例,它就比較容易了。請想像一次時(shí)裝秀。把秀場當(dāng)成 UI,假設(shè)服裝就是數(shù)據(jù),是展示給用戶的計(jì)算機(jī)信息?,F(xiàn)在,假設(shè)這次時(shí)裝秀中只有一個(gè)人。這個(gè)人設(shè)計(jì)服裝、修改服裝、同時(shí)還在 T 臺(tái)上展示這些服裝。這看起來可不是一個(gè)構(gòu)造良好的或有效率的設(shè)計(jì)。 現(xiàn)在,假設(shè)同樣的時(shí)裝秀采用 MVC 設(shè)計(jì)模式。這次不是一個(gè)人做每件事,而是將角色分開。時(shí)裝模特(不要與 MVC 縮寫中的模型混淆)展示服裝。他們扮演的角色是視圖。他們知道展示服裝(數(shù)據(jù)的)適當(dāng)方法,但是根本不知道如何創(chuàng)建或設(shè)計(jì)服裝。另一方面,時(shí)裝設(shè)計(jì)師充當(dāng)控制器。時(shí)裝設(shè)計(jì)師對于如何在 T 臺(tái)上走秀沒有概念,但他能創(chuàng)建和操縱服裝。時(shí)裝模特和設(shè)計(jì)師都能獨(dú)立地處理服裝,但都有自己的專業(yè)領(lǐng)域。 這就是 MVC 設(shè)計(jì)模式背后的概念:讓 UI 的每個(gè)方面處理它擅長的工作。如果您仍然不明白,那么教程后面的示例有望消除您的迷惑 —— 但是在您繼續(xù)進(jìn)行的時(shí)候,請記住基本的原則:用可視組件顯示數(shù)據(jù),同時(shí)讓其他類操縱數(shù)據(jù)。 JComponent Swing 的整個(gè)可視組件庫的基礎(chǔ)構(gòu)造塊是
簡單的Swing小部件 JLabel Swing 庫中最基礎(chǔ)的組件是 JLabel。它所做的正是您所期望的:呆在那兒,看起來很漂亮,描述其他組件。下圖顯示了的 JLabel 實(shí)際應(yīng)用: JLabel ![]() 不太吸引人,但是仍然有用。實(shí)際上,在整個(gè)應(yīng)用程序中,不僅把 JLabel 用作文本描述,還將它用作圖片描述。每當(dāng)在 Swing 應(yīng)用程序中看到圖片的時(shí)候,它就有可能是 JLabel。JLabel 對于 Swing 初學(xué)者來說沒有許多意料之外的方法?;镜姆椒òㄔO(shè)置文本、圖片、對齊以及標(biāo)簽描述的其他組件:
JButton Swing 中的基本動(dòng)作組件 JButton,是與每個(gè)窗口中都能看到的 OK 和 Cancel 一樣的按鈕;這些按鈕所做的正是您希望它們做的工作 —— 在單擊它們之后,將發(fā)生一些事情。到底會(huì)發(fā)生什么呢?您必須定義發(fā)生的內(nèi)容(請參閱 事件,以獲得更多信息)。一個(gè) JButton 實(shí)例看起來如下所示: JButton ![]() 用來改變 JButton 屬性的方法與 JLabel 的方法類似(您可能發(fā)現(xiàn),在大多數(shù) Swing 組件中,這些屬性都類似)。它們控制文本、圖片和方向:
除了這些方法,我還要介紹 JButton 包含的另外一組方法。這些方法利用了按鈕的所有不同狀態(tài)。狀態(tài)是對組件進(jìn)行描述的一個(gè)屬性,通常采用真/假設(shè)置。在 JButton 中,可以包含以下可能狀態(tài):活動(dòng)/不活動(dòng)、選中/沒選中、鼠標(biāo)經(jīng)過/鼠標(biāo)離開、按下/沒按下,等等。另外,可以組合這些狀態(tài),例如按鈕可以在鼠標(biāo)經(jīng)過的同時(shí)被選中。現(xiàn)在您可能會(huì)問自己用這些狀態(tài)到底要做什么。作為示例,請看看您的瀏覽器上的后退按鈕。請注意在鼠標(biāo)經(jīng)過它的時(shí)候,圖片是如何變化的,在按下該按鈕時(shí),圖片又是如何變化的。這個(gè)按鈕利用了不同的狀態(tài)。每個(gè)狀態(tài)采用不同的圖片,這是提示用戶交互正在進(jìn)行的一種普遍并且有效的方式。JButton 上的狀態(tài)方法是:
在任何情況下,這是 JTextField 實(shí)際使用時(shí)看起來的樣子: JTextField ![]() 在處理 JTextField 時(shí),只需要關(guān)注一個(gè)方法 —— 這應(yīng)當(dāng)是很明顯的,這個(gè)方法就是設(shè)置文本的方法: JFrame 迄今為止,我介紹了 Swing 的三個(gè)基本構(gòu)造塊:標(biāo)簽、按鈕和文本字段;但是現(xiàn)在需要個(gè)地方放它們,希望用戶知道如何處理它們。 JFrame ![]() JFrame 實(shí)際上不僅僅讓您把組件放入其中并呈現(xiàn)給用戶。比起它表面上的簡單性,它實(shí)際上是 Swing 包中最復(fù)雜的組件。為了最大程度地簡化組件,在獨(dú)立于操作系統(tǒng)的 Swing 組件與實(shí)際運(yùn)行這些組件的操作系統(tǒng)之間,JFrame 起著橋梁的作用。JFrame 在本機(jī)操作系統(tǒng)中是以窗口的形式注冊的,這么做之后,就可以得到許多熟悉的操作系統(tǒng)窗口的特性:最小化/最大化、改變大小、移動(dòng)。但是對于本教程的目標(biāo)來說,把 JFrame 當(dāng)作放置組件的調(diào)色板就足夠了??梢栽?JFrame 上調(diào)用的一些修改屬性的方法是:
簡單應(yīng)用程序 就像所有的“x 入門”教程一樣,本教程也包含必不可少的 HelloWorld 演示。但這個(gè)示例不僅對觀察 Swing 應(yīng)用程序如何工作有用,還對確保設(shè)置正確很有用。一旦使這個(gè)簡單的應(yīng)用程序能夠成功運(yùn)行,那么之后的每個(gè)示例也將能夠運(yùn)行。下圖顯示了完成后的示例: HelloWorld 示例 ![]() 第一步是創(chuàng)建類。將組件放在 JFrame 上的 Swing 應(yīng)用程序需要繼承 這樣做之后,就得到上面描述的所有 JFrame 屬性,最重要的是操作系統(tǒng)對窗口的本機(jī)支持。下一步是把組件放在屏幕上。在這個(gè)示例中,使用了一個(gè) null 布局。在教程的后面部分,您將學(xué)到更多關(guān)于布局和布局管理器的內(nèi)容。但對于這個(gè)示例,可以用數(shù)字表示 JFrame 上的像素位置: 現(xiàn)在組件都放在了 JFrame 上,并且需要在屏幕上顯示 JFrame,并讓應(yīng)用程序可以運(yùn)行。就像在所有的 Java 應(yīng)用程序中一樣,必須添加一個(gè) main 方法,才能讓 Swing 應(yīng)用程序運(yùn)行。在這個(gè) main 方法中,只需要?jiǎng)?chuàng)建 HelloWorld 應(yīng)用程序?qū)ο?,然后調(diào)用其 完成了!這就是創(chuàng)建應(yīng)用程序的所有過程。
在這一節(jié)中,我將介紹 Swing 庫中的其他全部組件、如何使用它們、它們看起來是什么樣的,等等,這部分內(nèi)容應(yīng)當(dāng)讓您更好地了解 Swing 為 UI 開發(fā)人員提供了什么。 我們從 JComboBox 開始介紹。組合框與下拉選擇相似,區(qū)別在于使用組合框時(shí)用戶可以不從列表中選擇項(xiàng)目,還可以選擇一個(gè)(而且只有一個(gè))項(xiàng)目。在某些版本的組合框中,還可以輸入自己的選擇。瀏覽器的地址欄就是一個(gè)示例:它是一個(gè)允許輸入自己選項(xiàng)的組合框。以下是 JComboBox 在 Swing 中看起來的樣子: JComboBox ![]() JComboBox 的重要函數(shù)包括 JComboBox 包含的數(shù)據(jù)。需要有一種方法來設(shè)置 JComboBox 中的數(shù)據(jù)、修改數(shù)據(jù)、在用戶選擇時(shí)得到用戶的選擇??梢允褂靡韵?JComboBox 方法:
JPasswordField JTextField 的一個(gè)細(xì)微變化是 JPasswordField,它允許您隱藏在文本字段區(qū)域中顯示的字符。畢竟,在您輸入口令的時(shí)候,如果每個(gè)人都能看到,那可沒什么好處?可能根本就不好,而且在私人數(shù)據(jù)如此脆弱的今天,您需要所有能夠得到的幫助。以下是 JPasswordField 在 Swing 中看起來的樣子: JPasswordField ![]() JPasswordField 上額外的“安全性”方法對 JTextField 的行為做了輕微改變,所以不能閱讀文本:
JCheckBox/JRadioButton JCheckBox 和 JRadioButton 組件向用戶呈現(xiàn)選項(xiàng),通常采用多選的格式。區(qū)別是什么?從實(shí)踐的角度來說,它們沒有那么不同。它們的行為方式相同。但是,在一般的 UI 實(shí)踐中,它們有細(xì)微差異:JRadioButton 通常組合在一起,向用戶呈現(xiàn)帶有必選答案的問題,而且這些答案具有強(qiáng)制性(這意味著問題只能有一個(gè)答案)。JRadioButton 的行為保證了這個(gè)用法。一旦選擇了JRadioButton,就不能取消對它的選擇,除非選擇了在同一組中的另外一個(gè)單選鈕。從效果上看,這就保證了選項(xiàng)的惟一和必選。JCheckBox 的不同在于,允許隨機(jī)地選擇/取消除選擇,并允許為問題選擇多個(gè)答案。 這里是個(gè)示例。問題“您是男孩還是女孩!”有兩個(gè)惟一答案選項(xiàng)“男孩”或“女孩”。用戶必須選擇一個(gè),不能同時(shí)選中。另一方面,問題“您的習(xí)慣是什么?”的答案有“跑步”、“睡覺”或“閱讀”,不應(yīng)當(dāng)只允許為此問題選擇一個(gè)答案,因?yàn)槿藗兛赡苡胁恢挂粋€(gè)習(xí)慣。 把這些 JCheckBoxe 或 JRadioButton 捆綁成一組的類是 以下是 JCheckBox 和 JRadioButton 在 Swing 中看起來的樣子: JCheckBox 和 JRadioButton ![]() 需要記住的重要的 ButtonGroup 方法是:
JMenu/JMenuItem/JMenuBar JMenu、JMenuItem 和 JMenuBar 組件是在 JFrame 中開發(fā)菜單系統(tǒng)的主要構(gòu)造塊。任何菜單系統(tǒng)的基礎(chǔ)都是 JMenuBar。它平淡而乏味,但卻是必需的,因?yàn)槊總€(gè) JMenu 和 JMenuItem 都要用它構(gòu)建。要用 JMenu/JMenuItem 的區(qū)別看起來可能很明顯,但實(shí)際上,在幕后看起來并不像表面那樣??纯搭惖念悓哟谓Y(jié)構(gòu),就知道 JMenuItem 也支持快捷鍵的概念。與您用過的大多數(shù)應(yīng)用程序一樣,Swing 應(yīng)用程序允許您按下 Ctrl+(某個(gè)鍵)來觸發(fā)一個(gè)操作,就像選中菜單鍵本身一樣。想想用來剪切和粘貼的快捷鍵 Ctrl+X 和 Ctrl+V。 除此之外,JMenu 和 JMenuItem 都支持訪問鍵。用 Alt 鍵與某個(gè)字母關(guān)聯(lián),模擬菜單本身的選擇(例如,在 Windows 中按下 Alt+F,然后按下 Alt+x 就可以關(guān)閉應(yīng)用程序)。 以下是包含 JMenu 和 JMenuItem 的 JMenuBar 在 Swing 中的樣子: JMenuBar、JMenu 和 JMenuItem ![]() 這些類需要的重要方法是:
JSlider 在應(yīng)用程序中 JSlider 支持?jǐn)?shù)值變化。它是一種迅速而簡單的方式,不僅能讓用戶以可視形式獲得他們當(dāng)前選擇的反饋,還能得到可以接受的值的范圍。想像一下這種情況:可以提供一個(gè)文本字段,允許用戶輸入值,但是這樣做就帶來了額外的麻煩,要確保輸入的值是數(shù)字,還要確保數(shù)字符合要求的數(shù)值范圍。例如,如果有一個(gè)金融 Web 站點(diǎn),它向您提問要在股票上投資的百分比,那么您不得不檢查在文本字段中輸入的值,以確保它們是數(shù)字,而且在 0 到 100 之間。如果換用 JSlider,那么就可以確保選擇的是指定范圍內(nèi)的數(shù)字。 在 Swing 中,JSlider 看起來如下所示: JSlider ![]() JSlider 中的重要方法是:
|