Swing組件的各種面板JRootPane根面板,JLayeredPane層面板等_第1頁(yè)
Swing組件的各種面板JRootPane根面板,JLayeredPane層面板等_第2頁(yè)
Swing組件的各種面板JRootPane根面板,JLayeredPane層面板等_第3頁(yè)
Swing組件的各種面板JRootPane根面板,JLayeredPane層面板等_第4頁(yè)
Swing組件的各種面板JRootPane根面板,JLayeredPane層面板等_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、主要參考文現(xiàn):美Herbert Schildt著 鄢愛蘭 鹿江春譯 ?java參考大全 J2SE?清華大學(xué)出版社2022年1月孫衛(wèi)琴 ?Java面向?qū)ο缶幊?出版社及日期不詳java API開發(fā)人員文檔本文 黃邦勇帥本文的說明:本文主要講解了對(duì)大學(xué)初學(xué)Swing時(shí)對(duì)根面板 JRootPane,內(nèi)容面板 containPane,層面板JLayeredPane,玻璃面板glassPnae的困惑,本文對(duì)各種面板作了詳盡的討論,讓讀者能真正的明白根面板,內(nèi)容面板,層面板到底是 什么,他們?cè)诔绦蛑械淖饔?以及他們之間的關(guān)系,透明性,可見性,作了講解.本文內(nèi)容完全屬于個(gè)人見解與參考 文現(xiàn)的作者無(wú)關(guān),其中難

2、免有誤解之處,望指出更正.Swing組件的各種面板(JRootPane根面板,JLayeredPane層面板等)JFrame框架窗口中各面板的層次結(jié)構(gòu)第一局部:JFrame中各面板間的關(guān)系,透明性與可見性問題注:在某些地方把面板也叫做窗格,比方根面板,也叫根窗格,層面板也叫分層窗格等.注意窗格與窗體是不一樣的.在Swing中的JFrame窗體與 AWT中的Frame窗體有一些不同.JFrame由他的窗體本身加上其上的JRootPane根面板,JLayeredPane層面板,containPane內(nèi)容面板,glassPane玻璃面板,JMenuBar菜單欄(可選,不包括在內(nèi))四局部組成. 其中根

3、面板在 JRootPane類中實(shí)現(xiàn),層面板在 JLayeredPane類中實(shí)現(xiàn),他們都是 JComponent的子類.而 containPane 和glassPane沒有專門對(duì)應(yīng)的類.1、各種面板(或稱窗格)的關(guān)系及作用:JRootPane根面板:該面板是在JFrame窗體創(chuàng)立時(shí)就默認(rèn)添加進(jìn)來的,是所有其他面板的載體或父級(jí),他覆蓋窗體的 除標(biāo)題欄和邊條之外的整個(gè)外表.根面板默認(rèn)是不可見的.根面板負(fù)責(zé)治理其他面板(層面板,玻璃面板),如使其他面板覆蓋整個(gè)JFrame窗體等.JLayeredPane層面板:該面板是其他所有面板的父級(jí),在JRootPane面板的上面,他再次覆蓋窗體的整個(gè)外表,內(nèi)容面

4、板和JMenuBar菜單欄被添加到層面板上.當(dāng)添加了菜單欄時(shí),菜單欄被添加到JLayeredPane面板的頂部,剩下的部 分被內(nèi)容面板填充.層面板是分很多層的,每一層使用一個(gè)相應(yīng)的數(shù)字來表示,而內(nèi)容面板就位于層面板中的某一層,在后面的內(nèi)容中我們可以看到層面板可以讓你設(shè)計(jì)出相互重疊的內(nèi)部窗體,層面板將負(fù)責(zé)治理各種內(nèi)部窗體的疊放問題,對(duì)于層面板的每一層都相當(dāng)于是一個(gè)容器,因此可以直接向?qū)用姘逯刑砑咏M件.層面板的內(nèi)容后面會(huì)作具體介紹.containPane內(nèi)容面板:由層面板的介紹可知,內(nèi)容面板是層面板中的某一層.默認(rèn)的內(nèi)容面板是不透明的,而且是一 個(gè)JPane對(duì)象.該面板在窗體中起著工作區(qū)的作用,當(dāng)

5、我們向窗體添加組件時(shí)就應(yīng)該添加到這一層上,而不能像AWT那樣直接添加到窗體上,假設(shè)你那樣做了,實(shí)際上該組件也是被添加到內(nèi)容面板上的,假設(shè)窗體未設(shè)置內(nèi)容面板,那么組件 無(wú)法顯示.比方要添加按鈕jb 那么正確的方 式為,Container p=jframe.getContentPane(); p.add(jr);或 jframe.getContentPane().add(jr);其中g(shù)etContentPane()是JFrame類中的方法,該方法將反回內(nèi)容面板的引用,這是訪問 默認(rèn)的內(nèi)容面板的方法,由于默認(rèn)的內(nèi)容面板沒有特定的名字,因此應(yīng)使用該方法. glassPane玻璃面板:該面板總是存在的,

