框架面板的知识对于初学者来说是非常重要的,它有利于让我们开发出丰富多彩的界面应用程序,如果不了解这方面的知识的话,在开发的过程可能会犯低级错误,下面分享一下这方面的知识,希望对你有所帮助:

主要参考文现:

[美]Herbert Schildt 著 鄢爱兰 鹿江春译 《java参考大全 J2SE》 清华大学出版社 2006年1月

孙卫琴 《Java面向对象编程》 出版社及日期不详

java API 开发人员文档

本文作者:黄邦勇帅

本文的说明:本文主要讲解了对大学初学Swing时对根面板JRootPane,内容面板containPane,层面板JLayeredPane,玻璃面板glassPnae的困惑,本文对各种面板作了详尽的讨论,让读者能真正的明白根面板,内容面板,层面板到底是什么,他们在程序中的作用,以及他们之间的关系,透明性,可见性,作了讲解。本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。

Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)

第一部分:JFrame中各面板间的关系,透明性与可见性问题

注:在某些地方把面板也叫做窗格,比如根面板,也叫根窗格,层面板也叫分层窗格等。注意窗格与窗体是不一样的。

在Swing中的JFrame窗体与AWT中的Frame窗体有一些不同。JFrame由他的窗体本身加上其上的JRootPane根面板,JLayeredPane层面板,containPane内容面板,glassPane玻璃面板,JMenuBar菜单栏(可选,不包括在内)四部分组成。其中根面板在JRootPane类中实现,层面板在JLayeredPane类中实现,他们都是JComponent的子类。而containPane和glassPane没有专门对应的类。

1、各种面板(或称窗格)的关系及作用:

JRootPane根面板:该面板是在JFrame窗体创建时就默认添加进来的,是所有其他面板的载体或父级,他覆盖窗体的除标题栏和边条之外的整个表面。根面板默认是不可见的。根面板负责管理其他面板(层面板,玻璃面板),如使其他面板覆盖整个JFrame窗体等。

JLayeredPane层面板:该面板是其他所有面板的父级,在JRootPane面板的上面,他再次覆盖窗体的整个表面,内容面板和JMenuBar菜单栏被添加到层面板上。当添加了菜单栏时,菜单栏被添加到JLayeredPane面板的顶部,剩下的部分被内容面板填充。层面板是分很多层的,每一层使用一个相应的数字来表示,而内容面板就位于层面板中的某一层,在后面的内容中我们可以看到层面板可以让你设计出相互重叠的内部窗体,层面板将负责管理各种内部窗体的叠放问题,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。层面板的内容后面会作具体介绍。

containPane内容面板:由层面板的介绍可知,内容面板是层面板中的某一层。默认的内容面板是不透明的,而且是一个JPane对象。该面板在窗体中起着工作区的作用,当我们向窗体添加组件时就应该添加到这一层上,而不能像AWT那样直接添加到窗体上,若你那样做了,实际上该组件也是被添加到内容面板上的,若窗体未设置内容面板,则组件无法显示。比如要添加按钮jb则正确的方式为,Container p=jframe.getContentPane(); p.add(jr); 或jframe.getContentPane().add(jr); 其中getContentPane()是JFrame类中的方法,该方法将反回内容面板的引用,这是访问默认的内容面板的方法,因为默认的内容面板没有特定的名字,因此应使用该方法。

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(Component com, Object constrainer)这个方法,在添加组件时使用add(com, new Integer(100));这样的形式,Integer对象是int装相后的结果,装相后把整数当作对象来看待,其实Integer对象就是一个整数。

内容面板和层面板及层面板之间的显示问题,因为只能把某种容器(比如Panel)设置为内容面板,不能把容器设置为层面板中的其他各层,我们也无法直接该问到层面板中的其他各层,因此层面板将只会有一种背景色(除内容面板外)且背景色使用JLayeredPane类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明也只能由JLayeredPane的对象来设置,不能设置层面板中各个层次的透明性。因此在层面板的各层之间他们始终是彼此透明的,无法更改,而相对与其他面板层面板(比如根面板)可以透明也可以不透明(使用JLayeredPane对象来设定)。而对于内容面板而言,由于内容面板是存在于层面板中的某一层,因此层面板中的其他层相对于内容面板也是透明的,无法更改。但是在层面板的所有层中只有内容面板是不透明的,因此若我们既为内容面板设置了背景色也为层面板设置了背景色那么最后只会显示内容面板的背景色,除非让内容面板透明或不可见,这时才会显示出层面板的背景色。当向层面板中添加的组件在内容面板之上(大于-30000)时,这些组件将与内容面板的组件同时显示(若不重叠的话,若重叠则显示层数数值更大的组件)。若向层面板中添加的组件在内容面板之下(小于-3000层),那么内容面板将把层面板中的组件都遮挡住,因为内容面板是不透明的。

应注意的问题:

1、内容面板是层面板中的某一层。是我们的工作区间,组件都应该添加到该面板上。而不能像AWT那样直接向Frame窗体添加组件。

2、可以创建根面板的对象,但无法把该对象设置为某一个窗体的根面板,因此一般情况下JFrame窗体的根面板是唯一的。比如JRootPane jr=new JRootPane; 但不能使用JFrame中的 jframe.setRootPane(jr);方法把jr设置为该窗体的根面板,因为setRootPane方法是protected类型的,只能由继承自该类的子类的构造方法使用。

3、关于设置面板的问题:对于JFrame窗口的根面板和层面板只能把JRootPane和JLayeredPane类型的对象设为根面板和层面板,而不能把Component或Container类型的组件设为根面板或层面板。而对于玻璃面板则可以把Component类型的对象设为玻璃面板,对于内容面板可以把Container类型的对象设为内容面板。这取决于JFrame类中的set***Pane(类型 参数);方法中的"类型"是什么。对根面板其类型为JRootPane,对内容面板类型为Container

