swing入門教程swing簡介(2009-04-20 23:52:40)
(轉(zhuǎn)自http://terrificwanjun./) UI 組件簡介 在開始學(xué)習(xí) Swing 之前,必須回答針對真正初學(xué)者的一個問題:什么是 UI?初學(xué)者的答案是“用戶界面”。但是因為本教程的目標(biāo)是要保證您不再只是個初學(xué)者,所以我們需要比這個定義更高級的定義。 所以,我再次提出這個問題:什么是 UI?您可能把它定義成您按下的按鈕、打字的地址欄 、打開和關(guān)閉的窗口,等等,這些都是 UI 的元素,但是除了在屏幕上看到的這些之外,還有更多都是 UI 元素。比如鼠標(biāo)、鍵盤、音量、屏幕顏色、使用的字體,以及一個對象相對于另一個對象的位置,這些都包含在 UI 之中。實際上,在計算機(jī)和用戶的交互之中扮演角色的任何對象都是 UI 的組成部分。這看起來足夠簡單,但是您應(yīng)當(dāng)驚訝的是,有許多人和大型公司已經(jīng)為它努力了很多年。實際上,現(xiàn)在有的大學(xué)專業(yè)的惟一課程就是研究這種交互。 Swing 的角色 Swing 是 Java 平臺的 UI —— 它充當(dāng)處理用戶和計算機(jī)之間全部交互的軟件。它實際上充當(dāng)用戶和計算機(jī)內(nèi)部之間的中間人。Swing 到底是如何做這項工作的呢?它提供了處理前面一節(jié)中描述的 UI 各方面內(nèi)容的機(jī)制:
無論如何,Swing 為您提供了創(chuàng)建自己的 UI 所需要的所有工具 MVC Swing 甚至走得更遠(yuǎn)一步,在基本的 UI 原則之上又放上了一個公共的設(shè)計模式。這個設(shè)計模式叫做模型-視圖-控制器(Model-View-Controller,MVC),它試圖“把角色分開”。MVC 讓負(fù)責(zé)顯示的代碼、處理數(shù)據(jù)的代碼、對交互進(jìn)行響應(yīng)并驅(qū)動變化的代碼彼此分離。 有點迷惑?如果我為這個設(shè)計模式提供一個現(xiàn)實世界的非技術(shù)性示例,它就比較容易了。請想像一次時裝秀。把秀場當(dāng)成 UI,假設(shè)服裝就是數(shù)據(jù),是展示給用戶的計算機(jī)信息?,F(xiàn)在,假設(shè)這次時裝秀中只有一個人。這個人設(shè)計服裝、修改服裝、同時還在 T 臺上展示這些服裝。這看起來可不是一個構(gòu)造良好的或有效率的設(shè)計。 現(xiàn)在,假設(shè)同樣的時裝秀采用 MVC 設(shè)計模式。這次不是一個人做每件事,而是將角色分開。時裝模特(不要與 MVC 縮寫中的模型混淆)展示服裝。他們扮演的角色是視圖。他們知道展示服裝(數(shù)據(jù)的)適當(dāng)方法,但是根本不知道如何創(chuàng)建或設(shè)計服裝。另一方面,時裝設(shè)計師充當(dāng)控制器。時裝設(shè)計師對于如何在 T 臺上走秀沒有概念,但他能創(chuàng)建和操縱服裝。時裝模特和設(shè)計師都能獨立地處理服裝,但都有自己的專業(yè)領(lǐng)域。 這就是 MVC 設(shè)計模式背后的概念:讓 UI 的每個方面處理它擅長的工作。如果您仍然不明白,那么教程后面的示例有望消除您的迷惑 —— 但是在您繼續(xù)進(jìn)行的時候,請記住基本的原則:用可視組件顯示數(shù)據(jù),同時讓其他類操縱數(shù)據(jù)。 JComponent Swing 的整個可視組件庫的基礎(chǔ)構(gòu)造塊是 JComponent。它是所有組件的父類。它是一個抽象類,所以不能創(chuàng)建 JComponent,但是作為類層次結(jié)構(gòu)的結(jié)果,從字面意義來說它包含了數(shù)百個函數(shù),Swing 中的每個組件都可以使用這些函數(shù)。顯然,有些概念要比其他概念重要,所以對于本教程,需要學(xué)習(xí)的重要的東西是:
簡單的swing小部件 JLabel Swing 庫中最基礎(chǔ)的組件是 JLabel。它所做的正是您所期望的:呆在那兒,看起來很漂亮,描述其他組件。下圖顯示了的 JLabel 實際應(yīng)用: JLabel
不太吸引人,但是仍然有用。實際上,在整個應(yīng)用程序中,不僅把 JLabel 用作文本描述,還將它用作圖片描述。每當(dāng)在 Swing 應(yīng)用程序中看到圖片的時候,它就有可能是 JLabel。JLabel 對于 Swing 初學(xué)者來說沒有許多意料之外的方法?;镜姆椒òㄔO(shè)置文本、圖片、對齊以及標(biāo)簽描述的其他組件:
Swing 中的基本動作組件 JButton,是與每個窗口中都能看到的 OK 和 Cancel 一樣的按鈕;這些按鈕所做的正是您希望它們做的工作 —— 在單擊它們之后,將發(fā)生一些事情。到底會發(fā)生什么呢?您必須定義發(fā)生的內(nèi)容(請參閱 事件,以獲得更多信息)。一個 JButton 實例看起來如下所示: JButton
用來改變 JButton 屬性的方法與 JLabel 的方法類似(您可能發(fā)現(xiàn),在大多數(shù) Swing 組件中,這些屬性都類似)。它們控制文本、圖片和方向:
除了這些方法,我還要介紹 JButton 包含的另外一組方法。這些方法利用了按鈕的所有不同狀態(tài)。狀態(tài)是對組件進(jìn)行描述的一個屬性,通常采用真/假設(shè)置。在 JButton 中,可以包含以下可能狀態(tài):活動/不活動、選中/沒選中、鼠標(biāo)經(jīng)過/鼠標(biāo)離開、按下/沒按下,等等。另外,可以組合這些狀態(tài),例如按鈕可以在鼠標(biāo)經(jīng)過的同時被選中?,F(xiàn)在您可能會問自己用這些狀態(tài)到底要做什么。作為示例,請看看您的瀏覽器上的后退按鈕。請注意在鼠標(biāo)經(jīng)過它的時候,圖片是如何變化的,在按下該按鈕時,圖片又是如何變化的。這個按鈕利用了不同的狀態(tài)。每個狀態(tài)采用不同的圖片,這是提示用戶交互正在進(jìn)行的一種普遍并且有效的方式。JButton 上的狀態(tài)方法是:
JTextField Swing 中的基本文本組件是 JTextField,它允許用戶在 UI 中輸入文本。我肯定您熟悉文本字段:要掌握本教程,則必須使用一個文本字段輸入用戶名和口令。您輸入文本、刪除文本、選中文本、把文字四處移動 —— Swing 替您負(fù)責(zé)所有這些工作。作為 UI 開發(fā)人員,利用 JJTextField 時,實際上并不需要做什么。 在任何情況下,這是 JTextField 實際使用時看起來的樣子: JTextField
在處理 JTextField 時,只需要關(guān)注一個方法 —— 這應(yīng)當(dāng)是很明顯的,這個方法就是設(shè)置文本的方法: JFrame 迄今為止,我介紹了 Swing 的三個基本構(gòu)造塊:標(biāo)簽、按鈕和文本字段;但是現(xiàn)在需要個地方放它們,希望用戶知道如何處理它們。JFrame 類就是做這個的——它是一個容器,允許您把其他組件添加到它里面,把它們組織起來,并把它們呈現(xiàn)給用戶。它有許多其他好處,但是我認(rèn)為先看看它的圖片最簡單: JFrame
JFrame 實際上不僅僅讓您把組件放入其中并呈現(xiàn)給用戶。比起它表面上的簡單性,它實際上是 Swing 包中最復(fù)雜的組件。為了最大程度地簡化組件,在獨立于操作系統(tǒng)的 Swing 組件與實際運行這些組件的操作系統(tǒng)之間,JFrame 起著橋梁的作用。JFrame 在本機(jī)操作系統(tǒng)中是以窗口的形式注冊的,這么做之后,就可以得到許多熟悉的操作系統(tǒng)窗口的特性:最小化/最大化、改變大小、移動。但是對于本教程的目標(biāo)來說,把 JFrame 當(dāng)作放置組件的調(diào)色板就足夠了??梢栽?JFrame 上調(diào)用的一些修改屬性的方法是:
簡單應(yīng)用程序 就像所有的“x 入門”教程一樣,本教程也包含必不可少的 HelloWorld 演示。但這個示例不僅對觀察 Swing 應(yīng)用程序如何工作有用,還對確保設(shè)置正確很有用。一旦使這個簡單的應(yīng)用程序能夠成功運行,那么之后的每個示例也將能夠運行。下圖顯示了完成后的示例: HelloWorld 示例 第一步是創(chuàng)建類。將組件放在 JFrame 上的 Swing 應(yīng)用程序需要繼承JFrame 類,如下所示:
這樣做之后,就得到上面描述的所有 JFrame 屬性,最重要的是操作系統(tǒng)對窗口的本機(jī)支持。下一步是把組件放在屏幕上。在這個示例中,使用了一個 null 布局。在教程的后面部分,您將學(xué)到更多關(guān)于布局和布局管理器的內(nèi)容。但對于這個示例,可以用數(shù)字表示 JFrame 上的像素位置:
現(xiàn)在組件都放在了 JFrame 上,并且需要在屏幕上顯示 JFrame,并讓應(yīng)用程序可以運行。就像在所有的 Java 應(yīng)用程序中一樣,必須添加一個 main 方法,才能讓 Swing 應(yīng)用程序運行。在這個 main 方法中,只需要創(chuàng)建 HelloWorld 應(yīng)用程序?qū)ο螅缓笳{(diào)用其setVisible()即可:
完成了!這就是創(chuàng)建應(yīng)用程序的所有過程。 完整代碼如下: package cn.edu.jnu.www; private javax.swing.JLabel getJLabel() { private javax.swing.JTextField getJTextField() { private javax.swing.JButton getJButton() {
} 附加的swing小部件(上) JComboBox
在這一節(jié)中,我將介紹 Swing 庫中的其他全部組件、如何使用它們、它們看起來是什么樣的,等等,這部分內(nèi)容應(yīng)當(dāng)讓您更好地了解 Swing 為 UI 開發(fā)人員提供了什么。 我們從 JComboBox 開始介紹。組合框與下拉選擇相似,區(qū)別在于使用組合框時用戶可以不從列表中選擇項目,還可以選擇一個(而且只有一個)項目。在某些版本的組合框中,還可以輸入自己的選擇。瀏覽器的地址欄就是一個示例:它是一個允許輸入自己選項的組合框。以下是 JComboBox 在 Swing 中看起來的樣子: JComboBox JComboBox 的重要函數(shù)包括 JComboBox 包含的數(shù)據(jù)。需要有一種方法來設(shè)置 JComboBox 中的數(shù)據(jù)、修改數(shù)據(jù)、在用戶選擇時得到用戶的選擇??梢允褂靡韵?JComboBox 方法:
JTextField JTextField 的一個細(xì)微變化是 JPasswordField,它允許您隱藏在文本字段區(qū)域中顯示的字符。畢竟,在您輸入口令的時候,如果每個人都能看到,那可沒什么好處?可能根本就不好,而且在私人數(shù)據(jù)如此脆弱的今天,您需要所有能夠得到的幫助。以下是 JPasswordField 在 Swing 中看起來的樣子: JPasswordField JPasswordField 上額外的“安全性”方法對 JTextField 的行為做了輕微改變,所以不能閱讀文本:
JCheckBox 和 JRadioButton 組件向用戶呈現(xiàn)選項,通常采用多選的格式。區(qū)別是什么?從實踐的角度來說,它們沒有那么不同。它們的行為方式相同。但是,在一般的 UI 實踐中,它們有細(xì)微差異:JRadioButton 通常組合在一起,向用戶呈現(xiàn)帶有必選答案的問題,而且這些答案具有強(qiáng)制性(這意味著問題只能有一個答案)。JRadioButton 的行為保證了這個用法。一旦選擇了JRadioButton,就不能取消對它的選擇,除非選擇了在同一組中的另外一個單選鈕。從效果上看,這就保證了選項的惟一和必選。JCheckBox 的不同在于,允許隨機(jī)地選擇/取消除選擇,并允許為問題選擇多個答案。 這里是個示例。問題“您是男孩還是女孩!”有兩個惟一答案選項“男孩”或“女孩”。用戶必須選擇一個,不能同時選中。另一方面,問題“您的習(xí)慣是什么?”的答案有“跑步”、“睡覺”或“閱讀”,不應(yīng)當(dāng)只允許為此問題選擇一個答案,因為人們可能有不止一個習(xí)慣。 把這些 JCheckBoxe 或 JRadioButton 捆綁成一組的類是 以下是 JCheckBox 和 JRadioButton 在 Swing 中看起來的樣子: JCheckBox 和 JRadioButton 需要記住的重要的 ButtonGroup 方法是:
JMenu、JMenuItem 和 JMenuBar 組件是在 JFrame 中開發(fā)菜單系統(tǒng)的主要構(gòu)造塊。任何菜單系統(tǒng)的基礎(chǔ)都是 JMenuBar。它平淡而乏味,但卻是必需的,因為每個 JMenu 和 JMenuItem 都要用它構(gòu)建。要用 JMenu/JMenuItem 的區(qū)別看起來可能很明顯,但實際上,在幕后看起來并不像表面那樣??纯搭惖念悓哟谓Y(jié)構(gòu),就知道 JMenuItem 也支持快捷鍵的概念。與您用過的大多數(shù)應(yīng)用程序一樣,Swing 應(yīng)用程序允許您按下 Ctrl+(某個鍵)來觸發(fā)一個操作,就像選中菜單鍵本身一樣。想想用來剪切和粘貼的快捷鍵 Ctrl+X 和 Ctrl+V。 除此之外,JMenu 和 JMenuItem 都支持訪問鍵。用 Alt 鍵與某個字母關(guān)聯(lián),模擬菜單本身的選擇(例如,在 Windows 中按下 Alt+F,然后按下 Alt+x 就可以關(guān)閉應(yīng)用程序)。 以下是包含 JMenu 和 JMenuItem 的 JMenuBar 在 Swing 中的樣子: JMenuBar、JMenu 和 JMenuItem 這些類需要的重要方法是:
在應(yīng)用程序中 JSlider 支持?jǐn)?shù)值變化。它是一種迅速而簡單的方式,不僅能讓用戶以可視形式獲得他們當(dāng)前選擇的反饋,還能得到可以接受的值的范圍。想像一下這種情況:可以提供一個文本字段,允許用戶輸入值,但是這樣做就帶來了額外的麻煩,要確保輸入的值是數(shù)字,還要確保數(shù)字符合要求的數(shù)值范圍。例如,如果有一個金融 Web 站點,它向您提問要在股票上投資的百分比,那么您不得不檢查在文本字段中輸入的值,以確保它們是數(shù)字,而且在 0 到 100 之間。如果換用 JSlider,那么就可以確保選擇的是指定范圍內(nèi)的數(shù)字。 在 Swing 中,JSlider 看起來如下所示: JSlider JSlider 中的重要方法是:
與 JSlider 非常像,可以用 JSpinner 允許用戶選擇一個整數(shù)值。JSlider 的一個主要優(yōu)勢就是比 JSlider 的空間緊湊。但是,它的不足就是無法方便地設(shè)置其邊界。 但是,兩個組件之間的比較僅此而已。JSpinner 更加靈活,可以用來在任意組的值之間進(jìn)行選擇。除了在數(shù)字間選擇,它還可以用來在日期、名稱、顏色和任何事之間進(jìn)行選擇。這使 JSpinner 極為強(qiáng)大,允許您提供其中只包含預(yù)定義的選擇的組件。使用這種方式,它與 JComboBox 類似,但是它們的應(yīng)用不能互換。只應(yīng)把 JSpinner 用在邏輯上連續(xù)的選擇 —— 數(shù)字和日期是最合邏輯的選擇。而另一方面,在呈現(xiàn)看起來隨機(jī)的選擇并且選擇之間沒有連接的時候,JComboBox 是更好的選擇。 JSpinner 看起來如下所示: JSpinner 重要方法是:
JToolBar 充當(dāng)其他組件(JButton、JComboBoxe 等)的調(diào)色板,共同構(gòu)成您在大多數(shù)應(yīng)用程序中熟悉的工具欄。工具欄允許程序把常用的命令放在可以迅速發(fā)現(xiàn)的位置,并把它們以常用命令組的形式組合在一起。一般(但不總是這樣)情況下,工具欄按鈕在菜單欄中會有對應(yīng)的命令。雖然這不是必需的,但已經(jīng)變成了一種公共實踐,您也應(yīng)當(dāng)試著這么做。 JToolBar 也提供了您在其他工具欄中看到過的其他功能:“浮動”的能力(也就是成為主幀頂部獨立的幀)。 下圖顯示了一個非浮動 JToolBar: 非浮動 JToolBar 對于 JToolBar,要記住的重要方法是: 您可能到處都看到過 JToolTip,但是從來不知道它們叫什么。它們就像您鞋帶上的塑料部件 —— 到處都有,但是您就是不知道它們正確的名字(如果您想知道,那么可以叫它們 金屬箍)。JToolTip 就是您將鼠標(biāo)停留在某個東西上面的時候彈出來的小“泡泡”。它們在應(yīng)用程序中可能非常有用,可以為難用的項目提供幫助、擴(kuò)展信息,甚至在擁擠的 UI 中顯示某個項目的完整文本。在 Swing 中,可以通過把鼠標(biāo)放在某個組件上的特定時間來觸發(fā)它們;它們通常在鼠標(biāo)處于不活動狀態(tài)大約 1 秒鐘之后顯示。只要鼠標(biāo)還停留在那個組件上,它們就保持可見。 JToolTip 的重要部分是它的易用性。 以下是 JToolTip 看起來的樣子: A JToolTip 附加的swing小部件(下) JOptionPane
以下是一個 JOptionPane: JOptionPane 使用 JOptionPane 時有點麻煩的是可以使用的全部選項。雖然簡單,但是它仍然提供了大量選項,這些選項有可能造成混淆。學(xué)習(xí) JOptionPane 的最好方法就是使用它;編寫代碼,觀察彈出的是什么。這個組件幾乎可以讓您修改它的每一方面:幀標(biāo)題、消息本身、顯示的圖標(biāo)、按鈕選項,以及是否需要文本響應(yīng)。因為有太多的可能性,無法在本教程中一一列舉它們,所以您最好是訪問 JOptionPane 的 API 頁面,查看它的眾多可能性。 JTextArea 比 JTextField 更進(jìn)了一步。JTextField 被局限在一行文本中,而 JTextArea 擴(kuò)展了這個能力,支持多行文本??梢园阉胂癯梢粋€空白頁,您可以在其中的任意地方進(jìn)行輸入。正如您可能猜到的,JTextArea 包含許多與 JTextField 相同的功能,畢竟,它們實際上是相同的組件。但是 JTextArea 提供了一些額外的重要功能,可以把它區(qū)別開。這些功能包括單詞自動換行的能力(即把長文本自動換行到下一行,而不是將單詞從中斷開)、對文本自動換行的能力(即把長的文本行移動到下一行,而不是創(chuàng)建一個需要水平滾動條的非常長的行)。 Swing 中的 JTextArea 看起來就像您期望的那樣: A JTextArea 支持行和單詞的自動換行的重要方法是:
上面的示例構(gòu)造完成之后,假設(shè) JTextArea 包含太多文本,而給定的空間中容納不下,那這該怎么辦?如果您以為會自動出現(xiàn)滾動條,那么很不幸,您錯了。JScrollPane 添補(bǔ)了這個空白,為 Swing 組件提供了處理所有與滾動條相關(guān)的動作。所以雖然為每個需要的組件提供滾動塊可能有些痛苦,但是一旦添加了它,它就會自動處理每件事,包括在需要的時候隱藏/顯示滾動條。 除了用需要自動換行的組件創(chuàng)建 JScrollPane 之外,不必直接處理它。根據(jù)上面的示例,用 JTextArea 調(diào)用 JScrollPane 的構(gòu)造函數(shù),這為 JTextArea 創(chuàng)建了在文本過長時滾動的能力:
更新后的示例看起來如下所示: JScrollPane 示例 JScrollPane 也公開了它將創(chuàng)建的兩個 JScrollBar。這些 JScrollBar 組件也包含一些方法,可以用這些方法來修改組件的行為(雖然它們不在本教程的范圍之內(nèi))。 使用 JScrollPane 需要的方法是:
JList JList 是一個有用的組件,用于向用戶呈現(xiàn)許多選擇??梢园阉?dāng)作 JComboBox 的擴(kuò)展。JList 提供了更多選擇,并添加了多選的能力。在 JList 與 JComboBox 之間進(jìn)行選擇通常取決于以下兩個特性:如果需要多選,或者選擇的選項超過 15 個(雖然這個數(shù)字并不是通用規(guī)則),那么就應(yīng)當(dāng)選擇 JList。 應(yīng)用將 JList 與 JScrollPane 結(jié)合使用,就像上面演示的那樣,因為它能夠呈現(xiàn)比它的空間所能容納的更多的選項。 JList 包含選擇模型的概念(在 JTable 中也會看到),在這里,可以設(shè)置 JList 接受不同類型的選擇。這些類型是:單一選擇(只能選擇一項)、單一間隔選擇(只能選擇相鄰選項),以及任意多項或者多項間隔選擇(可以選擇任意數(shù)量、任意組合的選擇)。 JList 是第一個我稱為 “復(fù)雜組件” 的組件,該復(fù)雜組件還包含 JTable 和 JTree,它們支持大量的定制變化,其中包括改變 UI 的表現(xiàn)方式、處理數(shù)據(jù)的方式。因為本教程只是想介紹基礎(chǔ)知識,所以我不想深入這些更高級的功能,但是在使用這些組件時有件事需要記住 —— 它們帶來的挑戰(zhàn)要比目前為止介紹過的所有組件都大。 JList 在 Swing 中看起來如下所示: JList JList 中有許多處理數(shù)據(jù)的函數(shù),而且根據(jù)我的說法,這些也只不過是使用 JList 的細(xì)節(jié)的皮毛而已。以下是一些基本方法:
在考慮 JTable 時,請想像一下一個 Excel 工作表,這樣就可以對 JTable 在 Swing 中的作用有一個清晰的印象。它與工作表共享許多相同的特征:單元格、行、列、移動列、隱藏列等。JTable 把 JList 的想法更進(jìn)了一步。它不是在一列中顯示數(shù)據(jù),而是在多列中顯示數(shù)據(jù)。讓我們以人為例。JList 只能顯示人的一個屬性 —— 例如他或她的名字。而 JTable 就能夠顯示多個屬性 —— 名字、年齡、地址,等等。JTable 是支持提供數(shù)據(jù)的大多數(shù)信息的 Swing 組件。 不幸的是,作為代價,JTable 也是最難對付的 Swing 組件。許多 UI 開發(fā)人員都為了學(xué)習(xí) JTable 的每個細(xì)節(jié)而頭痛。在這里,我希望我把能把您解救出來,只用您的 JTable 知識處理問題。 許多 JList 中的概念也擴(kuò)展到了 JTable,其中包括不同的選擇間隔的概念。但是 JList 中一列的概念變成了 JTable 的單元格的概念。這意味著在 JTable 中進(jìn)行選擇時會有不同的方式,例如列、行或者一個單元格。 在 Swing 中,JTable 看起來如下所示: JTable 最后,JTable 的大多數(shù)函數(shù)都超出本教程的范圍;“中級 Swing”會深入這個復(fù)雜組件的更多細(xì)節(jié)。 JTree 是另外一個復(fù)雜組件,它不像 JTable 那樣難用,但是也不像 JList 那么容易。使用 JTree 時麻煩的部分是它要求的數(shù)據(jù)模型。 JTree 的功能來自樹的概念,樹有分支和葉子。您在 Windows 中使用 IE 瀏覽器時,可能非常熟悉這個概念 —— 可以展開和折疊分支,顯示可以選擇和取消選擇的不同葉子。 您很有可能發(fā)現(xiàn)樹在應(yīng)用程序中不像表格或列表那樣有用,所以在 Internet 上沒有許多有幫助的這方面的示例。實際上,像 JTable 一樣,JTree 沒有什么入門級的功能。如果決定使用 JTree,那么立即就可以達(dá)到中級水平,當(dāng)然還必須學(xué)習(xí)隨之而來的概念。因此,示例應(yīng)用程序沒有介紹 JTree,所以也很不幸,不管是入門教程還是中級教程,都沒有涉及這個不太流行的組件。 但是,樹有一些時候是符合需求的合理的 UI 組件。文件/目錄系統(tǒng)就是一個示例(就像在 IE 瀏覽器中那樣),而且當(dāng)數(shù)據(jù)采取層次結(jié)構(gòu)的時候,也就是說數(shù)據(jù)采用樹的形式的時候,JTree 就是最佳組件。 在 Swing 中,JTree 看起來如下所示: JTree Swing概念 布局、模型和事件
既然您已經(jīng)知道了大多數(shù)(肯定不是全部)可以用來制作 UI 的組件,那么就必須實際用它們做些什么。您不能只是隨意地把它們放在屏幕上,然后就指望它們立即就能工作。您必須把它們放在特定的點上,對它們的交互作出反應(yīng),然后根據(jù)交互更新它們,用數(shù)據(jù)填充它們。要填滿 UI 知識的這片空白,還需要更多地學(xué)習(xí) UI 的其他重要部分。 所以,讓我們來研究以下內(nèi)容:
簡單布局 就像在前面提到過的,布局替您處理組件在應(yīng)用程序中的擺放。您的第一個問題可能是“為什么不能用像素告訴它應(yīng)當(dāng)在什么地方呢?”是的,您可以這樣做,但是在窗口改變大小的時候,或者更糟一些情況,即用戶改變其屏幕的分辨率的時候,亦或在有人想在其他操作系統(tǒng)上試用應(yīng)用程序的時候,您立刻就會遇到麻煩。布局管理器把這些擔(dān)心一掃而空。不是每個人都用相同的設(shè)置,所以布局管理器會創(chuàng)建“相對”布局,允許您指定組件相對于其他組件的擺放方式,決定事物改變尺寸的方式。這是好的部分:比聽起來更容易。只要調(diào)用 目前在 Swing 中包含了大量布局;看起來好象每次發(fā)布都會有一個新布局負(fù)責(zé)不同的目的。但是,有些經(jīng)過實踐檢驗的布局一直存在,而且會永遠(yuǎn)存在,我指的是永遠(yuǎn) —— 因為從 1995 年 Java 語言的第一個發(fā)行版開始,就有這些布局。這些布局是:FlowLayout、GridLayout 和 BorderLayout。 FlowLayout 從左到右安排組件。當(dāng)空間不足時,就移到下一行。它是使用起來最簡單的布局,因此,也就是能力最弱的布局:
FlowLayout 實例 GridLayout 就像您想像的那樣工作:它允許指定行和列的數(shù)量,然后在添加組件時把組件放在這些單元格中:
GridLayout 實例 即使 Swing 中添加了許多新的布局管理器,BorderLayout 仍然是其中非常有用的一個。即使有經(jīng)驗的 UI 開發(fā)人員也經(jīng)常使用 BorderLayout。它使用東、南、西、北、中的概念在屏幕上放置組件:
BorderLayout 實例 雖然上面的示例對于簡單的布局來說很好,但是更高級的 UI 需要更高級的布局管理器。這是 GridBagLayout 發(fā)揮作用的地方。不幸的是,使用它的時候極易混淆、極為困難,每個曾經(jīng)用過它的人都會同意這點。我也不能反對;但是除了它的困難之外,它可能是用 Swing 內(nèi)置的布局管理器創(chuàng)建漂亮 UI 的最好方式。 以下是我的第一個小建議:在最新版的 Eclipse 中,有內(nèi)置的可視化構(gòu)建器,這個個小建議可以自動根據(jù)每個屏幕的需要來構(gòu)建必需的 GridBagLayout 代碼。請使用這個功能!它會節(jié)約無數(shù)為了讓數(shù)字正確而浪費的時間。所以在我用這一節(jié)解釋 GridBagLayout 如何工作、如何調(diào)整它才能讓它做得最好時,建議您去找一個可視化構(gòu)建器并生成代碼。它會節(jié)約您的工作時間 事件 最后,我們來到 Swing 最重要的一部分:處理事件,對 UI 的交互作出反應(yīng)。Swing 用事件/偵聽器模型處理事件。這個模型的工作方式是:允許某個類登記到某個組件的某個事件上。登記到事件的這個類叫做偵聽器,因為它等候組件的事件發(fā)生,而且在事件發(fā)生時采取行動。組件本身知道如何“激活”事件(即,知道它能生成的交互類型,以及如何讓偵聽器知道這個交互什么時候發(fā)生)。組件與包含有關(guān)交互信息的事件和類針對交互進(jìn)行通信。 把技術(shù)方面的空談放在一邊,我們來看幾個 Swing 中事件的實例。首先從最簡單的示例開始,即一個 JButton,按下它的時候,會在控制臺上輸出“Hello”。 JButton 知道它什么時候被按下;這是在內(nèi)部處理的,不需要代碼處理它。但是,偵聽器需要進(jìn)行登記,以接收來自 JButton 的事件,這樣您才能輸出“Hello”。
JList 也用類似的方式工作。當(dāng)有人在 JList 中選中什么時,您可能想把選中的對象輸出到控制臺上:
從這兩個示例,您應(yīng)當(dāng)能夠理解事件/偵聽器模型在 Swing 中如何工作了。實際上,Swing 中的每個交互都是以這種方式處理的,所以通過理解這個模型,您就立即能夠理解在 Swing 中如何處理每個事件,以及如何對用戶可能拋給您的任何交互做反應(yīng)了。 模型 現(xiàn)在,您應(yīng)當(dāng)了解了 Java 的集合(Collection),這是一組處理數(shù)據(jù)的 Java 類。這些類包括 這就是模型的概念發(fā)揮作用的地方了。雖然模型這個術(shù)語表達(dá)的范圍更大,但是在本教程的示例中,我用 UI 模型這個術(shù)語描述組件用來顯示數(shù)據(jù)的類。 在 Swing 中每個處理集合數(shù)據(jù)的的組件都采用模型的概念,而且這也是使用和操縱數(shù)據(jù)的首選方法。它清晰地把 UI 的工作與底層數(shù)據(jù)分開(請回想 MVC 示例)。模型工作的機(jī)制是向組件描述如何顯示集合數(shù)據(jù)。我說的“描述”指的是什么呢?每個組件需要的描述略有不同:
您可能會問:為什么要做這么些工作?為什么要把這些功能分開?請想像以下場景:您有一個復(fù)雜的 JTable,有許多列數(shù)據(jù),您在許多不同的屏幕上使用這個表格。如果您突然決定刪除某個列,那么怎么做會更容易呢?修改您使用的每個 JTable 實例中的代碼?還是創(chuàng)建一個可以在每個 JTable 實例中使用的模型類,然后只修改這一個模型類呢?顯然,所做的修改越少越好。 模型示例 我們來看看模型如何工作,在一個簡單的 JComboBox 示例中使用模型。在 JComboBox 前面的演示中,我介紹了如何調(diào)用 JComboBox 包含一個方法調(diào)用 假設(shè)有一個
采用模型時更好的地方是:您可以反復(fù)重用它。例如,假設(shè) JComboBox 的數(shù)據(jù)需要從字母表變成 1 到27 的數(shù)字。那么只用一行就可以實現(xiàn)這個變化:用新的數(shù)據(jù)
模型在 Swing 中是非常有好處的特性,因為它們提供了代碼重用功能,而且使數(shù)據(jù)處理更加容易。更常見的應(yīng)用是在大型應(yīng)用程序中,服務(wù)器端開發(fā)人員創(chuàng)建和檢索數(shù)據(jù),并把數(shù)據(jù)傳遞給 UI 開發(fā)人員。如何處理這些數(shù)據(jù)和正確地顯示它們,取決于 UI 開發(fā)人員,而模型就是實現(xiàn)這項任務(wù)的工具。 Swing入門(一)(2009-04-21 00:02:20)
(轉(zhuǎn)自http://terrificwanjun.) package cn.edu.jnu.www; } Swing學(xué)習(xí)(二)(2009-04-21 00:03:22)
(轉(zhuǎn)自http://terrificwanjun.) import java.awt.*; public } 上面誤用void生成的結(jié)果,有興趣的朋友可以試試.另外查了一下J2SE API,才知道show( )方法已經(jīng)被setvisible( )取代. 使用Frame創(chuàng)建窗體
在Awt中,Window類沒有邊界和菜單欄,所以不能直接使用Window類來創(chuàng)建窗體,必須使用Window類的子類Frame來創(chuàng)建,創(chuàng)建代碼為: package cn.edu.jnu.www; import java.awt.*; }
//使用WindowAdapter適配器類來實現(xiàn)監(jiān)聽器 zhua : http://blog.sina.com.cn/s/blog_43c4b6530100cywl.html |
|