Swing组件的各种面板JRootPane根面板.docx
- 文档编号:4614345
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:19
- 大小:73.87KB
Swing组件的各种面板JRootPane根面板.docx
《Swing组件的各种面板JRootPane根面板.docx》由会员分享,可在线阅读,更多相关《Swing组件的各种面板JRootPane根面板.docx(19页珍藏版)》请在冰豆网上搜索。
Swing组件的各种面板JRootPane根面板
主要参考文现:
[美]HerbertSchildt著鄢爱兰鹿江春译《java参考大全J2SE》清华大学出版社2006年1月
孙卫琴《Java面向对象编程》出版社及日期不详
javaAPI开发人员文档
本文作者:
黄邦勇帅
本文的说明:
本文主要讲解了对大学初学Swing时对根面板JRootPane,内容面板containPane,层面板JLayeredPane,玻璃面板glassPnae的困惑,本文对各种面板作了详尽的讨论,让读者能真正的明白根面板,内容面板,层面板到底是什么,他们在程序中的作用,以及他们之间的关系,透明性,可见性,作了讲解。
本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。
Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)
JFram框架窗口
根面板JRootPane根面板JRootPane层面板JLayeredPane菜单栏MenuBar玻璃面板glassPane内容面板containPaneglassPane玻璃面板层面板JLayeredPane各层面板都完全覆盖了注意:
窗口除标题栏和边条JFrame此图为了说明层的全部内容。
菜单栏内容面板MenuBarcontainPane次关系,而作了立体化处理
各面板之间的组织关系
框架窗口中各面板的层次结构JFrame
中各面板间的关系,透明性与可见性问题第一部分:
JFrame注:
在某些地方把面板也叫做窗格,比如根面板,也叫根窗格,层面板也叫分层窗格等。
注意窗格与窗体是不一样的。
根面板,JRootPaneJFrame由他的窗体本身加上其上的窗体与AWT中的Frame窗体有一些不同。
在Swing中的JFrame四部分组成。
)(可选,不包括在内glassPane玻璃面板,JMenuBar菜单栏JLayeredPane层面板,containPane内容面板,containPaneJComponent的子类。
而JRootPane类中实现,层面板在JLayeredPane类中实现,他们都是其中根面板在glassPane没有专门对应的类。
和)的关系及作用:
1、各种面板(或称窗格窗体创建时就默认添加进来的,是所有其他面板的载体或父级,他覆盖窗体的该面板是在JFrameJRootPane根面板:
,如使其他面层面板,玻璃面板)根面板默认是不可见的。
根面板负责管理其他面板(除标题栏和边条之外的整个表面。
窗体等。
板覆盖整个JFrame面板的上面,他再次覆盖窗体的整个表面,内容JRootPaneJLayeredPane层面板:
该面板是其他所有面板的父级,在剩下的部面板的顶部,当添加了菜单栏时,菜单栏被添加到JLayeredPane面板和JMenuBar菜单栏被添加到层面板上。
而内容面板就位于层面板中的某一层,层面板是分很多层的,每一层使用一个相应的数字来表示,分被内容面板填充。
层面板将负责管理各种内部窗体的叠放问在后面的内容中我们可以看到层面板可以让你设计出相互重叠的内部窗体,层面板的内容后面会作具体介绍。
题,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。
由层面板的介绍可知,内容面板是层面板中的某一层。
默认的内容面板是不透明的,而且是一内容面板:
containPaneAWT当我们向窗体添加组件时就应该添加到这一层上,而不能像对象。
该面板在窗体中起着工作区的作用,个JPane那样直接添加到窗体上,若你那样做了,实际上该组件也是被添加到内容面板上的,若窗体未设置内容面板,则组件或p.add(jr);p=jframe.getContentPane();Container确的方式为,则加比法无显示。
如要添按钮jb正类中的方法,该方法将反回内容面板的引用,这是访问是getContentPane()JFramejframe.getContentPane().add(jr);其中默认的内容面板的方法,因为默认的内容面板没有特定的名字,因此应使用该方法。
玻璃面板用于接收鼠的,最上面该面板总是存在的,而且他位于,默认情况下玻璃面板是不可见glassPane玻璃面板:
标事件和在其他组件上绘图。
、各面板中使用的布局管理器:
2。
BorderLayout在内容面板上使用的布局管理器默认是,他的作用是布局根面板之上的其他面板。
)布局管理器使用的布局管理器是一个自定义的在根面板上LayoutManager(方法为其设置合适的布局管理器或自已设定组件的大小和显示setLayout很明显如果你要向根面板中添加组件就应使用.
位置。
如果你改变了根面板自定义的LayoutManager那么你就应编写负责布局根面板之上的各种面板的程序,如果没有这样的程序,那么在根面板之上的各种面板就不能正常的布局,因此对于根面板的布局管理器一般不要随便更改。
玻璃面板的默认布局管理器是FlowLayout。
对于层面板而言,在将容器添加进层面板时,将在添加容器时指定把该容器添加进层面板的哪一层,因而某层的布局管理器由添加到该层的容器所决定,因此无需为层面板的某一层设置布局管理器,也就是说层面板没有布局管理器。
当把某一容器(比如Panel)设为某种面板(内容面板)时,则面板的布局与添加进来的容器的布局管理器相同,比如把Panel作为内容面板,则内容面板的布局管理器就是FlowLayout。
注意:
对于层面板的各层来说,只能把某种容器(比如Panel)设置为内容面板,不能把容器设置为层面板中的其他各层。
3、各面板的可见性和透明性问题
可见性使用setVisible方法来显示(在AWT时已见过不少),透明性使用setOpaque方法来设置。
setOpaque方法只有在javax.swing包中的组件才有,对于java.awt包中的组件是没有该方法的,因此要使用该方法有时需要使用强制类型转换
可见性与透明性的区别:
区别在于,当面板是不可见时,则该面板中包含的组件也会不可见。
若该面板是透明但可见的,则只是面板会透明(比如面板的背景色无法看到),但面板上的组件仍会显示。
根面板:
默认情况下,根面板是可见且不透明的。
内容面板:
默认情况下,内容面板是可见的且不透明的,因此我们创建的JFrame窗体,实际上看到的是内容面板中的内容。
玻璃面板:
默认的玻璃面板是透明的且不可见的,因此要显示默认的玻璃面板应设置setVisible和setOpaque两个方法,若你把某一容器(比如Panel)设为玻璃面板,那么这时的玻璃面板仍然是不可见的,但他不是透明的,这取决于容器(比如Panel)是否是透明的。
因此要把这种类型的玻璃面板显示出来只需设置setVisible方法就够了。
层面板:
不管是你自已创建的层面板还是默认的层面板都是透明的且可见的,层面板中的内容面板是个特例,要使层面板可显示应设置setOpaque方法。
层面板和内容面板可见性与透明性的关系:
内容面板默认在层面板的-30000层,若我们像层面板添加组件时应设置将该组件添加进层面板的哪一层,若不然就会出现一些问题,因此应使用add(Componentcom,Objectconstrainer)这个方法,在添加组件时使用add(com,newInteger(100));这样的形式,Integer对象是int装相后的结果,装相后把整数当作对象来看待,其实Integer对象就是一个整数。
内容面板和层面板及层面板之间的显示问题,因为只能把某种容器(比如Panel)设置为内容面板,不能把容器设置为层面板中的其他各层,我们也无法直接该问到层面板中的其他各层,因此层面板将只会有一种背景色(除内容面板外)且背景色使用JLayeredPane类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明也只能由JLayeredPane的对象来设置,不能设置层面板中各个层次的透明性。
因此在层面板的各层之间他们始终是彼此透明的,无法更改,而相对与其他面板层面板(比如根面板)可以透明也可以不透明(使用JLayeredPane对象来设定)。
而对于内容面板而言,由于内容面板是存在于层面板中的某一层,因此层面板中的其他层相对于内容面板也是透明的,无法更改。
但是在层面板的所有层中只有内容面板是不透明的,因此若我们既为内容面板设置了背景色也为层面板设置了背景色那么最后只会显示内容面板的背景色,除非让内容面板透明或不可见,这时才会显示出层面板的背景色。
当向层面板中添加的组件在内容面板之上(大于-30000)时,这些组件将与内容面板的组件同时显示(若不重叠的话,若重叠则显示层数数值更大的组件)。
若向层面板中添加的组件在内容面板之下(小于-3000层),那么内容面板将把层面板中的组件都遮挡住,因为内容面板是不透明的。
应注意的问题:
1、containPane是JLayeredPane中的某一层。
是我们的工作区间,组件都应该添加到该面板上。
而不能像AWT那样直接向Frame窗体添加组件。
2、可以创建JRootPane的对象,但无法把该对象设置为某一个窗体的根面板,因此一般情况下JFrame窗体的根面板是唯一的。
比如JRootPanejr=newJRootPane;但不能使用JFrame中的jframe.setRootPane(jr);方法把jr设置为该窗体的根面板,因为setRootPane方法是protected类型的,只能由继承自该类的子类的构造方法使用。
3、关于设置面板的问题:
对于JFrame窗口的根面板和层面板只能把JRootPane和JLayeredPane类型的对象设为根面板和层面板,而不能把Component或Container类型的组件设为根面板或层面板。
而对于玻璃面板则可以把Component类型的对象设为玻璃面板,对于内容面板可以把Container类型的对象设为内容面板。
这取决于JFrame类中的set***Pane(类型参数);方法中的”类型”是什么。
对根面板其类型为JRootPane,对内容面板类型为Container
4、关于内容面板:
除了默认的层面板附带有内容面板之外,你自已创建的层面板将不会拥有内容面板,这时你必须手动为层面板设置一个内容面板(比如把JPanel设为内容面板),因为层面板是不可见且透明的,因此我们现在看到的将是根面板的内容,若你为根面板设置了背景色,则将显示该背景色。
比如JLayeredPanejp=newJLayeredPane();
jframe.setLayeredPane(jp);这时若使用jframe.getContentPane().add(jb);语句,那么按钮jb将无法显示,因为该层面板中还没有内容面板存在,在添加组件之前应把某个容器设为内容面板,比如jframe.setContentPane(jpanel);这样程序就能正常运行了。
5、关于所有面板都设为不可见或透明时的问题:
若除根面板外把其他所有面板都设为不可见或透明,则若根面板设为透明,则会显示JFrame的面板,标题栏和边框。
若根面板设为不可见,则我们只能看到一个框架,即只有标题栏,边框,看不见JFrame的面板。
6、关于层面板的透明问题:
层面板都是透明的且不可见的,在层面板的各层之间他们始终是彼此透明的,无法更改,且背景色使用)除内容面板外(我们也无法直接访问到层面板中的其他各层,因此层面板将只会有一种背景色.
JLayeredPane类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明也只能由JLayeredPane的对象来设置,不能设置层面板中各个层次的透明性。
各层面板之间的可见性透明性及各种面板之间的关系示例:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassA{publicstaticvoidmain(Stringarg[])
{JFramef=newJFrame();JPaneljp1=newJPanel();
JButtonjb1=newJButton(玻璃面板默认FlowLayout布局);
JButtonjb2=newJButton(内容面板默认BorderLayout布局);
JButtonjb3=newJButton(在内容面板之下的层面板);
JButtonjb4=newJButton(根面板无默认布局);
JButtonjb5=newJButton(在内容面板之上的层面板);
JButtonjb6=newJButton(JFrame窗体);
//将JFrame所反回的面板都强制转换为JComponent类型,以便调用setOpaque方法。
JComponentp1=(JComponent)f.getGlassPane();
JComponentp2=(JComponent)f.getContentPane();
JComponentp3=(JComponent)f.getLayeredPane();
JComponentp4=(JComponent)f.getRootPane();
p1.setBackground(Color.red);
p2.setBackground(Color.yellow);
p3.setBackground(Color.blue);
p4.setBackground(Color.green);
p1.add(jb1);
p2.add(jb2,BorderLayout.SOUTH);
//为层面板p3添加两个按钮,且分别放置在内容面板之上和内容面板之下
p3.add(jb3,newInteger(-30001));//将按钮jb3,放置在内容面板之下
p3.add(jb5,newInteger(22));//将按钮jb5,放置在内容面板之上
jb5.setSize(200,22);jb5.setLocation(7,35);
jb3.setSize(200,22);jb3.setLocation(7,90);
//向根面板p4中添加一个按钮jb4
p4.add(jb4);
jb4.setSize(200,22);jb4.setLocation(7,60);
//f.add(jb6,BorderLayout.NORTH);//该方法实际上是把按钮jb5添加到了内容面板上,并未把jb5添加到窗体f上。
f.setLocation(222,222);
f.setSize(222,222);f.setVisible(true);
//循环显示各层面板
while(true){
//玻璃面板默认是不可见且透明的。
显示玻璃面板红色背景。
try{Thread.sleep(2000);}catch(InterruptedExceptione){}
p1.setVisible(true);
p1.setOpaque(true);
f.repaint();//应使用repaint方法重缓一次,要不然会出现组件上次显示的残影
//使玻璃面板透明,但是是可见的,这样的话就会显示内容面板和层次数目在内容面板之上的层面板的内容。
因为层面板自身层内之间是相互透明的,因此不会显示层面板的蓝色背景,相反内容面板是不透明的,因此会显示内容面板的背景颜色
try{Thread.sleep(2000);}catch(InterruptedExceptione){}
p1.setOpaque(false);
//p1.setVisible(false);//你也可以把该行的注释删除掉,以便观察可见性与透明性的区别。
f.repaint();
//使内容面板透明,因为前面已把玻璃面板设为透明,因此会显示全部的层面板的内容,包括层面板的蓝色背景
try{Thread.sleep(2000);}catch(InterruptedExceptione){}
p2.setOpaque(false);
//p2.setVisible(false);
p3.setOpaque(true);
f.repaint();
//使层面板透明,因为内容面板是层面板中的某一层,因此该设置同样会使内容面板透明,再加上之前已把玻璃面板设为透明,因此最后将会显示即不透明也是可见的根面板的内容及其绿色的背景色。
try{Thread.sleep(2000);}catch(InterruptedExceptione){}
p3.setOpaque(false);
//p3.setVisible(false);
f.repaint();
//使所有面板的可见性及透明性还原。
e){}catchThread.sleep(2000);}(InterruptedExceptiontry{);p1.setVisible(false);p2.setOpaque(true);truep3.setOpaque(f.repaint();}}}
程序结果按如下顺序循环显示1、最先显示
可以看到在内容面板之上的层中的组件被显示出来了,而在内容面板之下的层的
组件被内容面板挡住了,而且最后显示的是内容面板的黄色前景,并未显示层面
板的蓝色背景,因此对于层面板之间的各层是相互透明而可见的,层之间的透明比如根面之间的透明性是不能更改的,但可以更改层面板与其他面(
在层面板中层数大于内容面板的层上的按钮
内容面板的黄色背景
内容面板上的按钮组件,
------显示内容面板及层数在其上的层面板的内容在未设置可见性及透明性之前的初始效果
2、两秒之后
玻璃面板上的按钮
玻璃面板的红色背景
默认时玻璃面板是透明的且不可见的
但可以更改其可见性与透明性
显示玻璃面把玻璃面板设为可见且不透明时的效果------
3、再2秒之后
玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来因为层面板彼此之间的各层是透明的,因此该按钮仍被显示出来
显示内容面板背景色-----把玻璃面板设为透明时的效果
4、再2秒之后
玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来因为层面板彼此之间的各层是透明的,因此该按钮仍被显示出来层面板的蓝色背景
因此该层的按钮因为把内容面板设置为透明的,该层位于内容面板之下,就被显示出来了,而且层面板的背景色蓝色也显示出来了
把内容面板和玻璃面板都设为透明时的效果-----显示层面板背景色
2秒之后5、再
因此玻璃面板之上的按钮仍然被显示出来玻璃面板被设为透明但可见的,
根面板之上的按钮
根面板的绿色背景
----显示根面板背景把层面板和玻璃面板都设为透明时的效果
类部分:
JRootPane第2
该类只有一个默认的构造方法,JRootPane类的内容,对于根面板的内容,我们在前面已介绍过,这里我们来具体看一下JRootPane对象,那些你应该对在根面板之上的层面板,玻璃面板和菜单栏的布局负责但要注意,若你自已创建一个JRootPane类的内部类有:
该类自定义布局管理器负责层面板,玻璃面板和菜单栏的布局。
JRootPane.RootLayout:
类的常量有:
JRootPane)
或面板内容窗格(protectedContainercontentPane
的操作发生时被激活的按钮。
当面板成为焦点并有类似按下Enter键的特定于UIprotectedJButtondefaultButton
玻璃窗格,便于截取鼠标移动等操作protectedComponentglassPane管理菜单栏和内容窗格的分层窗格protectedJLayeredPanelayeredPane
菜单栏protectedJMenuBarmenuBar
属性使用的常量以下的常量为staticint类型,都是供windowDecorationStyleJColorChooser的装饰以便显示指示JRootPane应提供适合DialogCOLOR_CHOOSER_DIALOG
的装饰以便显示一条错误消息指示JRootPane应提供适合DialogERROR_DIALOG
JFileChooser的装饰以便显示指示JRootPane应提供适合DialogFILE_CHOOSER_DIALOG
JRootPane应提供适合Frame的装饰指示FRAME
JRootPane应提供适合Dialog的装饰以便显示一条报告消息指示INFORMATION_DIALOG
JRootPane不应提供任何类型的Window装饰指示NONE
应提供适合Dialog的装饰指示JRootPanePLAIN_DIALOG
应提供适合Dialog的装饰以便向用户显示一个问题指示JRootPaneQUESTION_DIALOG
应提供适合Dialog的装饰以便显示一条警告消息指示JRootPaneWARNING_DIALOG
JRootPane的方法有:
由构造方法调用以创建默认的内容面板。
注意该方法只能由构造方法调用。
protectedContainercreateConentPane();
由构造方法调用以创建默认的玻璃面板createGlassPane();protectedComponent
由构造方法调用以创建默认的层面板protectedJLayeredPanecreateLayeredPane();
由构造方法调用以创建默认的布局管理。
protectedLayoutManagercreateRootLayout();
设置内容窗格。
voidsetContentPane(Containerco);
设定此根窗格的玻璃窗格voidsetGlassPane(Componentg);
设置在分层窗格中使用的菜单栏voidsetJMenuBar(JMenuBarm);
设置供根窗格使用的分层窗格voidsetLayeredPane(JLayeredPanejl);
反回内容窗格。
ContainergetContentPane();
反回此根窗格的当前玻璃窗格ComponentgetGlassPane();
反回窗格层的菜单栏JMenuBargetJMenuBar();
反回根窗格使用的分层窗格JLayeredPanegetLayeredPane();
属性,它确定此JRootPane的当前默认按钮。
设置defaultButtonvoidsetDefaultButton(JButtonde);
d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Swing 组件 各种 面板 JRootPane