圖形用戶接口(
GUI
)庫(kù)最初的設(shè)計(jì)目的是讓程序員構(gòu)建一個(gè)通用的
GUI
,使其在所有的平臺(tái)上都能夠正常的顯示。但是比較遺憾的是
AWT
產(chǎn)生的是在各系統(tǒng)看來(lái)都同樣欠佳的圖形用戶接口,
JAVA1.2
為老的
java1.0 AWT
添加了
java
基礎(chǔ)類(
JFC
),這是一個(gè)被稱為
“Swing”
的
GUI
的一部分。
Swing
是第二代
GUI
開(kāi)發(fā)工具集,
AWT
采用了與特定平臺(tái)相關(guān)的實(shí)現(xiàn),而絕大部分
Swing
組件卻不是。
Swing
是構(gòu)筑在
AWT
上層的一組
GUI
組件的集合,為了保證可移植性,它完全用
Java
語(yǔ)言編寫(xiě),與
AWT
相比,
Swing
提供了更完整的組件,引入了許多新的特性和能力。
Swing
提供了更多的組件庫(kù),如:
JTable
,
JTree
,
Jcombox
。
Swing
也增強(qiáng)了
AWT
中組件的功能。正是因?yàn)?/span>
Swing
具備了如此多的優(yōu)勢(shì)所以我們以后在開(kāi)發(fā)中都使用
Swing
。
JComponent
類是
Swing
組件的基類,而
JComponent
繼承自
Container
類,因此,所有的
Swing
組件都是
AWT
的容器。
Swing
采用了
MVC
設(shè)計(jì)模式。
設(shè)計(jì)模式:
當(dāng)你解決一個(gè)問(wèn)題時(shí)你不需要從頭做起,取而代之的是,你應(yīng)該參考過(guò)去的經(jīng)驗(yàn),或者向?qū)<易稍円庖?jiàn),設(shè)計(jì)模式是一種方法,該方法以一種結(jié)構(gòu)化的形式提供專家意見(jiàn)。設(shè)計(jì)模式的靈感來(lái)自于建筑學(xué)設(shè)計(jì)模式。設(shè)計(jì)模式已經(jīng)成為文化的一部分,當(dāng)你談?wù)?/span>
MVC
或
“
觀察者模式時(shí)
”
全世界的程序員都明白你的意思,因而,模式已經(jīng)成為討論設(shè)計(jì)問(wèn)題的有效方法。
Swing
采用了
mvc
模式,
awt
事件模型采用了
“
觀察者
”
模式。
MVC
-【模型-視圖-控制器】模式:
該模式同其他許多設(shè)計(jì)模式一樣,都遵循面向?qū)ο蟮脑O(shè)計(jì)中的一個(gè)基本原則:不讓對(duì)象具有太多的功能,如對(duì)于按鈕來(lái)說(shuō)不要讓一個(gè)按鈕類完成所有的事情,替代的方法就是讓一個(gè)對(duì)象負(fù)責(zé)組件的觀感,而另一個(gè)對(duì)象負(fù)責(zé)存儲(chǔ)內(nèi)容,
mvc
模式實(shí)現(xiàn)三個(gè)獨(dú)立的類:
模型-存儲(chǔ)內(nèi)容;
?
視圖-顯示內(nèi)容;
?
控制器-處理用戶輸入
mvc
模式明確規(guī)定了三個(gè)對(duì)象如何進(jìn)行交互。模型存儲(chǔ)內(nèi)容,它沒(méi)有任何用戶界面。對(duì)于一個(gè)按鈕來(lái)說(shuō),內(nèi)容非常簡(jiǎn)單,它只是一組標(biāo)志,用來(lái)說(shuō)明按鈕是否按下,是否啟用等。對(duì)于一個(gè)文本框來(lái)說(shuō)內(nèi)容稍稍復(fù)雜,它是容納當(dāng)前文本的一個(gè)字符串對(duì)象。這個(gè)內(nèi)容和視圖的內(nèi)容并不一致--如果內(nèi)容長(zhǎng)度大于文本框的顯示長(zhǎng)度,那么用戶只能看到的就是只有文本框顯示的那一部分。
mvc
模式總結(jié):模型存儲(chǔ)完整內(nèi)容,視圖給出了內(nèi)容的可視化表示【完整或者不完整】,控制器負(fù)責(zé)處理用戶輸入事件,如鼠標(biāo)點(diǎn)擊和鍵盤(pán)事件等,然后它決定是否把這些事件轉(zhuǎn)化成對(duì)模型或視圖的改變。控制器作用舉例:如果用戶在一個(gè)文本框中按下了一個(gè)字符鍵,那么控制器就會(huì)調(diào)用模型中的
“
插入字符
”
命令,然后模型告訴視圖進(jìn)行更新,而視圖永遠(yuǎn)不會(huì)知道文本為什么改變了,但是如果用戶按下了一個(gè)光標(biāo)鍵,那么控制器會(huì)通知視圖進(jìn)行卷屏滾動(dòng)。卷動(dòng)視圖對(duì)實(shí)際文本不會(huì)有任何的影響,因此模型永遠(yuǎn)不會(huì)知道該事件的發(fā)生。
Mvc
模式的一個(gè)優(yōu)點(diǎn)是
:
一個(gè)模型可以有多個(gè)視圖,其中每個(gè)視圖可以顯示完整內(nèi)容的不同部分或不同方面。如果作為程序員來(lái)使用
Swing
,則不需要考慮
mvc
的體系結(jié)構(gòu),每個(gè)用戶界面元素都有一個(gè)包裝類(如
Jbutton
和
JTextField
),來(lái)保存模型和視圖。
JFrame
:
JFrame
與
Frame
的功能相當(dāng),但遠(yuǎn)比
Frame
復(fù)雜。
JFrame
的結(jié)構(gòu)相當(dāng)復(fù)雜,在
JFrame
中安排了四個(gè)窗格,其中根窗格(
JRoot
)、布局窗格(
JLayeredPane
)和透明窗格(
Glass pane
)和我們沒(méi)有什么關(guān)系;他們用來(lái)組織菜單條和內(nèi)容窗格,以及實(shí)現(xiàn)觀感的。
Swing
程序員最關(guān)心的是內(nèi)容窗格(
content pane
),當(dāng)設(shè)計(jì)一個(gè)框架時(shí),組件會(huì)被添加到內(nèi)容窗格中,如下代碼所示:
Container cp=f.getContentPane();
Component c=…
cp.add(c);
很明顯上面的代碼和我們?cè)谇懊鎸W(xué)的
AWT
的編程方式不一樣,不能直接用
add
方法添加組件到
JFrame
上。
JFrame
的
ContentPane
的默認(rèn)布局管理器為
BorderLayout
。
JPanel
組件為中間容器,用于將較小的輕量級(jí)組件組合在一起,這意味著它與內(nèi)容窗格相似。
JPanel
默認(rèn)為
FlowLayout
布局。
JMenuBar
:
只能通過(guò)
JFrame
、
JWindow
或
JInternalFrame
的根窗格來(lái)添加。
JMenuBar
不能直接添加到窗體中。它由多個(gè)
Jmenu
組成,每個(gè)
JMenu
在
JMenuBar
中都表示為字符串。
JMenuBar
需要兩個(gè)附件類來(lái)輔助其工作。它們是
SingleSelectionModel
類和
LookAndFeel
類。
SingleSelectionModel
類跟蹤當(dāng)前選定的菜單,
LookAndFeel
類負(fù)責(zé)繪制菜單欄以及在其中發(fā)生的事件作出響應(yīng)。
?????? JMenu:有兩個(gè)用途,顯示在JMenuBar下時(shí),它以文本字符串的形式顯示;用戶單擊字符串時(shí)它以彈出式菜單形式顯示。可包括標(biāo)準(zhǔn)菜單項(xiàng),如JMenuItem、JCheckBoxMenuItem、JRadioButtonMenuItem和Jeeparator等。JMenu需要兩個(gè)附件類來(lái)輔助其工作。它們是JPopupMenu類和LookAndFeel類。JMenu類將創(chuàng)建JPopupMenu類,并從當(dāng)前可插入的觀感中獲得自己的觀感,用戶單擊JMenu,LookAndFeel類負(fù)責(zé)繪制菜單欄中的菜單以及對(duì)在其中發(fā)生的所有事情作出響應(yīng)。