圖形用戶(hù)界面
(GUI)
可以通過(guò)鍵盤(pán)或鼠標(biāo)來(lái)響應(yīng)用戶(hù)的操作,
Java
提供了
AWT
和
Swing
兩個(gè)包進(jìn)行圖形用戶(hù)界面編程。
AWT
是一組
Java
類(lèi),此組
Java
類(lèi)允許創(chuàng)建圖形用戶(hù)界面
(GUI)
,
AWT
提供用于創(chuàng)建生動(dòng)而高效的
GUI
的各種組件。
AWT
是
Swing
的基礎(chǔ),但是
AWT
仔圖形組件的繪制方面并不是完全的“平臺(tái)獨(dú)立”;
Swing
是一個(gè)帶有豐富組件的
GUI
工具包,它組成了
JFC
的用戶(hù)界面功能的核心部分。
AWT
的基本思想使:以面向?qū)ο蟮姆椒▽?shí)現(xiàn)了一個(gè)跨平臺(tái)的
GUI
工具集,提供了各種用于
GUI
設(shè)計(jì)的標(biāo)準(zhǔn)組件。大致上可以將這些類(lèi)歸納為:圖形界面組件、事件處理對(duì)象、圖形和圖像工具和布局管理器。
容器類(lèi)(
Container
)
是
Component
類(lèi)的子類(lèi),容器組件是一種特殊的組件,它的功能是包含其他基本的
GUI
組件。
即容器是可以存放組件的區(qū)域,可在容器上進(jìn)行繪制和著色
。
java.awt
包中的
Container
類(lèi)可直接或間接派生出兩個(gè)常用容器:框架(
Frame
類(lèi))和面板(
Panel
類(lèi))。框架是一個(gè)帶有邊框的獨(dú)立的窗口。面板是包含在窗口中的一個(gè)不帶邊框的區(qū)域。
Panel
沒(méi)有具體的圖形表示,但它卻是實(shí)現(xiàn)
GUI
結(jié)構(gòu)化的一個(gè)至關(guān)重要的組件,通常用它來(lái)實(shí)現(xiàn)
GUI
基本組件的組合。
框架
Frame
:
創(chuàng)建的窗口式獨(dú)立于
Applet
和瀏覽器的可獨(dú)立運(yùn)行的主窗口,通常用于開(kāi)發(fā)桌面應(yīng)用程序。它定義了一個(gè)包含標(biāo)題條、系統(tǒng)菜單欄最大化
/
最小化按鈕及可選菜單條的完整窗口。當(dāng)一個(gè)Frame窗口被創(chuàng)建以后,需要調(diào)用setSize()方法來(lái)設(shè)置窗口的大小,并調(diào)用setVisible()來(lái)顯示窗口。Frame默認(rèn)的布局管理器是BorderLayout,默認(rèn)的添加組件位置是BorderLayout.CENTER。
面板
Panel
:
面板不是一個(gè)單獨(dú)的窗口,它只是包含在窗口中的一個(gè)區(qū)域。面板是可以將許多組件組合起來(lái)的一種容器。最簡(jiǎn)單創(chuàng)建面板的方式就是通過(guò)面板的構(gòu)造函數(shù)
Panel()
來(lái)進(jìn)行。必須將面板添加到窗體中。
Applet
的缺省布局是
FlowLayout
;
在沒(méi)有設(shè)置新的布局前,在容器中添加組件都按照該容器的缺省布局排列。
Applet
繼承自
Panel
,所以可以推斷
Panel
的默認(rèn)布局管理器是
FlowLayout
,所以向其中添加組件的順序是自左向右,自上向下。
對(duì)話(huà)框
Dialog
:
也是一種容器,其默認(rèn)的布局管理器是
BorderLayout
。有模式(
model
)和非模式(
modeless
)兩種,模式對(duì)話(huà)框只讓?xiě)?yīng)用程序響應(yīng)對(duì)話(huà)框內(nèi)的事件而其他窗體中的事件則不能響應(yīng);而非模式對(duì)話(huà)框則可以響應(yīng)其他窗體中的事件。
布局管理器:
在
AWT
中每個(gè)組件在容器中都應(yīng)該有一個(gè)具體的位置和大小,我們想在容器中排列若干個(gè)組件時(shí),會(huì)很難控制它們的大小和位置。為了簡(jiǎn)化編程者對(duì)容器上的組件的布局控制,一個(gè)容器內(nèi)的所有組件的顯示位置可以由一個(gè)
“
布局管理器
”
來(lái)管理,我們可以為容器指定不同的布局管理器,在不同的布局管理器下,同一組件將會(huì)有不同的顯示效果,并且我們不能完全按自己的意愿設(shè)置組件的大小和位置了。
??? 為了我們生成的圖形用戶(hù)界面具有良好的平臺(tái)無(wú)關(guān)性,
java
語(yǔ)言中提供了布局管理器這個(gè)工具來(lái)管理組件在容器中的布局,當(dāng)容器需要對(duì)某個(gè)組件進(jìn)行定位或判斷其大小尺寸時(shí)就會(huì)調(diào)用其布局管理器。所有布局都實(shí)現(xiàn)
LayoutManager
接口。
Java
中的布局類(lèi)型包括以下幾種:
FlowLayout
(流式布局);
BorderLayout
(邊界布局)
;
GridLayout
(網(wǎng)格布局);
GridBagLayout
(網(wǎng)格包布局);
CardLayout
(卡片布局)。
布局類(lèi)型的選用:
每個(gè)布局管理器都有自己特定的用途。要按行和列顯示幾個(gè)同樣大小的組件,
GridLayout
會(huì)比較合適;要在盡可能大的空間里顯示一個(gè)組件,就要選擇
BorderLayout
或
GridBagLayout
如何設(shè)置布局:
每個(gè)容器(
Container
對(duì)象)都有一個(gè)與它相關(guān)的缺省的布局管理器。
Applet
的缺省布局是
FlowLayout
;
在沒(méi)有設(shè)置新的布局前,在容器中添加組件都按照該容器的缺省布局排列。
可以通過(guò)
setLayout( )
方法為容器設(shè)置新的布局。
注意:
定義窗體的大小,如果是在構(gòu)造函數(shù)中使用:
super.setBounds(0,0,400,300);
來(lái)實(shí)現(xiàn),則在主函數(shù)中,只需要使用
f.show()
,或者
f.setVisible(true);
即可,但是如果是使用
getPreferredSize()
方法來(lái)設(shè)置窗體的大小,則還需要使用
f.pack();
語(yǔ)句。關(guān)閉窗體的方法有多種:
1
)添加事件監(jiān)聽(tīng)器:
f.addWindowListener(new WindowAdapter()??? //
對(duì)窗口事件進(jìn)行監(jiān)聽(tīng)
(
關(guān)閉窗體事件
)
{???? public void windowClosing(WindowEvent e)
?????? {???? System.exit(0);? //
正常退出
Java
虛擬機(jī)
?
??? }
});
2
)構(gòu)造函數(shù)中添加
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
語(yǔ)句
重寫(xiě)如下的方法:
protected void processWindowEvent(WindowEvent e)?? //
對(duì)應(yīng)前面的語(yǔ)句實(shí)現(xiàn)窗體的關(guān)閉功能
{???? super.processWindowEvent(e);
?????? if(e.getID()==WindowEvent.WINDOW_CLOSING)
?????? {???? System.exit(0);? //
正常退出
Java
虛擬機(jī)
?
??? }
}
3)JFrame
中的關(guān)閉窗體監(jiān)聽(tīng)事件
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //
關(guān)閉窗口操作(正常退出
JVM
)
JFramenoren
的
setDefaultCloseOperation()
方法只是將窗體隱藏,所以要將其改為
JFrame.EXIT_ON_CLOSE
才可以正常退出虛擬機(jī),關(guān)閉窗體。
?