6、而且他位于最上面,默認(rèn)情況下玻璃面板是 不可見的,玻璃面板用于接收鼠標(biāo)事件和在其他組件上繪圖. 2、各面板中使用的布局治理器: 在內(nèi)容面板上使用的布局治理器默認(rèn)是BorderLayout.在根面板上 使用的布局治理器是一個(gè)自定義的 LayoutManager(布局治理器),他的作用是布局根面板之上的其他面板. 很明顯如果你要向根面板中添加組件就應(yīng)使用setLayout方法為其設(shè)置適宜的布局治理器或自已設(shè)定組件的大小和顯示位置.如果你改變了根面板自定義的LayoutManager那么你就應(yīng)編寫負(fù)責(zé)布局根面板之上的各種面板的程序,如果沒有這樣的程序,那么在根面板之上的各種面板就不能正常的布局,因此

7、對(duì)于根面板的布局治理器一般不要隨便更改.玻璃面板的默認(rèn)布局治理器是 FlowLayout.對(duì)于層面板 而言,在將容器添加進(jìn)層面板時(shí),將在添加容器時(shí)指定把該容器添加進(jìn)層面板的哪一層,因而某層的布局 治理器由添加到該層的容器所決定,因此無(wú)需為層面板的某一層設(shè)置布局治理器,也就是說層面板沒有布局治理器.當(dāng)把某一容器比方Panel設(shè)為某種面板內(nèi)容面板時(shí),那么面板的布局與添加進(jìn)來的容器的布局治理器相同,比方把Panel作為內(nèi)容面板,那么內(nèi)容面板的布局治理器就是FlowLayout.注意:對(duì)于層面板的各層來說,只能把某種容器比方Panel設(shè)置為內(nèi)容面板,不能把容器設(shè)置為層面板中的其他各層.3、各面板的可見

8、性和透明性問題可見性使用setVisible方法來顯示在AWT時(shí)已見過不少,透明性使用setOpaque方法來設(shè)置.setOpaque方法只有在 javax.swing包中的組件才有,對(duì)于 java.awt包中的組件是沒有該方法的,因此要使用該方法有時(shí)需要使用強(qiáng)制類型轉(zhuǎn) 換可見性與透明性的區(qū)別:區(qū)別在于,當(dāng)面板是不可見時(shí),那么該面板中包含的組件也會(huì)不可見.假設(shè)該面板是透明但可見的,那么只是面板會(huì)透明比方面板的背景色無(wú)法看到,但面板上的組件仍會(huì)顯示.根面板:默認(rèn)情況下,根面板是可見且不透明的.內(nèi)容面板:默認(rèn)情況下,內(nèi)容面板是可見的且不透明的,因此我們創(chuàng)立的JFrame窗體,實(shí)際上看到的是內(nèi)容面板

9、中的內(nèi)容.玻璃面板:默認(rèn)的玻璃面板是透明的且不可見的,因此要顯示默認(rèn)的玻璃面板應(yīng)設(shè)置setVisible和setOpaque兩個(gè)方法,假設(shè)你把某一容器比方Panel設(shè)為玻璃面板,那么這時(shí)的玻璃面板仍然是不可見的,但他不是透明的,這取決于容器比如Panel是否是透明的.因此要把這種類型的玻璃面板顯示出來只需設(shè)置setVisible方法就夠了.層面板:不管是你自已創(chuàng)立的層面板還是默認(rèn)的層面板都是透明的且可見的,層面板中的內(nèi)容面板是個(gè)特例,要使層 面板可顯示應(yīng)設(shè)置 setOpaque方法.層面板和內(nèi)容面板可見性與透明性的關(guān)系:內(nèi)容面板默認(rèn)在層面板的-30000層,假設(shè)我們像層面板添加組件時(shí)應(yīng)設(shè)置將該

10、組件添加進(jìn)層面板的哪一層,假設(shè)不然就會(huì)出現(xiàn)一些問題,因此應(yīng)使用addComponent com, Object constrainer這個(gè)方法,在添加組件時(shí)使用addcom, new Integer100;這樣的形式,Integer對(duì)象是int裝相后的結(jié)果,裝相后把整數(shù)當(dāng)作對(duì)象來看待,其實(shí)Integer對(duì)象就是一個(gè)整數(shù).內(nèi)容面板和層面板及層面板之間的顯示問題,由于只能把某種容器比方Panel設(shè)置為內(nèi)容面板,不能把容器設(shè)置為層面板中的其他各層,我們也無(wú)法直接該問到層面板中的其他各層,因此層面板將只會(huì)有一種背景色除內(nèi)容面板外且背景色使用JLayeredPane類型的對(duì)象來設(shè)置,不會(huì)存在層面板的每一