4、关于内容面板:除了默认的层面板附带有内容面板之外,你自已创建的层面板将不会拥有内容面板,这时你必须手动为层面板设置一个内容面板(比如把JPanel设为内容面板),因为层面板是不可见且透明的,因此我们现在看到的将是根面板的内容,若你为根面板设置了背景色,则将显示该背景色。比如JLayeredPane jp=new JLayeredPane(); jframe.setLayeredPane(jp); 这时若使用jframe.getContentPane().add(jb); 语句,那么按钮jb将无法显示,因为该层面板中还没有内容面板存在,在添加组件之前应把某个容器设为内容面板,比如jframe.setContentPane(jpanel);这样程序就能正常运行了。

5、关于所有面板都设为不可见或透明时的问题:若除根面板外把其他所有面板都设为不可见或透明,则若根面板设为透明,则会显示JFrame的面板,标题栏和边框。若根面板设为不可见,则我们只能看到一个框架,即只有标题栏,边框,看不见JFrame的面板。

6、关于层面板的透明问题:层面板都是透明的且不可见的,在层面板的各层之间他们始终是彼此透明的,无法更改,我们也无法直接访问到层面板中的其他各层,因此层面板将只会有一种背景色(除内容面板外)且背景色使用JLayeredPane类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明也只能由JLayeredPane的对象来设置,不能设置层面板中各个层次的透明性。

java面板和框架_java 框架/面板相关推荐

  1. java开源服务框架_Java框架服务

    Java从诞生到现在,一路飙升,可以说红遍全球,红到发紫.随着Java的流行,促生了许多java框架:Spring.WebWork.Struts.HIbernate.JDiy.JFinal.Quart ...

  2. light java框架_Java框架之light-4j( 比Spring Boot快44倍,性能好 )

    Java框架之light-4j(比Spring Boot快44倍,性能好) light-java是内置了undertow服务器的REST微服务轻量Java框架,它比Spring Boot内嵌Tomca ...

  3. java自定义上下文对象_Java框架_Spring应用上下文对象加载配置

    我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的? Spring容器是IOC容器的一种,它通过Applicati ...

  4. java体系技术框架_java框架之Spring 核心框架体系结构

    很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spring依赖混乱,甚至下 ...

  5. java设置面板的大小_java – 设置面板的大小

    我有3个面板.一个是主面板,可容纳2个较小的面板. 对于主面板,我用过 setPreferredSize(new Dimension(350, 190)); 对于较小的左侧面板,我使用了 setPre ...

  6. java 翻译框架_java框架外文翻译

    [经典外文翻译]--java(译文+英文)--毕业论文设计_英语学习_外语学习_教育专区.Java Java I/O 系统 对编程语言的设计者来说,创建一套好的输入输出(I/O)...... J2EE ...

  7. java消息 框架_java 框架-消息队列ActiveMQ

    https://www.jianshu.com/p/ecdc6eab554c ActiveMQ从入门到精通(一) 22017.03.11 21:40:42字数 2650阅读 57286 这是关于消息中 ...

  8. java struts 拦截器_java框架篇---struts实现拦截器

    Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept ...

  9. Java面向对象笔记1|Frame框架和Panel面板

    Frame框架和Panel面板 1.Frame框架 在Java中,每个GUI应用程序必须至少有一个顶层窗口(即框架),在AWT中对应的框架类是Frame,它是Window的子类,用来创建带有标题.菜单 ...

最新文章

  1. Insufficient parameters supplied to the command
  2. Codeforces Gym 100523E E - Gophers SET
  3. Touch the AppCache manifest file
  4. 【51Nod - 1279】 扔盘子(思维)(on-p会超时)
  5. 浏览器tab标签显示网站标志图标
  6. mysql 闪回查询 sql_利用闪回查看Oracle表历史时刻数据
  7. java 反射基础_Java基础教程:反射基础
  8. swiper控件(回调函数)
  9. 三元组顺序表表示的稀疏矩阵加法_知识表示学习记录(1)
  10. pve万兆网卡驱动_WiFi 6扩展有什么选择?Killer AX1650X无线网卡深度测评
  11. 腾讯笔试题——java题总结无答案
  12. 去除黄褐斑的方法,姬净美怎么样
  13. 拉取并且mongo保存聚宽的期货分钟线数据
  14. 一个中科大差生,8 年程序员生涯感悟(强烈推荐)
  15. VB6 Treeview的添加节点子节点、Treeview打开、Treeview关闭
  16. Unity 摄像机切换镜头
  17. C++设计模式——策略模式(高屋建瓴)
  18. 1. 【Part3】 Contour Detection and Hierarchical Image Segmentation【轮廓检测图像分割】
  19. 2021年岳阳市一中高考成绩查询,岳阳2021高考最高分多少分,岳阳历年高考状元资料...
  20. google 浏览器钉钉日志异常

热门文章

  1. UML是什么?常用的几种图有哪些?
  2. 0.致远OA二次开发课程目录
  3. Java sleep 替换_Thread.Sleep在Java中的替代品
  4. xlwings : 从此可以 VBA 调用 Python 代码啦
  5. 女生学Java好找工作吗?学什么专业比较好?
  6. Chrome Dev Tools
  7. 千年服务器武功修改,千年私服如何添加武功
  8. QQ,Tim:Initialization failure:0x0000000C;360安全卫士:winsock初始化失败,另一种解决方法
  9. 设计一个方法,将一个字符串中每一个英文单词的首字母大写,返回一个新的字符串
  10. java中处理打折率_折扣计算策略--设计模式应用