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