11、層都有各自的背景色的情況,層面板透明與不透明 也只能由JLayeredPane的對(duì)象來設(shè)置,不能設(shè)置層面板中各個(gè)層次的透明性.因此在層面板的各層之間他們始終是彼 此透明的,無(wú)法更改,而相對(duì)與其他面板層面板比方根面板可以透明也可以不透明使用JLayeredPane對(duì)象來設(shè)定.而對(duì)于內(nèi)容面板而言,由于內(nèi)容面板是存在于層面板中的某一層,因此層面板中的其他層相對(duì)于內(nèi)容面板也是透明的, 無(wú)法更改.但是在 層面板的所有層中只有內(nèi)容面板是不透明的,因此假設(shè)我們既為內(nèi)容面板設(shè)置了背景色也為層面板設(shè)置了背景色那么最后只會(huì)顯示內(nèi)容面板的背景色,除非讓內(nèi)容面板透明或不可見,這時(shí)才會(huì)顯示出層面板的背景色.當(dāng)向?qū)用姘逯?/p>

12、添加的組件在內(nèi)容面板之上大于-30000時(shí),這些組件將與內(nèi)容面板的組件同時(shí)顯示假設(shè)不重疊的話,假設(shè)重疊那么顯示層數(shù)數(shù)值更大的組件 .假設(shè)向?qū)用姘逯刑砑拥慕M件在內(nèi)容面板之下 小于-3000層,那么內(nèi)容面板將把層面板 中的組件都遮擋住,由于內(nèi)容面板是不透明的.應(yīng)注意的問題:1、containPane是JLayeredPane中的某一層.是我們的工作區(qū)間,組件都應(yīng)該添加到該面板上.而不能像AWT那樣直接向Frame窗體添加組件.2、可以創(chuàng)立JRootPane的對(duì)象,但無(wú)法把該對(duì)象設(shè)置為某一個(gè)窗體的根面板,因此一般情況下JFrame窗體的根面板是唯一的.比方 JRootPane jr=new JRoo

13、tPane;但不能使用 JFrame中的jframe.setRootPanejr;方法把jr設(shè)置為該窗 體的根面板,由于 setRootPane方法是protected類型的,只能由繼承自該類的子類的構(gòu)造方法使用.3、關(guān)于設(shè)置面板的問題:對(duì)于JFrame窗口的根面板和層面板只能把JRootPane和JLayeredPane類型的對(duì)象設(shè)為根面板和層面板,而不能把Component或Container類型的組件設(shè)為根面板或?qū)用姘?而對(duì)于玻璃面板那么可以把Component類型的對(duì)象設(shè)為玻璃面板,對(duì)于內(nèi)容面板可以把Container類型的對(duì)象設(shè)為內(nèi)容面板.這取決于 JFrame類中的set*Pane

14、類型 參數(shù);方法中的"類型"是什么.對(duì)根面板其類型為JRootPane,對(duì)內(nèi)容面板類型為 Container4、關(guān)于內(nèi)容面板:除了默認(rèn)的層面板附帶有內(nèi)容面板之外,你自已創(chuàng)立的層面板將不會(huì)擁有內(nèi)容面板,這時(shí)你必須手動(dòng)為層面板設(shè)置一個(gè)內(nèi)容面板比方把JPanel設(shè)為內(nèi)容面板,由于層面板是不可見且透明的,因此我們現(xiàn)在看到的將是根面板的內(nèi)容,假設(shè)你為根面板設(shè)置了背景色,那么將顯示該背景色.比方JLayeredPane jp=new JLayeredPane;jframe.setLayeredPanejp;這時(shí)假設(shè)使用jframe.getContentPane.addjb;語(yǔ)句,那么按

15、鈕 jb將無(wú)法顯示,由于該層面 板中還沒有前容面板存在,在添加組件之前應(yīng)把某個(gè)容器設(shè)為內(nèi)容面板,比方j(luò)frame.setContentPanejpanel;這樣程序就能正常運(yùn)行了.5、關(guān)于所有面板都設(shè)為不可見或透明時(shí)的問題:假設(shè)除根面板外把其他所有面板都設(shè)為不可見或透明,那么假設(shè)根面板設(shè)為 透明,那么會(huì)顯示JFrame的面板,標(biāo)題欄和邊框.假設(shè)根面板設(shè)為不可見,那么我們只能看到一個(gè)框架,即只有標(biāo)題欄, 邊框,看不見JFrame的面板.6、關(guān)于層面板的透明問題:層面板都是透明的且不可見的,在層面板的各層之間他們始終是彼此透明的,無(wú)法更改, 我們也無(wú)法直接訪問到層面板中的其他各層,因此層面板將只會(huì)

