java圖形化界面設(shè)計(jì)——容器(jframe)
程序是為了方便用戶使用的,因此實(shí)現(xiàn)圖形化界面的程序編寫是所有編程語(yǔ)言發(fā)展的必然趨勢(shì),在命令提示符下運(yùn)行的程序可以讓我們了解java程序的基本知識(shí)體系結(jié)構(gòu),現(xiàn)在就進(jìn)入java圖形化界面編程。
一、java基本類(jfc)
java基本類(“javafoundationclasses”,jfc),由一些軟件包組成。這些軟件包主要包括下面一些應(yīng)用程序接口(api):
·抽象窗口工具集(awt)(1.1及以上版本)。
·swing構(gòu)件。
·java2d應(yīng)用程序接口(2dapi)。
·兼容程序接口。
上面列出的這些應(yīng)用程序接口可難會(huì)出現(xiàn)在多個(gè)軟件包中。例如:2dapi在java.awt和java.awt.image軟件包中都存在,雖然像java.awt.geom等一些特殊的軟件包也支持2dapi,但是大量的2dapi類都存在于java.awt軟件包中。
awt(1.1及以上版本)是jfc的核心。awt為jfc的構(gòu)成提供了以下基本結(jié)構(gòu):
·代理事件模型。
·輕量構(gòu)件。
·剪貼板和數(shù)據(jù)傳輸。
·打印和無(wú)鼠標(biāo)操作。
1、awtabstractwindowtoolkit(awt)抽象窗口工具包
awt是比較舊的雙介面函式庫(kù),它依然高度倚賴各作業(yè)平臺(tái)自身所具備的繪圖功效機(jī)能,且用一個(gè)比包容程式(wrapper)還小的設(shè)計(jì)還去除、吸收各作業(yè)平臺(tái)間的繪圖功能機(jī)能差異,以致java程式在跨平臺(tái)移攜后的繪圖呈現(xiàn)不夠一致,這使得awt遭受到眾多的批評(píng)。這意味著:awt的widget倚賴作業(yè)平臺(tái)自身原有的widget功效機(jī)能,程式設(shè)計(jì)師在開發(fā)撰寫時(shí)必須去了解各作業(yè)平臺(tái)在widget方面的差異性,如此便偏離了java程式語(yǔ)言最初的宗旨:跨平臺(tái)一致性。
awt由java.awt包提供,其提供了支持gui設(shè)計(jì)的類和接口,而又awt提供的組建一般稱之為重量級(jí)組件,其是由本地方法來(lái)實(shí)現(xiàn)其功能的。awt的特點(diǎn):
lawt中的圖形函數(shù)與操作系統(tǒng)所提供的圖形函數(shù)之間有著一一對(duì)應(yīng)的關(guān)系
lawt通過(guò)犧牲功能來(lái)實(shí)現(xiàn)其平臺(tái)無(wú)關(guān)性
lawt不能滿足圖形化用戶界面發(fā)展的需要
2、swing包
為了解決awt組件的缺陷,特別是跨平臺(tái)的問(wèn)題,在jdk1.2版本后提供了新的swing包,有javax.swing提供,swing是在awt的基礎(chǔ)上構(gòu)建的一套新的圖形界面組件,所有組建均是由java書寫,具有良好的跨平臺(tái)性,由于swing沒(méi)有使用本地方法實(shí)現(xiàn)圖形功能,因此提出把swing組件稱之為輕量級(jí)組件。
注意:swing組建是在awt基礎(chǔ)上建立的,而不是替代awt的,awt是根基,swing是發(fā)展。
swing組件幾乎都是輕量組件,那些頂層容器:窗體,小應(yīng)用程序、窗口和對(duì)話框除外。因?yàn)檩p量組件是在其容器的窗口中繪制的,而不是在自己的窗口中繪制的,所以輕量組件最終必須包含在一個(gè)重量容器中。因此,swing的窗體、小應(yīng)用程序、窗口和對(duì)話框都必須是重量組件,以便提供一個(gè)可以在其繪制swing輕量組件的窗口。
swing包括250多個(gè)類,其中有些是ui組件,有些是支持類。為了把ui組件和支持類區(qū)分開,swing組件的名字以j開頭。表1-1列出了swing提供的j組件。用斜體字表示的組件是awt組件的替代組件。
表1-1swingui組件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
組件類 描述
─────────────────────────────────
japplet java.applet.applet類的擴(kuò)展,它含有jrootpane的一個(gè)實(shí)例
jbutton 能顯示文本和圖形的按鈕,它是awt按鈕組件的替代組件
jcheckbox 能顯示文本和圖形的復(fù)選框,它是awt選擇組件的替代組件
jcheckboxmenuitem 一個(gè)復(fù)選框菜單項(xiàng),它是awt的復(fù)選框菜單項(xiàng)組件的替代組件
jcombobox 帶下拉列表的文本框,它是awt選擇組件的替代組件
jcomponent 所有輕量j組件的基類
jdesktoppane 內(nèi)部窗體的容器
jdialog swing對(duì)話框的基類,它擴(kuò)展了awt dialot類
jeditorpane 用于編輯文本的文本窗格
jframe 擴(kuò)展java.awt.frame的外部窗體
jinternalframe 在jdesktoppane中出現(xiàn)的內(nèi)部窗體
jlabel 可顯示文本和圖標(biāo)的標(biāo)簽,它是awt標(biāo)簽組件的替代組件
jlayeredpane 能夠在不同層上顯示組件的容器
jlist 顯示選項(xiàng)列表的組件,它是awt列表組件的替代組件
jmenu 菜單條中顯示的一個(gè)菜單,它是awt菜單組件的替代組件
jmenubar 用于顯示菜單的菜單條,它是awt菜單條組件的替代組件
jmenuitem 菜單項(xiàng),它是awt菜單項(xiàng)組件的替代組件
joptionpane 顯示標(biāo)準(zhǔn)的對(duì)話框,如:消息和問(wèn)題對(duì)話框
jpanel 通用容器,它是awt面板和畫布組件的替代組件
jpasswordfield jtextfield的擴(kuò)展,使輸入的字符不可見(jiàn)
jpopupmenu 彈出式菜單,它是awt彈出式菜單組件的替代組件
jprogressbar 進(jìn)度指示器
jradiobutton 單選按鈕,它是awt復(fù)選框組件的替代組件
jrootpane 頂層容器,它包含一個(gè)玻璃窗格,一個(gè)層窗格,一個(gè)內(nèi)容窗格和一個(gè)可選的菜單條
jscrollbar 滾動(dòng)條,它是awt滾動(dòng)條組件的替代組件
jscrollpane 滾動(dòng)窗格,它是awt滾動(dòng)窗格組件的替代組件
jseparator 水平或垂直分隔條
jslider 滑桿
jsplitpane 有兩個(gè)分隔區(qū)的容器,這兩個(gè)分隔區(qū)可以水平排列或者垂直排列且分隔區(qū)的大小能自動(dòng)調(diào)整
jtabbedpane 帶選項(xiàng)卡的窗格
jtable 表格
jtableheader 表格頭
jtextarea 用于輸入多行文本的文本域,它是awt文本域組件的替代組件
jtestcomponent 文本組件的基類,它替代awt的textcomponent類
jtextfield 單行文本域,它替代awt的單行文本域組件
jtextpane 簡(jiǎn)單的文本編輯器
jtogglebutton 兩種狀態(tài)的按鈕,它是jcheckbox和jradiobutton組件的基類
jtoolbar 工具條
jtooltip 當(dāng)光標(biāo)停留在一個(gè)組件上時(shí),該組件上顯示的一行文字
jtree 用于按鈕層次組織數(shù)據(jù)的結(jié)構(gòu)控件
jviesport 用于瀏覽可滾動(dòng)組件的視口
jwindow 外部窗口,它是java.awt.window的擴(kuò)展
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
注:斜體字表示的是awt的替代組件
二、awt和swing的區(qū)別
awt是abstractwindowtoolkit(抽象窗口工具包)的縮寫,這個(gè)工具包提供了一套與本地圖形界面進(jìn)行交互的接口。awt中的圖形函數(shù)與操作系統(tǒng)所提供的圖形函數(shù)之間有著一一對(duì)應(yīng)的關(guān)系,我們把它稱為peers。也就是說(shuō),當(dāng)我們利用awt來(lái)構(gòu)件圖形用戶界面的時(shí)候,我們實(shí)際上是在利用操作系統(tǒng)所提供的圖形庫(kù)。由于不同操作系統(tǒng)的圖形庫(kù)所提供的功能是不一樣的,在一個(gè)平臺(tái)上存在的功能在另外一個(gè)平臺(tái)上則可能不存在。為了實(shí)現(xiàn)java語(yǔ)言所宣稱的"一次編譯,到處運(yùn)行"的概念,awt不得不通過(guò)犧牲功能來(lái)實(shí)現(xiàn)其平臺(tái)無(wú)關(guān)性,也就是說(shuō),awt所提供的圖形功能是各種通用型操作系統(tǒng)所提供的圖形功能的交集。由于awt是依靠本地方法來(lái)實(shí)現(xiàn)其功能的,我們通常把a(bǔ)wt控件稱為重量級(jí)控件。
swing是在awt的基礎(chǔ)上構(gòu)建的一套新的圖形界面系統(tǒng),它提供了awt所能夠提供的所有功能,并且用純粹的java代碼對(duì)awt的功能進(jìn)行了大幅度的擴(kuò)充。例如說(shuō)并不是所有的操作系統(tǒng)都提供了對(duì)樹形控件的支持,swing利用了awt中所提供的基本作圖方法對(duì)樹形控件進(jìn)行模擬。由于swing控件是用100%的java代碼來(lái)實(shí)現(xiàn)的,因此在一個(gè)平臺(tái)上設(shè)計(jì)的樹形控件可以在其他平臺(tái)上使用。由于在swing中沒(méi)有使用本地方法來(lái)實(shí)現(xiàn)圖形功能,我們通常把swing控件稱為輕量級(jí)控件。
awt和swing之間的基本區(qū)別:awt是基于本地方法的c/c++程序,其運(yùn)行速度比較快;swing是基于awt的java程序,其運(yùn)行速度比較慢。對(duì)于一個(gè)嵌入式應(yīng)用來(lái)說(shuō),目標(biāo)平臺(tái)的硬件資源往往非常有限,而應(yīng)用程序的運(yùn)行速度又是項(xiàng)目中至關(guān)重要的因素。在這種矛盾的情況下,簡(jiǎn)單而高效的awt當(dāng)然成了嵌入式j(luò)ava的第一選擇。而在普通的基于pc或者是工作站的標(biāo)準(zhǔn)java應(yīng)用中,硬件資源對(duì)應(yīng)用程序所造成的限制往往不是項(xiàng)目中的關(guān)鍵因素,所以在標(biāo)準(zhǔn)版的java中則提倡使用swing,也就是通過(guò)犧牲速度來(lái)實(shí)現(xiàn)應(yīng)用程序的功能。
簡(jiǎn)要的講:
awt是抽象窗口組件工具包,是java最早的用于編寫圖形節(jié)目應(yīng)用程序的開發(fā)包。
swing是為了解決awt存在的問(wèn)題而新開發(fā)的包,它以awt為基礎(chǔ)的。
三、swing基本框架
上圖列舉了awt和swing的關(guān)系,也可以看出swing是繼承自awt的。本文主要利用swing來(lái)設(shè)計(jì)圖形化界面程序。
四、圖形化設(shè)計(jì)步驟
圖形化界面程序大家都使用過(guò),一般使用一個(gè)程序過(guò)程是:打開一個(gè)程序出現(xiàn)一個(gè)窗口或?qū)υ捒颍渲幸话阌胁藛巍⒐ぞ邫凇⑽谋究颉粹o、單選框、復(fù)選框等控件(組件也就是控件),用戶錄入相關(guān)數(shù)據(jù),點(diǎn)按相關(guān)菜單、按鈕,程序?qū)?shù)據(jù)進(jìn)行相關(guān)處理,并將處理后的數(shù)據(jù)顯示或者保存起來(lái),最后關(guān)閉程序。
用java編程的相關(guān)設(shè)計(jì)步驟來(lái)分解上面的的程序運(yùn)行過(guò)程如下圖所示:
1、創(chuàng)建頂層容器
對(duì)應(yīng)于程序的初始顯現(xiàn)窗口,窗口中放入其它菜單、工具欄、文本框、按鈕等組件
頂層容器圖形化界面顯示的基礎(chǔ),其它所有的組件(控件)都是直接或間接顯示在頂層容器中的。在java中頂層容器有三種,分別是jframe(框架窗口,即通常的窗口)、jdialog(對(duì)話框)、japplet(用于設(shè)計(jì)嵌入在網(wǎng)頁(yè)中的java小程序)。
2、創(chuàng)建中間容器、組件
對(duì)應(yīng)于程序中出現(xiàn)的菜單、工具欄(中間容器)、文本框、按鈕、單選框、復(fù)選框等控件。
有很多swing組件可以使用,見(jiàn)前面的swingui組件表。
3、將組件加入容器
在java中創(chuàng)建組件后,還需要將組件放入相應(yīng)的容器,才能在頂層容器,如窗口中顯示出組件。
4、設(shè)置容器內(nèi)組件的位置
組件添加到容器中,還必須設(shè)置好組件的顯示位置,一般有兩種方法來(lái)設(shè)置組建的顯示位置,一是按照與容器的相對(duì)距離(以像素為單位),精確固定控件的位置;二是用布局管理器來(lái)管理組件在容器內(nèi)的位置。
5、處理組件所產(chǎn)生的事件
即用戶執(zhí)行選擇菜單、單擊按鈕等操作時(shí),就要執(zhí)行相應(yīng)的命令,進(jìn)行相關(guān)的程序處理,這就需要設(shè)置組件的事件。
五、組件容器的使用
java中組件容器包含頂層容器和中間容器。
在java中頂層容器有三種,分別是jframe(框架窗口,即通常的窗口)、jdialog(對(duì)話框)、japplet(用于設(shè)計(jì)嵌入在網(wǎng)頁(yè)中的java小程序),頂層容器是容納其它組件的基礎(chǔ),即設(shè)計(jì)圖形化程序必須要有頂層容器。
java中間容器是可以包含其它相應(yīng)組件的容器,但是中間容器和組件一樣,不能單獨(dú)存在,必須依附于頂層容器。
常見(jiàn)的中間容器有:
•jpanel:最靈活、最常用的中間容器。
•jscrollpane:與jpanel類似,但還可在大的組件或可擴(kuò)展組件周圍提供滾動(dòng)條。
•jtabbedpane:包含多個(gè)組件,但一次只顯示一個(gè)組件。用戶可在組件之間方便地切換。
•jtoolbar:按行或列排列一組組件(通常是按鈕)。
1、jframe框架窗口的使用
以上是jframe的常用方法即說(shuō)明,下面舉例說(shuō)明。
實(shí)例1:直接定義jframe類的對(duì)象創(chuàng)建一個(gè)窗口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// jframedemo1.java import javax.swing.*; //使用swing類,必須引入swing包 public class jframedemo1{ public staticvoid main( string args[]) { //定義一個(gè)窗體對(duì)象f,窗體名稱為"一個(gè)簡(jiǎn)單窗口" jframe f = new jframe( "一個(gè)簡(jiǎn)單窗口" ); /*設(shè)置窗體左上角與顯示屏左上角的坐標(biāo), 離顯示屏上邊緣300像素,離顯示屏左邊緣300像素 */ f.setlocation( 300 , 300 ); //f.setlocationrelativeto(null);本語(yǔ)句實(shí)現(xiàn)窗口居屏幕中央 f.setsize( 300 , 200 ); //設(shè)置窗體的大小為300*200像素大小 f.setresizable( false ); //設(shè)置窗體是否可以調(diào)整大小,參數(shù)為布爾值 //設(shè)置窗體可見(jiàn),沒(méi)有該語(yǔ)句,窗體將不可見(jiàn),此語(yǔ)句必須有,否則沒(méi)有界面就沒(méi)有如何意義了 f.setvisible( true ); //用戶單擊窗口的關(guān)閉按鈕時(shí)程序執(zhí)行的操作 f.setdefaultcloseoperation(f.exit_on_close); } } |
程序運(yùn)行結(jié)果如下圖所示:
可以根據(jù)程序代碼的注釋,依次修改相應(yīng)的方法參數(shù)查看效果。
setdefaultcloseoperation(intoperation):設(shè)置用戶在此窗體上發(fā)起"close"時(shí)默認(rèn)執(zhí)行的操作。方法中的參數(shù)解釋如下:
l為“0”或do_nothing_on_close:
(在windowconstants中定義):不執(zhí)行任何操作;要求程序在已注冊(cè)的windowlistener對(duì)象的windowclosing方法中處理該操作。
比如實(shí)例程序代碼中更改為f.setdefaultcloseoperation(f.do_nothing_on_close);或者f.setdefaultcloseoperation(0),然后查看效果,可以發(fā)現(xiàn)窗口無(wú)法關(guān)閉,下面是相同用法,不再解釋了。
l為“1”或hide_on_close
調(diào)用任意已注冊(cè)的windowlistener對(duì)象后自動(dòng)隱藏該窗體。此時(shí)沒(méi)有關(guān)閉程序,只是將程序界面隱藏了。
可以打開任務(wù)管理器,可以看到一個(gè)叫“java.exe”的進(jìn)程(如果調(diào)試運(yùn)行了多個(gè)java程序,則會(huì)看到多個(gè)“java.exe”的進(jìn)程),如果此時(shí)用editplus測(cè)試程序,會(huì)發(fā)現(xiàn)當(dāng)單擊窗口的關(guān)閉按鈕關(guān)閉窗口后,卻無(wú)法再次對(duì)程序進(jìn)行調(diào)試,因?yàn)槌绦蚓€程沒(méi)有關(guān)閉,在任務(wù)管理器中關(guān)閉java.exe(如果有多個(gè)“java.exe”的進(jìn)程,則先都關(guān)閉掉,再來(lái)測(cè)試該問(wèn)題)基礎(chǔ)后,editplus才可以重新編譯改程序。
l為“2”或dispose_on_close
調(diào)用任意已注冊(cè)windowlistener的對(duì)象后自動(dòng)隱藏并釋放該窗體。但繼續(xù)運(yùn)行應(yīng)用程序,釋放了窗體中占用的資源。
l為“3”exit_on_close(在jframe中定義):使用systemexit方法退出應(yīng)用程序。僅在應(yīng)用程序中使用。結(jié)束了應(yīng)用程序。
默認(rèn)情況下,該值被設(shè)置為hide_on_close。
當(dāng)注釋掉實(shí)例中的f.setdefaultcloseoperation(f.exit_on_close);語(yǔ)句時(shí),起到的效果和f.setdefaultcloseoperation(f.hide_on_close);或者f.setdefaultcloseoperation(1);一樣。
實(shí)例2:創(chuàng)建類繼承jframe類創(chuàng)建一個(gè)窗口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// jframedemo2.java importjavax.swing.*; //創(chuàng)建子類myframe繼承父類jframe class myframeextends jframe{ //定義構(gòu)造函數(shù),帶有四個(gè)參數(shù),用于設(shè)置窗口位置和大小 myframe( int x, int y, int h, int w){ super ( "一個(gè)簡(jiǎn)單窗口" ); //重寫父類方法,為窗口定義標(biāo)題 /*以下的方法調(diào)用前面沒(méi)有添加對(duì)象名,也不可能添加,要?jiǎng)?chuàng)建的對(duì)象名稱是什么都不知道,也就不可能添加。但是創(chuàng)建對(duì)象后,對(duì)象自動(dòng)獲取這些初始值。*/ setlocation(x,y); setsize(h,w); setresizable( false ); setvisible( true ); setdefaultcloseoperation(exit_on_close); } } publicclass jframedemo2{ public static void main( string args[]) { //實(shí)例化類對(duì)象,提示設(shè)置參數(shù) myframe f = new myframe( 300 , 300 , 300 , 200 ); } } |
上面的例子也可以不使用構(gòu)造函數(shù),可以和實(shí)例一方式一樣,代碼可以改為如下模式。
實(shí)例3:一個(gè)簡(jiǎn)單窗口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// jframedemo3.java importjavax.swing.*; class myframeextends jframe{ myframe(){ } } publicclass jframedemo3{ public static void main( string args[]) { myframe f = new myframe(); f.settitle( "一個(gè)簡(jiǎn)單窗口" ); f.setlocationrelativeto( null ); f.setsize( 300 , 200 ); f.setresizable( false ); f.setvisible( true ); f.setdefaultcloseoperation( 3 ); } } |
總結(jié)
以上就是本文關(guān)于java圖形化界面設(shè)計(jì)之容器(jframe)詳解的全部?jī)?nèi)容。許多人說(shuō)java圖形化設(shè)計(jì)不重要,用的人也不多,事實(shí)上也確實(shí)如此。不過(guò),既然它如此簡(jiǎn)單,而且看起來(lái)挺有趣的,抽時(shí)間學(xué)一下也無(wú)妨。
原文鏈接:http://blog.csdn.net/liujun13579/article/details/7756729