版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章布局管理和容器本章要點(diǎn)·AWT與Swing·Java常用容器·Java常用布局
AWT與Swing⑴AWT抽象窗口工具包(AbstractWindowtoolkit,AWT)提供了一套與本地圖形界面進(jìn)行交互的接口。AWT中的圖形函數(shù)與操作系統(tǒng)所提供的圖形函數(shù)之間有著一一對應(yīng)的關(guān)系,稱之為peers。當(dāng)利用AWT來構(gòu)建圖形用戶界面時(shí),實(shí)際上是在利用操作系統(tǒng)所提供的圖形庫,但是不同操作系統(tǒng)的圖形庫所提供的功能不一樣,在一個平臺上存在的功能在另外一個平臺上則可能不存在,所以為了實(shí)現(xiàn)Java語言所宣稱的“一次編譯,到處運(yùn)行”,AWT不得不通過犧牲功能來實(shí)現(xiàn)其平臺無關(guān)性,也就是說,AWT所提供的圖形功能是各種通用型操作系統(tǒng)所提供的圖形功能的交集。由于AWT是依靠本地方法來實(shí)現(xiàn)其功能的,通常把AWT組件稱為重量級組件。AWT是Java最早用于編寫圖形界面應(yīng)用程序的開發(fā)包。AWT與Swing(續(xù))⑵SwingSwing是在AWT的基礎(chǔ)上構(gòu)建的一套新的圖形界面系統(tǒng),它提供了AWT所能夠提供的所有功能,并且用純粹的Java代碼對AWT的功能進(jìn)行了大幅度的擴(kuò)充。由于在Swing中沒有使用本地方法來實(shí)現(xiàn)圖形功能,通常把Swing組件稱為輕量級組件。
⑶兩者比較AWT是基于本地方法的C/C++程序,其運(yùn)行速度比較快;Swing是基于AWT的Java程序,其運(yùn)行速度比較慢。對于一個嵌入式應(yīng)用來說,目標(biāo)平臺的硬件資源往往非常有限,而應(yīng)用程序的運(yùn)行速度又是項(xiàng)目中至關(guān)重要的因素。在這種矛盾的情況下,簡單而高效的AWT當(dāng)然成了嵌入式Java的第一選擇;而在普通的基于PC或者是工作站的標(biāo)準(zhǔn)Java應(yīng)用中,硬件資源對應(yīng)用程序所造成的限制往往不是項(xiàng)目中的關(guān)鍵因素,所以在標(biāo)準(zhǔn)版的Java中則提倡使用Swing,也就是通過犧牲速度來實(shí)現(xiàn)應(yīng)用程序的功能。常用容器Container類是所有容器類的父類,可以將組件添加到容器中。Container也是Component的子類,
因此也可以作為組件添加到其他容器上。Object的主要子類如圖7.1所示。容器從功能上可分為頂層容器、中間容器和特殊容器三種。圖7.1Object主要子類圖頂層容器開發(fā)人員在使用Java進(jìn)行圖形編程時(shí),其組件需要放置在能夠提供圖形繪制的容器中,這樣的容器就是頂層容器,也可以認(rèn)為是一個窗口。在Swing中,有JFrame、JDialog和JApplet三種常用的頂層容器。
JFrame①JFrameJFrame用來設(shè)計(jì)類似于Windows系統(tǒng)中的窗口形式的應(yīng)用程序。JFrame的常用方法:JFrame()創(chuàng)建一個無標(biāo)題的窗口,窗口的默認(rèn)布局為BorderLayout布局JFrame(Strings)創(chuàng)建一個標(biāo)題為s的窗口,窗口的默認(rèn)布局為BorderLayout布局setBounds(inta,intb,intwidth,intheight)移動組件并調(diào)整其大小。由a和b指定左上角的新位置,由width和height指定新的大小setSize(intwidth,intheight)設(shè)置窗口的大小,窗口在屏幕出現(xiàn)的默認(rèn)位置是(0,0)setVisible(Booleanb)設(shè)置窗口是可見還是不可見,窗口默認(rèn)是不可見的JFrame(續(xù))setResizable(Booleanb)設(shè)置窗口是否可調(diào)整大小,窗口默認(rèn)是可調(diào)整大小的setExtendedState(intstate)設(shè)置窗口的擴(kuò)展?fàn)顟B(tài),其中參數(shù)state取Frame類中的下列類常量:MAXIMIZED_HORIZ、MAXIMIZED_VERT、MAXIMIZED_BOTHsetDefaultCloseOperation(int
operation)設(shè)置用戶在此窗體上發(fā)起“close”時(shí)默認(rèn)執(zhí)行的操作dispose()窗口調(diào)用該方法可以撤銷當(dāng)前窗口,并釋放當(dāng)前窗口所使用的資源add(Component
comp)將指定組件追加到此容器的尾部pack()調(diào)整此窗口的大小,以適合其子組件的首選大小和布局。如果該窗口和/或其所有者仍不可顯示,則兩者在計(jì)算首選大小之前變得可顯示。JFrame(續(xù))其中方法publicvoidsetDefaultCloseOperation(intoperation)的功能是設(shè)置用戶在此窗體上發(fā)起“close”時(shí)默認(rèn)執(zhí)行的操作。必須指定以下選項(xiàng)之一:DO_NOTHING_ON_CLOSE(在WindowConstants中定義):不執(zhí)行任何操作;要求程序在已注冊的WindowListener對象的WindowClosing方法中處理該操作。HIDE_ON_CLOSE(在WindowConstants中定義):調(diào)用任意已注冊的WindowListener對象后自動隱藏該窗體。DISPOSE_ON_CLOSE(在WindowConstants中定義):調(diào)用任意已注冊WindowListener的對象后自動隱藏并釋放該窗體。EXIT_ON_CLOSE(在JFrame中定義):使用Systemexit方法退出應(yīng)用程序。僅在應(yīng)用程序中使用。默認(rèn)情況下,該值被設(shè)置為HIDE_ON_CLOSE。JFrame(續(xù))例如,在JFrame窗口上放置一個按鈕。程序主要代碼如下:
JFramejf=newJFrame("JFrame");//采用構(gòu)造方法JFrame(Strings)JButtonjb=newJButton("JButton");//創(chuàng)建一個按鈕
jf.setLayout(newFlowLayout());//布局方式,詳見7.3.3jf.add(jb);//將按鈕放置在窗口中
jf.setBounds(50,50,150,80);//設(shè)置窗口大小
jf.setVisible(true);//設(shè)置窗口可見JDialogJDialog與JFrame用法相同,只不過它是設(shè)計(jì)對話框。一般而言對話框都會依附在容器或?qū)υ捒蛏?,在使用上,JDialog與JFrame非常相似,由圖7.1可以看出來,JDialog是繼承AWT的Dialog類而來,因此JDialog為一個重量級組件。要將組件加入到JDialog上其方法與JFrame一樣。JDialog(續(xù))
JDialog常用方法:JDialog(Framef,Strings)創(chuàng)建一個具有標(biāo)題的初始不可見的對話框,參數(shù)s是標(biāo)題的名字,f是對話框所依賴的窗口JDialog(Framef,Strings,booleanb)創(chuàng)建一個具有標(biāo)題s的初始不可見的對話框。參數(shù)b決定對話框是否為有模式或無模式,,參數(shù)f是對話框所依賴的窗口getTitle()獲取對話框的標(biāo)題setTitle()設(shè)置對話框的標(biāo)題setModal(booleanb)設(shè)置對話框的模式setSize()設(shè)置對話框的大小setVisible(booleanb)顯示或隱藏對話框JDialog(續(xù))例如,依賴上面所畫JFrame窗體,對話框中放置一個按鈕。程序主要代碼如下:JDialogd=newJDialog(jf,"JDialog");//依賴窗體的對話框
JButtonjb=newJButton("JButton");//創(chuàng)建一個按鈕d.setLayout(newFlowLayout()); d.add(jb);//按鈕加入對話框中
d.setSize(120,80); d.setVisible(true);
JAppletJApplet用來設(shè)計(jì)可以在嵌入在網(wǎng)頁中的Java小程序,具體內(nèi)容在8.3.4中介紹。中間容器在Swing中,常用的中間容器有JPanel、JScrollPane、JToolBar和JSplitPane等面板(JPanel)JPanel是在實(shí)際項(xiàng)目開發(fā)中使用頻率最高的面板之一。JPanel是一個輕量容器組件,用于容納界面元素。JPanel常用方法:JPanel()創(chuàng)建具有雙緩沖和流布局的新JPanelJPanel(LayoutManager
layout)創(chuàng)建具有指定布局管理器的新緩沖JPanelsetLayout(LayoutManager
mgr)設(shè)置此容器的布局管理器。mgr為布局管理器setBounds(int
a,int
b,int
width,int
height)移動組件并調(diào)整其大小。由x和y指定左上角的新位置,由width和height指定新的大小setVisible(boolean
b)根據(jù)參數(shù)b的值顯示或隱藏此組件add(Component
comp)將指定組件comp追加到此容器的尾部滾動窗口(JScrollPane)JScrollPane是帶滾動條的面板,可以用來顯示文本、表格等內(nèi)容。當(dāng)內(nèi)容超過了JScrollPane面板的大小時(shí),系統(tǒng)會自動添加滾動條。JScrollPane常用方法:
JScrollPane()
創(chuàng)建一個空的(無視口的視圖)JScrollPane,需要時(shí)水平和垂直滾動條都可顯示JScrollPane(int
vsbPolicy,int
hsbPolicy)創(chuàng)建一個具有指定滾動條策略的空(無視口的視圖)JScrollPanecreateHorizontalScrollBar()
默認(rèn)返回水平的JScrollPane.ScrollBarcreateVerticalScrollBar()
默認(rèn)返回垂直的JScrollPane.ScrollBarsetHorizontalScrollBarPolicy(int
hsbpolicy)確定水平滾動條何時(shí)顯示在滾動窗格上setVerticalScrollBarPolicy(int
vsbpolicy)確定垂直滾動條何時(shí)顯示在滾動窗格上setLayout(LayoutManager
mgr)設(shè)置此容器的布局管理器。mgr為布局管理器滾動窗口(JScrollPane)setBounds(int
a,int
b,int
width,int
height)移動組件并調(diào)整其大小。由a和b指定左上角的新位置,由width和height指定新的大小setVisible(boolean
b)根據(jù)參數(shù)b的值(true或false)顯示或隱藏JScrollPaneadd(Component
comp)將指定組件comp追加到JScrollPane.的尾部其中:參數(shù)vsbpolicy和hsbpolicy分別指定垂直滾動條策略和水平滾動條策略的一個整數(shù),其中vsbpolicy選項(xiàng)有:ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDEDScrollPaneConstants.VERTICAL_SCROLLBAR_NEVERScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYShsbpolicy選項(xiàng)有:ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDEDScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVERScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS工具欄(JToolBar)JToolBar是用于放置各種常用的工具或控件組件。將一般常用的功能以工具欄方式呈現(xiàn)在菜單下,可以提高用戶的使用效率。
JToolBar常用方法:JToolBar()創(chuàng)建新的工具欄JToolBar(int
orientation)創(chuàng)建具有指定orientation的新工具欄JToolBar(String
name)創(chuàng)建名稱為name的工具欄,名稱用作浮動式(undocked)工具欄的標(biāo)題。JToolBar(String
name,int
orientation)創(chuàng)建名稱為name、方向?yàn)閛rientation的工具欄getComponentIndex(Componentc)返回指定組件的索引(從0開始),用于指示組件c的位置getComponentAtIndex(inti)得到一個指定索引號的組件其中,參數(shù)orientation指工具欄的方向,其選項(xiàng)有HORIZONTAL和VERTICAL兩種,默認(rèn)的方向?yàn)镠ORIZONTAL。工具欄(JToolBar)例如,在滾動窗口中放置一個文本區(qū)組件,將其置于面板的正中間,面板上方放置一具有三個按鈕的工具欄。程序主要代碼如下://創(chuàng)建三個普通按鈕組件
JButtonbutton1=newJButton("圖標(biāo)一");JButtonbutton2=newJButton("圖標(biāo)二");JButtonbutton3=newJButton("圖標(biāo)三");//創(chuàng)建一個工具條,再將上面創(chuàng)建的三個普通按鈕組件添加到工具條中
JToolBarbar=newJToolBar();bar.add(button1);bar.add(button2);bar.add(button3);JTextAreaedit=newJTextArea(8,40);//創(chuàng)建一個文本區(qū)組件
JScrollPanescroller=newJScrollPane(edit);JPanelpane=newJPanel();BorderLayoutbord=newLayout();pane.setLayout(bord);//采用Border布局,參看7.3.3布局管理器
pane.add("North",bar);pane.add("Center",scroller);setContentPane(pane);分隔板(JSplitPane)JSplitPane面板用于分隔兩個(只能兩個)組件,并且這兩個組件可以由用戶交互式調(diào)整大小。JSplitPane常用方法:JSplitPane()創(chuàng)建一個配置為將其子組件水平排列、無連續(xù)布局、為組件使用兩個按鈕的新JSplitPanesetOneTouchExpandable(boolean
newValue)設(shè)置oneTouchExpandable屬性的值,要使JSplitPane在分隔條上提供一個UI小部件來快速展開/折疊分隔條(比如箭頭),此屬性必須為truesetContinuousLayout(boolean
newContinuousLayout)
設(shè)置continuousLayout屬性的值,newContinuousLayout默認(rèn)值為false,當(dāng)為true時(shí),分隔條改變位置時(shí)組件連續(xù)重繪setOrientation(int
orientation)
設(shè)置方向或者分隔窗格的方式,參數(shù)orientation的選項(xiàng)有:JSplitPane.VERTICAL_SPLIT(組件的上/下方向)和JSplitPane.HORIZONTAL_SPLIT(組件的左/右方向)兩種setDividerLocation(int
location)設(shè)置分隔條的位置,location指定特定于UI值的一個整數(shù)(通常以像素為單位)分隔板(JSplitPane)setDividerSize(int
newSize)設(shè)置分隔條的大小,newSize給定分隔條大小的一個整數(shù),以像素為單位setLeftComponent(Component
comp)將組件comp設(shè)置到分隔條的左邊(或上面)setRightComponent(Component
comp)將組件comp設(shè)置到分隔條的右邊(或下面)setPreferredSize(Dimension
preferredSize)設(shè)置此組件的首選大小。如果preferredSize為新的首選大小,若為null,則要求UI提供首選大小,Dimension類封裝單個對象中組件的寬度和高度(精確到整數(shù))例如,將JFrame窗口分成左右兩個窗格,用兩個標(biāo)簽分別指出“左窗格”和“右窗格”。程序主要代碼如下:分隔板(JSplitPane)JLabell1=newJLabel("左窗格");//創(chuàng)建兩個標(biāo)簽組件
JLabell2=newJLabel("右窗格"); JSplitPanesp=newJSplitPane();//創(chuàng)建一個分隔板
sp.setOneTouchExpandable(true);//讓分割條顯示出箭頭
sp.setContinuousLayout(true);//用戶操作分割條箭頭時(shí),系統(tǒng)重繪圖形
sp.setPreferredSize(newDimension(200,100));//設(shè)置尺寸
sp.setOrientation(JSplitPane.HORIZONTAL_SPLIT); sp.setLeftComponent(l1); sp.setRightComponent(l2); sp.setDividerSize(3);//設(shè)分割條的粗細(xì)
sp.setDividerLocation(100);//此處為100/200,在中間位置
JFramejf=newJFrame("JSplitPane"); jf.add(sp);//將分割板加入窗體中
jf.setVisible(true); jf.pack();//加載splitPane之后調(diào)用特殊容器特殊容器是在GUI上起特殊作用的中間層,常見的有JLayeredPane、JInternalFrame和JRootPane等分層面板(JLayeredPane)Swing提供兩種分層面板:JLayeredPane和JDesktopPane。JLayeredPane為JFC/Swing容器添加了深度,允許組件在需要時(shí)互相重疊;JDesktopPane是桌面窗格,用來實(shí)現(xiàn)桌面上內(nèi)部窗體(JInternalFrame)的特定界面樣式行為。向一個分層面板中添加組件時(shí),需要指明將其加入哪一層,指明組件在該層中的位置。
JLayeredPane的常用方法:setLayer(Component
c,int
layer)設(shè)置指定組件c的layer屬性,使之成為該層中最底部的組件。layer是指定的要設(shè)置的層,值越小越接近底部。getLayer(Component
c)返回指定組件c當(dāng)前層的int值setPosition(Component
c,int
position)將該組件移到當(dāng)前層中的position處,其中0表示該層中的最頂層位置,-1表示最底層位置getLayeredPane()返回此內(nèi)部窗體的layeredPane對象getLayeredPane()獲得分層面板setLayeredPane(JlayeredPanelp)設(shè)置分層面板分層面板(JLayeredPane)例如,在窗口中添加兩個按鈕,利用分層面板,將兩個按鈕進(jìn)行重疊,程序的主要代碼如下:JLayeredPanelp=this.getLayeredPane();//要用到的層,獲取JLayeredPaneJButtonJLP_a=newJButton("A");JButtonJLP_b=newJButton("B");lp.setLayer(JLP_a,200);//將組件添加到JLayeredPane中,指定所在的層lp.add(JLP_a);lp.setLayer(JLP_b,300);lp.add(JLP_b);JLP_a.setBounds(newRectangle(100,100,100,100));//Button出現(xiàn)位置JLP_b.setBounds(newRectangle(50,50,100,100));內(nèi)部框架(JInternalFrame)內(nèi)部框架JInternalFrame的使用與JFrame幾乎一樣,可以最大化、最小化、關(guān)閉窗口、加入菜單等功能,唯一不同的是JInternalFrame不能單獨(dú)出現(xiàn),通常加入到桌面窗格(JDesktopPane)中,從而方便管理。其中JDesktopPane是一種特殊的分層面板(JLayeredPane),用來創(chuàng)建虛擬桌面(VirtualDesktop),它可以顯示并管理眾多的JInternalFrame之間的層次關(guān)系。內(nèi)部框架(JInternalFrame)
JInternalFrame構(gòu)造方法:JInternalFrame()創(chuàng)建不可調(diào)整大小的、不可關(guān)閉的、不可最大化的、不可圖標(biāo)化的、沒有標(biāo)題的JInternalFrameJInternalFrame(String
title)創(chuàng)建不可調(diào)整大小的、不可關(guān)閉的、不可最大化的、不可圖標(biāo)化的、具有指定標(biāo)題的JInternalFrameJInternalFrame(String
title,boolean
resizable)創(chuàng)建不可關(guān)閉的、不可最大化的、不可圖標(biāo)化的,以及具有指定標(biāo)題和可調(diào)整大小的JInternalFrameJInternalFrame(String
title,boolean
resizable,boolean
closable)創(chuàng)建不可最大化的、不可圖標(biāo)化的,以及具有指定標(biāo)題、可調(diào)整大小和可關(guān)閉的JInternalFrameJInternalFrame(String
title,boolean
resizable,boolean
closable,boolean
maximizable)創(chuàng)建不可圖標(biāo)化的,但具有指定標(biāo)題、可調(diào)整大小、可關(guān)閉和可最大化的JInternalFrameJInternalFrame(String
title,boolean
resizable,boolean
closable,boolean
maximizable,boolean
iconifiable)創(chuàng)建具有指定標(biāo)題、可調(diào)整、可關(guān)閉、可最大化和可圖標(biāo)化的JInternalFrame內(nèi)部框架(JInternalFrame)例如,創(chuàng)建兩個JInternalFrame窗口,將這兩個窗口放到一個頂層容器中。JFramejf=newJFrame("JInternalFrame");jf.setSize(300,150);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);JPanelcontentPane=newJPanel();/*創(chuàng)建一個面板,并且將之添加到頂層容器內(nèi),將之設(shè)置為流布局*/jf.setContentPane(contentPane);contentPane.setLayout(newFlowLayout());JDesktopPanedp=newJDesktopPane();/*創(chuàng)建一個虛擬桌面容器,將dp添加到以上創(chuàng)建的中間容器中*/dp.setLayout(newFlowLayout());contentPane.add(dp);JInternalFramejif=newJInternalFrame("第一個窗口",true,true,true);內(nèi)部框架(JInternalFrame)/*創(chuàng)建兩個JIntenaFrame容器,并且創(chuàng)建六個標(biāo)簽組件,分別將它們添加到兩個JInternaFrame容器內(nèi)*/JInternalFramejif1=newJInternalFrame("第二個窗口",true,true,true);JLabell1=newJLabel("這是第一個窗口");JLabell4=newJLabel("這是第二個窗口");jif.setLayout(newFlowLayout());jif1.setLayout(newFlowLayout());jif.add(l1);jif1.add(l4);dp.add(jif);dp.add(jif1);jif.setVisible(true);jif1.setVisible(true);根面板(JRootPane)JRootPane面板是由許多部分組成的,它可以直接從頂層容器中獲得一個JRootPane對象直接使用,而不需要創(chuàng)建新對象。JRootPane面板由一個玻璃面板(GlassPane)和一個分層面板(JLayeredPane)組成。其中分層面板是由內(nèi)容面板(ContentPane)和一個可選擇的菜單條(JMenuBar)組成。玻璃面板是完全透明的,缺省為不可見,為接收鼠標(biāo)事件或在所有組件上繪圖提供方便。實(shí)際上JRootPane只是一個容器,是一個可以裝載其他容器類的容器,它可以裝載菜單、內(nèi)容面板或其他容器等。JLayeredPane為Swing容器添加了深度,允許組件在需要時(shí)互相重疊。為方便起見,JLayeredPane將該深度范圍分成幾個不同的層,將組件放入相應(yīng)的層,更容易確保組件正確地重疊。根面板(JRootPane)JRootPane常用方法:getContentPane()獲得內(nèi)容面板setContentPane(Containercon)設(shè)置內(nèi)容面板getMenuBar()活動菜單條setMenuBar(JMenuBarmenubar)設(shè)置菜單條getGlassPane()獲得玻璃面板setGlassPane(Componentc)設(shè)置玻璃面板布局管理器所謂布局管理器,就是為容器內(nèi)的組件提供若干布局策略,每個容器都擁有某種默認(rèn)的布局管理器,用于負(fù)責(zé)其內(nèi)部組件的排列。目前常用有FlowLayout、BorderLayout、GridLayout、CardLayout、GridBagLayout、BoxLayout等布局。其中前5種布局均由AWT包提供,Swing新增加了BoxLayout布局,其顯示效果與AWT略有不同。
FlowLayout布局管理器FlowLayout(流布局或順序布局管理器)是最簡單的布局。它的排版原則是將組件從左向右,從上向下排列,默認(rèn)情況下每一行的組件都是居中排列。FlowLayout是JPanel和JApplet缺省的布局方式。FlowLayout布局效果如圖所示。FlowLayout布局管理器(續(xù))
FlowLayout常用方法:FlowLayout()構(gòu)造一個新的FlowLayout,居中對齊,默認(rèn)的水平和垂直間隙是5個單位FlowLayout(int
align)構(gòu)造一個新的FlowLayout,對齊方式是指定的,默認(rèn)的水平和垂直間隙是5個單位FlowLayout(int
align,int
hgap,int
vgap)創(chuàng)建一個新的流布局管理器,具有指定的對齊方式以及指定的水平和垂直間隙getAlignment()獲得此布局的對齊方式getHgap()獲得組件之間以及組件與容器的邊之間的水平間隙getVgap()獲得組件之間以及組件與容器的邊之間的水平間隙setAlignment(int
align)設(shè)置此布局的對齊方式setHgap(int
hgap)設(shè)置組件之間以及組件與容器的邊之間的水平間隙setVgap(int
vgap)設(shè)置組件之間以及組件與容器的邊之間的水平間隙FlowLayout布局管理器(續(xù))其中參數(shù)align是對齊方式,其值有FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADING或FlowLayout.TRAILING;參數(shù)hgap是組件之間以及組件與容器的邊之間的水平間隙;參數(shù)vgap是組件之間以及組件與容器的邊之間的垂直間隙。其他布局方式的方法中相同參數(shù)屬性相同。采用setLayout(LayoutManagermgr)方法設(shè)置組件容器采用的布局方式例如,采用流布局,對齊方式為左對齊的語句如下:setLayout(newFlowLayout(FlowLayout.LEFT));此外,F(xiàn)lowLayout中還可以設(shè)置橫向和縱向的間隔,設(shè)置間隔可以使用下面的語句:例如,將橫向和縱向間隔設(shè)置成10像素的語句如下:
setLayout(newFlowLayout(FlowLayout.CENTER,10,10));BorderLayout布局管理器BorderLayout是一種簡單的布局,該布局把容器分為上(North)、下(South)、左(West)、右(East)、中間(Center)5個區(qū)域,每個組件將占據(jù)每個區(qū)域。其中前4個方向占據(jù)屏幕的四邊,而Center方向占據(jù)中間剩下的空白。這種布局一般用于給自己定義的JPanel添加邊框。BorderLayout是JFrame和JDialog缺省的布局。BorderLayout布局效果如圖所示。
BorderLayout常用方法:BorderLayout()構(gòu)造一個組件之間沒有間距的新邊界布局BorderLayout(int
hgap,int
vgap)用指定的組件之間的水平間距構(gòu)造一個邊界布局setHgap(int
hgap)設(shè)置組件之間的水平間距setVgap(int
vgap)設(shè)置組件之間的垂直間距getVgap()返回組件之間的垂直間距getHgap()返回組件之間的水平間距例如,采用BorderLayout布局,并將按鈕放在窗口上方的語句如下:setLayout(newBorderLayout());JButtonb=newJButton("Button");add(b,BorderLayout.NORTH);BorderLayout布局管理器GridLayout布局管理器GridLayout有點(diǎn)像圍棋盤,將布局空間劃分成若干行若干列的網(wǎng)格區(qū)域。添加的組件就在這些小的網(wǎng)格區(qū)域內(nèi)。GridLayout布局效果如圖所示。GridLayout布局管理器(續(xù))GridLayout常用方法:GridLayout()創(chuàng)建具有默認(rèn)值的網(wǎng)格布局,即每個組件占據(jù)一行一列GridLayout(int
rows,int
cols)創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局GridLayout(int
rows,int
cols,int
hgap,int
vgap)創(chuàng)建具有指定行數(shù)
rows和列數(shù)cols的網(wǎng)格布局setColumns(int
cols)將此布局中的列數(shù)設(shè)置為指定值colssetHgap(int
hgap)將組件之間的水平間距設(shè)置為指定值setRows(int
rows)將此布局中的行數(shù)設(shè)置為指定值rowssetVgap(int
vgap)將組件之間的垂直間距設(shè)置為指定值getColumns()獲取此布局中的列數(shù)getHgap()獲取組件之間的水平間距getRows()獲取此布局中的行數(shù)getVgap()獲取組件之間的垂直間距GridLayout布局管理器(續(xù))例如,采用GridLayout布局,設(shè)置一行兩列,放置兩個按鈕的語句如下:setLayout(newGridLayout(1,2));JButtonb1=newJButton("Button1");JButtonb2=newJButton("Button2");add(b1);add(b2);CardLayout布局管理器CardLayout將容器中的每個組件當(dāng)作一張卡片,在一個容器中可以加入多個卡片,但每次只有一個卡片是可見的。CardLayout常用方法:CardLayout()創(chuàng)建一個間隙大小為0的新卡片布局CardLayout(int
hgap,int
vgap)創(chuàng)建一個具有指定的水平和垂直間隙的新卡片布局addLayoutComponent(Component
comp,Object
constraints)將指定的組件添加到此卡片布局的內(nèi)部名稱表。其中參數(shù)comp是要添加的組件;參數(shù)constraints是標(biāo)識布局中特定卡片的標(biāo)記setHgap(int
hgap)設(shè)置組件之間的水平間隙setVgap(int
vgap)設(shè)置組件之間的垂直間隙previous(Container
parent)翻轉(zhuǎn)到指定容器parent的前一張卡片next(Container
parent)翻轉(zhuǎn)到指定容器parent的下一張卡片last(Container
parent)翻轉(zhuǎn)到容器
parent的最后一張卡片first(Container
parent)翻轉(zhuǎn)到容器
parent的第一張卡片CardLayout布局管理器(續(xù))getHgap()獲得組件之間的水平間隙getLayoutAlignmentX(Container
parent)返回容器
parent中組件沿x軸的對齊方式。返回值應(yīng)該在0和1之間,其中0表示根據(jù)原點(diǎn)進(jìn)行對齊,1表示根據(jù)距離原點(diǎn)最遠(yuǎn)的點(diǎn)對齊,0.5表示居中對齊等。getLayoutAlignmentY(Container
parent)返回容器
parent中組件沿y軸的對齊方式。返回值應(yīng)該在0和1之間,其中0表示根據(jù)原點(diǎn)進(jìn)行對齊,1表示根據(jù)距離原點(diǎn)最遠(yuǎn)的點(diǎn)對齊,0.5表示居中對齊等等。getVgap()獲得組件之間的垂直間隙例如,采用CardLayout布局,將兩個按鈕放在卡片中的語句如下:JButtonb1=newJButton("First");JButtonb2=newJButton("Last");setLayout(newCardLayout());add(b1,"1");add(b2,"2");
GridBagLayout布局管理器GridBagLayout是一種非常靈活的布局,也是最復(fù)雜的。它是在將屏幕劃分成網(wǎng)格的基礎(chǔ)上,允許每個組件占據(jù)一個或多個區(qū)域。與GridLayout不同,GridBagLayout是按照開發(fā)人員自己的需要安排組件位置。GridBagLayout布局效果如圖所示。GridBagLayout布局管理器(續(xù))
GridBagLayout常用方法:GridBagLayout()
創(chuàng)建網(wǎng)格包布局管理器arrangeGrid(Container
parent)布置網(wǎng)格。其中參數(shù)parent是布局容器addLayoutComponent(Component
comp,Object
constraints)使用指定constraints對象將指定組件添加到布局中。其中參數(shù)constraints是確定如何將組件添加到布局的對象getConstraints(Component
comp)獲取指定組件的約束。返回實(shí)際GridBagConstraints對象的副本getLayoutDimensions()確定布局網(wǎng)格的列寬度和行高度,大多數(shù)應(yīng)用程序并不直接調(diào)用此方法setConstraints(Component
comp,GridBagConstraints
constraints)設(shè)置此布局中指定組件的約束條件constraints其中參數(shù)comp是制定的組件。GridBagLayout布局管理器(續(xù))GridBagLayout需要創(chuàng)建約束對象GridBagConstraints,GridBagConstraints類指定使用GridBagLayout類布置的組件的約束。GridBagConstraints的常用參數(shù)參數(shù)意義gridx組件的橫向坐標(biāo)girdy組件的縱向坐標(biāo)gridwidth組件的橫向?qū)挾?,也就是指組件占用的列數(shù)。使用RELATIVE指定組件的顯示區(qū)域從gridx到它所在行的倒數(shù)第二個單元格;使用REMAINDER指定組件的顯示區(qū)域?yàn)閺膅ridx到該行(針對gridwidth)中的最后一個單元gridheight組件的縱向長度,也就是指組件占用的行數(shù)weightx指行的權(quán)重,告訴布局管理器如何分配額外的水平空間weighty指列的權(quán)重,告訴布局管理器如何分配額外的垂直空間anchor當(dāng)組件小于其顯示區(qū)域時(shí)使用此屬性fill如果顯示區(qū)域比組件的區(qū)域大的時(shí)候,可以用來控制組件的行為。控制組件是垂直填充,還是水平填充,或者兩個方向一起填充insets指組件與表格空間四周邊緣的空白區(qū)域的大小ipadx
組件間的橫向間距,組件的寬度就是這個組件的最小寬度加上ipadx值ipady
組件間的縱向間距,組件的高度就是這個組件的最小高度加上ipady值GridBagLayout布局管理器(續(xù))例如,采用GridBagLayout布局,在窗體上放置b1-b5共五個按鈕。b1、b2和b3位于第一行,填充整個區(qū)域;后兩個按鈕位于第二行,其中b4按鈕占據(jù)兩個按鈕的位置的主要代碼如下:JFramef=newJFrame("GridBagLayout");GridBagLayoutgridbag=newGridBagLayout();GridBagConstraintsc=newGridBagConstraints();f.setLayout(gridbag);c.fill=GridBagConstraints.BOTH;//使組件完全填滿其顯示區(qū)域
c.weightx=1.0;//分布額外的水平空間
gridbag.setConstraints(b1,c);//指定按鈕b1的約束條件為cgridbag.setConstraints(b2,c);
GridBagLayout布局管理器(續(xù))c.gridwidth=GridBagConstraints.REMAINDER;/*組件的顯示區(qū)域?yàn)閺膅ridx到該行(針對gridwidth)中的最后一個單元*/c.weightx=0.0;gridbag.setConstraints(b3,c);c.weightx=0.0;c.gridwidth=GridBagConstraints.RELATIVE;//指定組件為其行中的倒數(shù)第二個組件
gridbag.setConstraints(b4,c);c.gridwidth=GridBagConstraints.REMAINDER;gridbag.setConstraints(b5,c);BoxLayout布局管理器BoxLayout(盒式布局或箱式布局)與前面幾種布局不同的是BoxLayout是由Swing提供的布局方式,功能上同GridBagLayout一樣強(qiáng)大,而且更加易用。BoxLayout將幾個組件以水平或垂直的方式組合在一起,其中各個組件的大小隨窗口的大小變化而變化。
BoxLayout常用方法:BoxLayout(Container
target,int
axis)創(chuàng)建一個將沿給定軸放置組件的布局管理器,target是需要布置的容器,參數(shù)axis是布置組件時(shí)使用的軸。它可以是以下值之一:BoxLayout.X_AXIS、BoxLayout.Y_AXIS、BoxLayout.LINE_AXIS或BoxLayout.PAGE_AXIScreateGlue()創(chuàng)建一個不可見的“glue”組件,在其可見組件有一個最大寬度(對于橫向box)或高度(對于縱向box)的Box中,該組件可能很有用createHorizontalBox()創(chuàng)建一個從左到右顯示其組件的BoxcreateHorizontalGlue()創(chuàng)建一個橫向glue組件createHorizontalStrut(int
width)創(chuàng)建一個不可見的、固定寬度為width的組件BoxLayout布局管理器(續(xù))createVerticalBox()創(chuàng)建一個從上到下顯示其組件的BoxcreateVerticalGlue()創(chuàng)建一個縱向glue組件createVerticalStrut(int
height)創(chuàng)建一個不可見的、固定高度height的組件getAccessibleContext()獲得與此Box相關(guān)聯(lián)的AccessibleContext例如,采用BoxLayout布局的語句,并將兩個按鈕水平從上到下放于一列的主要代碼如下:Containerc=this.getContentPane();//需要布置的容器
BoxLayoutbox1=newBoxLayout(c,BoxLayout.Y_AXIS);//指定按鈕從上到下放置
c.setLayout(box1);//設(shè)置布局方式為BoxLayout布局
c.add(newJButton("first"));c.add(Box.createVerticalStrut(10));//創(chuàng)建一個不可見的、固定高度的空間量
c.add(newJButton("second"));本章小結(jié)⑴抽象窗口工具包(AbstractWindowtoolkit,AWT)提供了一套與本地圖形界面進(jìn)行交互的接口。AWT中的圖形函數(shù)與操作系統(tǒng)所提供的圖形函數(shù)之間有著一一對應(yīng)的關(guān)系,稱之為peers。當(dāng)利用AWT來構(gòu)建圖形用戶界面時(shí),實(shí)際上是在利用操作系統(tǒng)所提供的圖形庫,但是不同操作系統(tǒng)的圖形庫所提供的功能不一樣,在一個平臺上存在的功能在另外一個平臺上則可能不存在,所以為了實(shí)現(xiàn)Java語言所宣稱的“一次編譯,到處運(yùn)行”,AWT不得不通過犧牲功能來實(shí)現(xiàn)其平臺無關(guān)性,也就是說,AWT所提供的圖形功能是各種通用型操作系統(tǒng)所提供的圖形功能的交集。由于AWT是依靠本地方法來實(shí)現(xiàn)其功能的,通常把AWT組件稱為重量級組件。AWT是Java最早用于編寫圖形界面應(yīng)用程序的開發(fā)包。Swing是在AWT的基礎(chǔ)上構(gòu)建的一套新的圖形界面系統(tǒng),它提供了AWT所能夠提供的所有功能,并且用純粹的Java代碼對AWT的功能進(jìn)行了大幅度的擴(kuò)充。由于在Swing中沒有使用本地方法來實(shí)現(xiàn)圖形功能,通常把Swing組件稱為輕量級組件。本章小結(jié)(續(xù))AWT是基于本地方法的C/C++程序,其運(yùn)行速度比較快;Swing是基于AWT的Java程序,其運(yùn)行速度比較慢。對于一個嵌入式應(yīng)用來說,目標(biāo)平臺的硬件資源往往非常有限,而應(yīng)用程序的運(yùn)行速度又是項(xiàng)目中至關(guān)重要的因素。在這種矛盾的情況下,簡單而高效的AWT當(dāng)然成了嵌入式Java的第一選擇;而在普通的基于PC或者是工作站的標(biāo)準(zhǔn)Java應(yīng)用中,硬件資源對應(yīng)用程序所造成的限制往往不是項(xiàng)目中的關(guān)鍵因素,所以在標(biāo)準(zhǔn)版的Java中則提倡使用Swing,也就是通過犧牲速度來實(shí)現(xiàn)應(yīng)用程序的功能。⑵容器從功能上可分為頂層容器、中間容器和特殊容器三種。⑶開發(fā)人員在使用Java進(jìn)行圖形編程時(shí),其組件需要放置在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融服務(wù)承攬合同三篇
- 物流成本控制與倉庫效率計(jì)劃
- 貸款利率協(xié)議三篇
- 紡織品供應(yīng)招標(biāo)合同三篇
- 基金小鎮(zhèn)相關(guān)行業(yè)投資規(guī)劃報(bào)告
- 涉外學(xué)生管理與適應(yīng)輔導(dǎo)計(jì)劃
- 新光源助航燈光設(shè)備相關(guān)項(xiàng)目投資計(jì)劃書范本
- 多媒體教學(xué)資源利用計(jì)劃
- 企業(yè)虛擬貨幣貸款合同三篇
- 預(yù)算執(zhí)行監(jiān)控方案計(jì)劃
- 中國舞蹈基礎(chǔ)智慧樹知到期末考試答案章節(jié)答案2024年中國石油大學(xué)(華東)
- 年產(chǎn)1萬噸連續(xù)玄武巖纖維及其制品申請建設(shè)可行性研究報(bào)告
- 專題片創(chuàng)作與賞析智慧樹知到期末考試答案2024年
- 《元旦晚會中學(xué)生》課件
- 漂流項(xiàng)目規(guī)劃設(shè)計(jì)方案
- 貴州醫(yī)藥市場分析及深度研究報(bào)告
- HGT 4095-2023 化工用在線氣相色譜儀 (正式版)
- 直流輸電的基本原理課件
- 2024年口腔科醫(yī)師工作總結(jié)個人述職報(bào)告(四篇合集)
- 新人教版五年級小學(xué)數(shù)學(xué)全冊奧數(shù)(含答案)
- 志愿服務(wù)證明(多模板)
評論
0/150
提交評論