16、有一種背景色除內(nèi)容面板外且背景色使用JLayeredPane類型的對(duì)象來設(shè)置,不會(huì)存在層面板的每一層都有各自的背景色的情況,層面板透明與不透明也只能 由JLayeredPane的對(duì)象來設(shè)置,不能設(shè)置層面板中各個(gè)層次的透明性.各層面板之間的可見性透明性及各種面板之間的關(guān)系例如:import java.awt.*;import java.awt.event.*;import javax.swing.*; JFramef= new JFrame ();JPanel jp1= new JPanel ();JButtonjb1= new JButton("玻璃卸板默認(rèn) FlowLayout 布

17、局");JButtonjb2= new JButton("內(nèi)容回板默認(rèn) BorderLayout布局");JButtonjb3= new JButton("在內(nèi)容卸板之卜的層圓板 ");JButtonjb4= new JButton("根回板無(wú)默認(rèn)布局");JButtonjb5= new JButton("在內(nèi)容卸板之上的層圓板");JButtonjb6= new JButton("JFrame 窗體");將 JFrame所反回的面板都強(qiáng)制轉(zhuǎn)換為JComponent類型,以便調(diào)用set

18、OpaqueJComponent p1=( JComponent )f.getGlassPane();JComponent p2=( JComponent )f.getContentPane();JComponent p3=( JComponent )f.getLayeredPane();JComponent p4=( JComponent )f.getRootPane();public class A public static void main( Stringarg口)/方法.ColorColorColorColor. red );. yellow );.blue );. green )

19、;p1.setBackground(p2.setBackground(p3.setBackground(p4.setBackground(p1.add(jb1);p2.add(jb2, BorderLayout . SOUTH);/為層面板p3添加兩個(gè)按鈕,且分別放置在內(nèi)容面板之上和內(nèi)容面板之下p3.add(jb3, new Integer (-30001);/ 將按鈕 jb3 ,放置在內(nèi)容面板之下p3.add(jb5, new Integer (22);/將按鈕jb5 ,放置在內(nèi)容面板之上jb5.setSize(200,22); jb5.setLocation(7,35);jb3.setSi

20、ze(200,22); jb3.setLocation(7,90);/向根面板p4中添加一個(gè)按鈕jb4 p4.add(jb4);jb4.setSize(200,22); jb4.setLocation(7,60);/f.add(jb6,BorderLayout.NORTH);/該方法實(shí)際上是把按鈕jb5添加到了內(nèi)容面板上,并未把jb5添加到窗體f上f.setLocation(222,222); f.setSize(222,222); f.setVisible(true );/循環(huán)顯示各層面板 while ( true )/玻璃面板默認(rèn)是不可見且透明的.顯示玻璃面板紅色背景.try Thread

21、 . sleep (2000); catch ( InterruptedExceptione) p1.setVisible( true );p1.setOpaque( true );f.repaint();/應(yīng)使用repaint方法重緩一次,要不然會(huì)出現(xiàn)組件上次顯示的殘影/使玻璃面板透明,但是是可見的,這樣的話就會(huì)顯示內(nèi)容面板和層次數(shù)目在內(nèi)容面板之上的層面板的內(nèi)容.由于層面板自身層內(nèi)之間是相互透明的,因此不會(huì)顯示層面板的藍(lán)色背景,相反內(nèi)容面板是不透明的,因此會(huì)顯示內(nèi)容面板的背景顏色try Thread . sleep (2000); catch ( InterruptedExceptione)

22、 p1.setOpaque( false );/p1.setVisible(false); /你也可以把該行的注釋刪除掉,以便觀察可見性與透明性的區(qū)別.f.repaint();/使內(nèi)容面板透明,由于前面已把玻璃面板設(shè)為透明,因此會(huì)顯示全部的層面板的內(nèi)容,包括層面板的藍(lán)色背景try Thread . sleep (2000); catch ( InterruptedExceptione) p2.setOpaque(false );/p2.setVisible(false);p3.setOpaque(true );f.repaint();/使層面板透明,由于內(nèi)容面板是層面板中的某一層,因此該設(shè)置同

23、樣會(huì)使內(nèi)容面板透明,再加上之前已把玻璃面板設(shè)為透明,因此最后將會(huì)顯示即不透明也是可見的根面板的內(nèi)容及其綠色的背景色.try Thread . sleep (2000); catch ( InterruptedExceptione) p3.setOpaque( false );/p3.setVisible(false);f.repaint();/使所有面板的可見性及透明性復(fù)原.try Thread . sleep (2000); catch ( InterruptedExceptione) p1.setVisible(false );p2.setOpaque(true );p3.setOpaqu

24、e(true );f.repaint(); 程序結(jié)果按如下順序循環(huán)顯示1、最先顯示在未設(shè)置可見性及透明性之前的初始效果顯示內(nèi)容面板及層數(shù)在其上的層面板的內(nèi)容2、兩秒之后玻璃面板上的按鈕玻璃面板的紅色背景默認(rèn)時(shí)玻璃面板是透明的且不可見的 但可以更改其可見性與透明性把玻璃面板設(shè)為可見且不透明時(shí)的效果顯示玻璃面3、再2秒之后玻璃面板被設(shè)為透明但可見的,因此玻璃面板之上的按鈕仍然被顯示出來 由于層面板彼此之間的各層是透明的,因此該按鈕仍被顯示出來把玻璃面板設(shè)為透明時(shí)的效果-顯示內(nèi)容面板背景色4、再2秒之后玻璃面板被設(shè)為透明但可見的, 因此玻璃面板之上的按鈕仍然被顯示出來 由于層面板彼此之間的各層是透明

25、的,因此該按鈕仍被顯示出來一層面板的藍(lán)色背景一該層位于內(nèi)容面板之下, 由于把內(nèi)容面板設(shè)置為透明的,因此該層的按鈕就被顯示出來了,而且層面板的背景色藍(lán)色也顯示出來了把內(nèi)容面板和玻璃面板都設(shè)為透明時(shí)的效果顯示層面板背景色5、再2秒之后玻璃面板被設(shè)為透明但可見的,因此玻璃面板之上的按鈕仍然被顯示出來根面板之上的按鈕根面板的綠色背景把層面板和玻璃面板都設(shè)為透明時(shí)的效果顯示根面板背景色第2局部:JRootPane類對(duì)于根面板的內(nèi)容,我們?cè)谇懊嬉呀榻B過,這里我們來具體看一下 JRootPane類的內(nèi)容,該類只有一個(gè)默認(rèn)的構(gòu)造方法, 但要注意,假設(shè)你自已創(chuàng)立一個(gè)JRootPane對(duì)象,那些你應(yīng)該對(duì)在根面板之

26、上的層面板,玻璃面板和菜單欄的布局負(fù)責(zé)JRootPane類的內(nèi)部類有:JRootPane.RootLayout:該類自定義布局治理器負(fù)責(zé)層面板,玻璃面板和菜單欄的布局.protected Container contentPane protected JButton defaultButtonJRootPane類的常量有:內(nèi)容窗格或面板當(dāng)面板成為焦點(diǎn)并有類似按下Enter鍵的特定于UI的操作發(fā)生時(shí)被激活的按鈕.protected Component glassPaneprotected JLayeredPane layeredPane玻璃窗格,便于截取鼠標(biāo)移動(dòng)等操作治理菜單欄和內(nèi)容窗格的分層窗

27、格COLOR_CHOOSER_DIALOG ERROR_DIALOG FILE_CHOOSER_DIALOG FRAMEINFORMA TION_DIALOG NONEPLAIN_DIALOG QUESTION_DIALOG WARNING_DIALOG JRootPane的方法有:protected Container createConentPane();protected Component createGlassPane();protected JLayeredPane createLayeredPane();protected LayoutManager createRootLayo

28、ut ();protected JMenuBar menuBar 菜單欄以下的常量為static int類型,者B是供windowDecorationStyle 屬性使用的常量指示JRootPane應(yīng)提供適合 Dialog的裝飾以便顯示 JColorChooser指示JRootPane應(yīng)提供適合Dialog的裝飾以便顯示一條錯(cuò)誤消息指示JRootPane應(yīng)提供適合 Dialog的裝飾以便顯示 JFileChooser指示JRootPane應(yīng)提供適合Frame的裝飾指示JRootPane應(yīng)提供適合Dialog的裝飾以便顯示一條報(bào)告消息指示JRootPane不應(yīng)提供任彳類型的 Window裝飾指示

29、JRootPane應(yīng)提供適合Dialog的裝飾指示JRootPane應(yīng)提供適合 Dialog的裝飾以便向用戶顯示一個(gè)問題指示JRootPane應(yīng)提供適合Dialog的裝飾以便顯示一條警告消息 由構(gòu)造方法調(diào)用以創(chuàng)立默認(rèn)的內(nèi)容面板.注意該方法只能由構(gòu)造方法調(diào)用.由構(gòu)造方法調(diào)用以創(chuàng)立默認(rèn)的玻璃面板由構(gòu)造方法調(diào)用以創(chuàng)立默認(rèn)的層面板由構(gòu)造方法調(diào)用以創(chuàng)立默認(rèn)的布局治理.void setContentPane(Container co);void setGlassPane(Component g);void setJMenuBar (JMenuBar m);void setLayeredPane(JLaye

30、redPane jl);Container getContentPane();Component getGlassPane();JMenuBar getJMenuBar();JLayeredPane getLayeredPane();void setDefaultButton (JButton de);JButton getDefaultButton ();void setUI (RootPaneUI ui);RootPaneUI getID ();String getUIClassID ();void setWindowDecorationStyle (int w);int getWindo

31、wDecorationSytle ();void setDoubleBuffered (boolean b);void updateUI ();設(shè)置內(nèi)容窗格.設(shè)定此根窗格的玻璃窗格設(shè)置在分層窗格中使用的菜單欄設(shè)置供根窗格使用的分層窗格反回內(nèi)容窗格.反回此根窗格的當(dāng)前玻璃窗格反回窗格層的菜單欄反回根窗格使用的分層窗格設(shè)置defaultButton屬性,它確定此 JRootPane的當(dāng)前默認(rèn)按鈕.反回defaultButton屬性的值設(shè)置呈現(xiàn)此組件的 L&F對(duì)象反回呈現(xiàn)此組件的 L&F對(duì)象.反回一個(gè)指定呈現(xiàn)此組件的L&F類名稱的字符串.設(shè)置JRootPane應(yīng)提供的Wind

32、ow裝飾類型.反回JRootPane提供的Window裝飾類型的常量.默認(rèn)不提供任何 Window 裝飾即外觀.其值為JRootPane類中定義的那些 static int常量.設(shè)置此組件是否使用雙緩沖技術(shù)將UI屬性重置為當(dāng)前外觀對(duì)應(yīng)的值.第3局部:JLayeredPane類(主要講解組件相互重疊在一起的情況)1、前面已介紹過,JLayperedPane層面板是分很多層的,因此,在 JLayeredPane類中,為層面板的各層都賦于了一個(gè) 編號(hào),以區(qū)別正在使用的是哪一層,這個(gè)編號(hào)是一個(gè)Integer類型(把int類型裝相就成為該類型)的整數(shù),Integer實(shí)際上就是一個(gè)整數(shù).編號(hào)數(shù)字越大的層位

33、于編號(hào)數(shù)字更小的層的前面,也就是說當(dāng)各層的子組件重疊時(shí),高層的子組件將 顯示在低層中的子組件之上,即低層的子組件被高層的子組件遮擋住了.再次說明,對(duì)于層面板的每一層都相當(dāng)于是 一個(gè)容器,因此可以直接向?qū)用姘逯刑砑咏M件.2、為了方便JLayeredPane類定義了一些深度不同的層,這些層由JLayeredPane類中的常量所標(biāo)識(shí)他們是:DEFAULT_LAYER默認(rèn)層.該層是大多數(shù)組件位于的標(biāo)準(zhǔn)層,其值為 Integer(0)PALETTE_LAYERMODALLAYERpalette調(diào)色板層.位于默認(rèn)層之上,它們對(duì)于浮開工具欄和調(diào)色板很有用,其值為Integer(100)該層用于模式對(duì)話框.它

34、們將出現(xiàn)在容器中所有工具欄,調(diào)色板和標(biāo)準(zhǔn)組件之上,其值為Interger(200)POPUP_LAYER彈出層.組合框,工具提示和與幫助文本關(guān)聯(lián)的彈出式窗口將出現(xiàn)在組件,調(diào)色板或生生成他們的對(duì)話框之上.其值為Interger(300)DRAG_LAYER拖動(dòng)一個(gè)組件時(shí),將該組件重分配到拖動(dòng)層可保證將其定位在容器中的其他所有組件之上.完成拖動(dòng)后,可將該組件重分配到其正常層.其值為 Interger(400)FRAME_CONTENT_LAYER 內(nèi)容面板層,我們經(jīng)常使用的內(nèi)容面板層就位于該層上.其值為 Interger(-30000)卜面我們主要講解,添加的組件相互重疊明的問題:index索引值

35、:a、在java中,每向容器添加一個(gè)組件都會(huì)產(chǎn)生一個(gè)隨帶的索引值,即使組件在不同的層上也不影響索引值的產(chǎn)生,假設(shè)在同一層的多個(gè)組件相重疊時(shí),那么索引值越大的組件將被放置在越后面.索引值0表示組件在最上層,而-1表示最底層.每添加一個(gè)組件程序都會(huì)自動(dòng)為其設(shè)置索引值,最先添加的組件索引值為 0,第二個(gè)添加的其值為 1,第三個(gè)添加的那么為 2,以此類推.b、當(dāng)新添加進(jìn)來的組件改變了原來的索引順序時(shí),那么所有組件的索引將重新排列,比方組件1的索引為0,組件2的為1.組件5的為4,當(dāng)把組件6添加到索引位置2時(shí),這時(shí)的索引順序是, 組件1索引為0,組件2為1 ,組件6為2,組件3為3,組件4為4,組件5為

36、5.因此索引值與組件的產(chǎn)生順序有關(guān),最先產(chǎn)生的組件索引值小,而后面產(chǎn)生的組件的索引值都比緊前一個(gè)組件的大1.c、當(dāng)在比當(dāng)前層更低層的面板上產(chǎn)生新組件時(shí),雖然系統(tǒng)產(chǎn)生的索引值的規(guī)律是一樣的,但是這時(shí)你在更低層面板上改變組件的索引值時(shí)就有一個(gè)最小值的限制,這個(gè)最小值就是當(dāng)前層的組件個(gè)數(shù).比方當(dāng)前層有4個(gè)組件,因此索引值最大為3,那么更低層組件的索引值的最小值就是4.在比當(dāng)前層更高層的面板上產(chǎn)生新組件時(shí),不受此限制.positon位置值:在同一層中,組件不但有一個(gè)索引值,而且組件所在的位置還有一個(gè)位置值,位置值與索引值的作用是相同的,產(chǎn)生的方式也是一樣的,位置值與索引值的區(qū)別在于位置值只能在同一層中

37、使用,而索引值是能跨層使用的,也就是說在不同的層中索引值是不相同的,而在不同的層中位置值有可能是相同的,比方在111層上有4個(gè)組件,那么這4個(gè)組件的索引值和位置值都分別是從0到3,這時(shí)在112層上又有3個(gè)組件,那么這兩個(gè)組件的索引值可能是4到6(也有可能被你設(shè)置為 0到2),而位置值那么只能是 0到2之間.index索引值與position位置值的關(guān)系:索引值與位置值的功能和產(chǎn)生方式都是一樣的,因此當(dāng)你改變位置值或索引值時(shí),索引值或位置值就會(huì)作相應(yīng)的改變,當(dāng)然索引值與位置值不一定是相等的,位置值取決與同一層中的組件數(shù),而 索引值那么取決于所有層中的組件總數(shù).改變索引值的方法有add(),改變位

38、置值的方法有setLayer()和setPosition(), moveToBack()和moveToFront()方法.使用 Container 類中的 void add(Component com, Object constrainer) 方法.該方法的作用是,把組件 com添加到層面板中指定的層上.該方法的用法是,把 Integer類型的對(duì)象指定為 constrainer 參數(shù),比方 layeredPane.add(component, JLayeredPane.DEFAULT_LAYER);或者 layeredPane.add(component, new Integer(10).這里

39、要注意的是第二個(gè)參數(shù)一定要是Integer類型的,不可以使用int類型,假設(shè)使用int類型,那么不會(huì)出錯(cuò),由于在 Container類中還有一個(gè) add方法,其形式為 add(Component com, int index);表示將組件添加到指定的索引處.使用 Container 類中的 void add(Component com, Object constrainer, int index) 方法該方法與上面帶兩個(gè)參數(shù)的 add方法相似,不同的是該方法將組件 com添加到layerPane中指定層上的指定索引處. 比 如layeredPane.add(com, new Integer(1

40、0), 3);表示將組件添加到層面板編號(hào)為 10的那一層上,其位置在該層索引為 3的 地方.注意,這里使用的是索引值,而不是位置值,注意他們的區(qū)別.setLayer()方法:使用該方法應(yīng)注意的地方是,當(dāng)使用該方法時(shí)只是把組件設(shè)置在層面板中的哪一層中出現(xiàn),程序并沒 有把該組件添加到該層中,在使用setLayer方法后還應(yīng)使用 add方法把組件添加進(jìn)層面板的這一層中,而且 add方法應(yīng)出現(xiàn)在 setLayer方法之后.比方 layerPane.setLayer(component, 3); layerPane.add(component);該方法有2個(gè)變體,分別是:void setLayer(Co

41、mponent c, int layer);將組件c放在編號(hào)為layer的層上,并把它放置在該層的最底部.void setLayer(Component c, int layer, int position);將組件c放在編號(hào)為layer的層上,且把它放置在該層指定的位置值處(注意,這個(gè)方法的第3個(gè)參數(shù)是否不起作用,我在程序中試過好屢次)void setPosition(Component c, int position); 將組件c放置在當(dāng)前層的 position位置值(注意不是索引值)處,其中0表 示放置在該層的最頂層,數(shù)值 -1放置在最底層.對(duì)于其他數(shù)字,數(shù)字越 大那么放置在越后面.JL

42、ayeredPane 使用技巧:使用JLayeredPane類設(shè)置多層面板時(shí)應(yīng)先創(chuàng)立一個(gè)JLayeredPane類的對(duì)象,再使用setLayeredPane方法把該對(duì)象設(shè)為窗體的層面板,這時(shí)就可以使用該對(duì)象調(diào)用JLayeredPane類中的相應(yīng)方法,假設(shè)使用JFrame類中的getLayeredPane方法,那么不能使用 JLayeredPane類中的方法,由于 getLayeredPane方法反回的對(duì)象是 Component對(duì)象,該對(duì)象無(wú)法調(diào)用JLayeredPane類中的方法有了前面的知識(shí),那么下面我們就來看看JLayeredPane類中的具體內(nèi)容JLayeredPane類中的常量有(都為

43、static Integer類型):DEFAULT_LAYER 默認(rèn)層.該層是大多數(shù)組件位于的標(biāo)準(zhǔn)層,其值為 Integer(0)PALETTE_LAYERpalette調(diào)色板層.位于默認(rèn)層之上, 它們對(duì)于浮開工具欄和調(diào)色板很有用,其值為Integer(100)MODAL_LAYER該層用于模式對(duì)話框.它們將出現(xiàn)在容器中所有工具欄,調(diào)色板和標(biāo)準(zhǔn)組件之上,其值為Interger(200)POPUP_LAYER彈出層.組合框,工具提示和與幫助文本關(guān)聯(lián)的彈出式窗口將出現(xiàn)在組件,調(diào)色板或生生成他DRAG_LAYER們的對(duì)話框之上.其值為 Interger(300)拖動(dòng)一個(gè)組件時(shí),將該組件重分配到拖動(dòng)層

44、可保證將其定位在容器中的其他所有組件之上.完成拖動(dòng)后,可將該組件重分配到其正常層.其值為 Interger(400)FRAME_CONTENT_LAYER 內(nèi)容面板層,我們經(jīng)常使用的內(nèi)容面板層就位于該層上.其值為 Interger(-30000)static String LAYER_PROPERTY綁定屬性.JLayeredPane類有一個(gè)默認(rèn)的構(gòu)造方法JLayeredPane類中的方法有:Component getComponentsInLayer (int layer);int getComponentCountInLayer (int layer);int getIndexOf (Co

45、mponent c);int getLayer(Component c);static int getLayer(JComponent c);int highestLayer ();int lowestLayer();反回指定層中組件的數(shù)組反回指定層中組件的個(gè)數(shù)反回指定組件的索引值反回指定組件所在層的int值(即組件在第幾層) 反回指定的JComponent組件在第幾層.反回當(dāng)前層面板中所擁有的子層中最頂層的層的值.反回當(dāng)前層面板中所擁有的子層中最底層的層的值.boolean isOptimizedDrawingEnabled ();void moveToBack (Component c);

46、void moveToFront (Component c);void paint (Graphics g);static void putLayer(JComponent c, int layer);void remove(int index);void removeAll ();void setLayer(Component c, int layer);判斷組件是否可以重疊,假設(shè)可以那么反回false,否那么反回true將組件c移動(dòng)到當(dāng)前層中所有組件的最底層(位置-1處),只能改變位置值將組件c移動(dòng)到當(dāng)前層中所有組件的最頂層(位置0處),只能改變位置值繪制此 JLayeredPane該方法

47、與setLayer方法類似,只是不會(huì)產(chǎn)生一些副作用,比方重繪,而且只適用于JComponent組件.從此窗格中移除索引為index的組件從此容器中移除所有組件.將組件c放在編號(hào)為layer的層上,并把它放置在該層的最底部.void setLayer(Component c, int layer, int position);將組件c放在編號(hào)為layer的層上,且把它放置在該層指定的位置值處(注意,這個(gè)方法的第3個(gè)參數(shù)是否不起作用,我在程序中試過好屢次)void setPosition (Component c, int position);將組件c放置在當(dāng)前層的 position位置值(注意位

48、置值與索引值的區(qū)別)處,其中0表示放置在該層的最頂層,數(shù)值 -1放置在最底層.對(duì)于其他數(shù)字,數(shù)字越大那么放置在越后面.int getPosition (Component c);反回組件c所在層的位置值,注意位置值與索引值的區(qū)別.JLayeredPane層面板例如:在該例如中,我們可以看到位置值與索引值的區(qū)別,以及怎樣使用多個(gè)層.具體情況請(qǐng)自行運(yùn)行試驗(yàn).import java.awt.*;import java.awt.event.*;public class A public static JFrame f= new JFrame ();JLayeredPane p= new JLayere

49、dPane /Component p=f.getLayeredPane(); / 回的結(jié)果是Component類型的,該類型是import javax.swing.*;void main( String arg)();/要使用JLayeredPane類中的函數(shù),應(yīng)創(chuàng)立一個(gè) JLayeredPane 的對(duì)象或使用該方法那么無(wú)法使用JLayeredPane 類中的各種函數(shù),由于該方法反JLayeredPane的父類,父類不能使用子類中的方法,除非強(qiáng)制轉(zhuǎn)換.JButtonjb1=newJButton("kkk1");JButtonjb2=newJButton( "kkk

50、2");JButtonjb3=newJButton("kkk3");JButtonjb4=newJButton( "kkk4");JButtonjb5=newJButton("kkk5");JButtonjb6=newJButton( "kkk6");f.setLayeredPane(p);/將JLayeredPane對(duì)象p設(shè)置為窗口 f的層面板./布置按鈕jb1p.add(jb1, new Integer (111);/使用add方法把按鈕jb1添加到層面板的111層,層面板中的每一層其實(shí)就是一個(gè)容器,

51、因此可以直接向?qū)用姘逯刑砑咏M件.jb1.setSize(88,44);/由于層面板沒有布局治理器,所以應(yīng)對(duì)按鈕組件的大小和位置進(jìn)行設(shè)置,這里的位置使用的是默認(rèn)值左上角.假設(shè)不設(shè)置按鈕的大小,我們最后將看不到按鈕.int ps1=p.getPosition(jb1);System . out .println( "ps1=" +ps1);/這里輸出的是當(dāng)前的位置值,當(dāng)后面添加了新組件并設(shè)置了位置值時(shí),該值有可能會(huì)變化.jb1.setVisible(true );/布置按鈕jb2p.add(jb2, new Integer (111),0);/使用add方法把按鈕jb2添加到層面板的111層,并使其顯示在相同層的最頂層,注意這里的0是一個(gè)索引值,而不是位置值,注意索引值與位置值p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論