swing中的分层

摘自:https://blog.csdn.net/levelmini/article/details/26692205

2014年05月23日 12:42:56
阅读数:1244

今天在练习swing相关的内容。突然想到,html中的CSS可以控制分层,windows中的纸牌也是按层显示的,java也肯定有了。看了半天API没找到控制层的方法,在网上倒是找到不少分层显示的例子,但是按照例子练习的时候结果总是不理想,总有各种小瑕疵,完全不知道是怎么回事。再次百度的时候发现了关于 swing 重叠组件 的层次(废话篇)这个日志,说的就是分层的东西。在这个日志里又找到另外一篇教程,++ Swing窗口与面板的使用 。 大概看了一下,虽然还没做实验,但想来这个结果应该是极好的。于是记下来。因为大部分都是别人的东西,所以虽然是我自己找来的资料,也只能放到“转载”里面了。

下面就是教程的原文。

====================================================================================================================================

4-1-1:JFrame的使用:  类层次结构图: java.lang.Object   --java.awt.Component       --java.awt.Container           --java.awt.Window
              --java.awt.Frame                   --javax.swing.JFrame 结构函数:    JFram()    JFrame(String title) 例子:JFrame1.java  

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. public class JFrame1 implements ActionListener{
  5. public JFrame1(){
  6. JFrame f=new JFrame("JFrameDemo");
  7. /*我们要在JFrame中加入其他组件必须取得Content Pane,然后再加入组件到此Content Pane中。
  8. *相对于AWT,若要在AWT中的Frmae加入某一个组件只要直接调用add()方法即可,不需要先取得
  9. *Content Pane再加入组件。Swing这样的做法似乎多了一道手续,却带来更强大、更有弹性的
  10. *功能,原因就在于Swing的JFrame具有层次(Layer)的概念,可以让你在JFrame中放入的组件不
  11. *会造成混乱。例如当一个JFrame有按钮(JButton)、菜单(JMenu)、快速菜单(Pop-up menu)、
  12. *工具栏(Toolbar)与工具栏符号提示(Tool tip)时,到底哪个组件应该摆在什么组件上面或
  13. *下面,JFrame都有办法处理。以后我们再讨论这个问题。
  14. */
  15. Container contentPane=f.getContentPane();
  16. JButton b=new JButton("Click me to get new Window");
  17. b.addActionListener(this);
  18. contentPane.add(b);
  19. f.pack();
  20. f.show();//使JFrame变成可看见的(Visible)
  21. f.addWindowListener(
  22. new WindowAdapter(){
  23. public void windowClosing(WindowEvent e){
  24. System.exit(0);
  25. }
  26. }
  27. );
  28. }
  29. public void actionPerformed(ActionEvent e){
  30. JFrame newf=new JFrame();//产生一个没有标题的JFrame
  31. newf.setSize(200,200);
  32. newf.show();
  33. }
  34. public static void main(String[] args){
  35. new JFrame1();
  36. }
  37. }
this.getLayeredPane().add(panel, new Integer(11), 1); 

中间的参数越大越浮于上层,第三个参数越小越浮于上层

4-1-2:Swing的容器结构与JLayeredPane的使用:类层次结构图:

java.lang.Object
  --java.awt.Compontent
      --java.awt.Container
          --javax.swing.JComponent
              --javax.swing.JLayeredPane
 我们可把Swing容器的结构看似如下图所示:
         |Grass Pane
         |
Root Pane|
         |            |Content Pane
         |Layered Pane|
                      |Menu Bar
    其中,Root Pane可以看成是虚拟的容器,包含着Grass Pane、Layered Pane、Content Pane与Menu Bar。Swing的容器包括JApplet,JFrame,JDialog,JWindow与JInternalFrame都是构造在此结构上,JApplet、JFrame、JDialog、JWindow都是heavyweight容器,只有JInternalFrame是lightweight容器。当我们要加入某个组件到Swing的容器中时,并不是直接加入到Root Pane,而是加入到RootPane下面的某一成员(Layered Pane或Content Pane)。
    Content Pane与Menu Bar只是Layered Pane的其中一层,我们称此层为Frame-Content Layer.若你想知道Frame-Content Layer在Layered Pane的层次是什么?你可以由JLayeredPane类中的Frame_Content_layer类常数取得。
    由此我们可以知道,Layered Pane基本上可拥有非常多的“层”(Layer),那么如何分辨哪一层是在哪一层的上面或下面呢?
    答案是Z_order.Z_order本身具有两个整数值,一个是代表层(Layer)的深度,另一个代表同层的相关位置(Position),当Z_order的Layer数值越小时,表示其位置就在越底层,当Z_order的Layer数值越大时,表示其位置就在越上层。在JLayeredPane类中,共定义了6个Z_order常数供用户参考,如下所示:
    DEFAULT_LAYER:Z_order的Layer数值为0,以整数对象Integer(0)来表示,一般我们加入的组件若没有标记是第几层,默认值就把组件放在此Default Layer中。
    PALETTE_LAYER:Z_order的Layer数值为100,以整数对象Integer(100)来表示,位于Default Layer之上,一般用于放置可移动的工具栏(Floatable Toolbar).
    MODAL_LAYER:Z_order的Layer数值为200,以整数对象Integer(200)来表示,位于PALETTE_LAYER之上,一般用于放置对话框(Dialog Box).
    POPUP_LAYER:Z_order的Layer数值为300,以整数对象Integer(300)来表示,位于MODAL_LAYER之上,一般用于快捷菜单(Poup Menu)与工具栏提示(Tool Tips)中.
    DRAG_LAYER:Z_order的Layer数值为400,以整数对象Integer(400)来表示,位于POPUP_LAYER之上,一般用于拖曳组件使其在不同区域上.
    FRAME_CONTENT_LAYER:Z_order的Layer数值为-30000,以整数对象Integer(-30000)来表示,一般来说,Frame Content Layer最底层的是Layer,用来表示Content Pane与Menu Bar的位置,大部份情况我们不会更改到这个数值。

    一般程序会提供良好的Z-order自动管理机制,当然java也不例外,因此大部份情况我们不会使用到Z-order,因为系统会自动帮我们管理得好好的。用户只需将所需的组件直接加入Content Pane即可,不需要知道它们之间的顺序关系。但如果今天您必须处理对象之间的层次关系时,例如Word中你可以把某个绘图对象下推至下一层,你就必须亲自处理Z-order的关系了。   下面我们来看如何利用JLayeredPane来控制对象的层次关系:   这个例子分别用7个JLabel对象层层相叠,每个JLabel对象都有不同的Z-order数值,形成7层相叠的效果!
JLayeredPane1.java:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. public class JLayeredPane1 extends JFrame{
  5. public JLayeredPane1(){
  6. super("JLayeredPane");
  7. /*由小到大定义组件深度数值,也就是Z-order layer的大小。
  8. */
  9. Integer[] layerConstants={
  10. JLayeredPane.DEFAULT_LAYER,JLayeredPane.PALETTE_LAYER,
  11. new Integer(101),JLayeredPane.MODAL_LAYER,new Integer(201),
  12. JLayeredPane.POPUP_LAYER,JLayeredPane.DRAG_LAYER
  13. };
  14. /*定义每个JLabel的颜色
  15. */
  16. Color[] colors={
  17. Color.red,Color.blue,Color.magenta,Color.cyan,Color.yellow,
  18. Color.green,Color.pink
  19. };
  20. Point position=new Point(10,10);
  21. JLabel[] label=new JLabel[7];
  22. JLayeredPane layeredPane=getLayeredPane();//取得窗口的Layered Pane
  23. for(int i=0;i<7;i++){
  24. label[i]=createLabel("第"+(i+1)+"层",colors[i],position);
  25. position.x=position.x+20;
  26. position.y=position.y+20;
  27. //将组件(JLabel)放入Layered Pane中并给予深度(Z-order layer)的数值。
  28. layeredPane.add(label[i],layerConstants[i]);
  29. }
  30. setSize(new Dimension(280,280));
  31. show();
  32. addWindowListener(
  33. new WindowAdapter(){
  34. public void windowClosing(WindowEvent e){
  35. System.exit(0);
  36. }
  37. }
  38. );
  39. }
  40. public JLabel createLabel(String content,Color color,Point position){
  41. JLabel label=new JLabel(content,JLabel.CENTER);
  42. label.setVerticalAlignment(JLabel.TOP);
  43. label.setBackground(color);
  44. label.setForeground(Color.black);
  45. label.setOpaque(true);
  46. label.setBounds(position.x,position.y,100,100);
  47. return label;
  48. }
  49. public static void main(String[] args){
  50. new JLayeredPane1();
  51. }
  52. }

从上面的例子可以看出,虽然“Button1”的层次比“按钮一”低,但它却显示在“按钮一”之上,原因"按钮一"是加在Content Pane中而不是加在LayeredPane上,因此显示时以Content Pane与加在Content Pane上的组件来做层次的比较。

    从面的例子可以看出,Z-order layer数值越小的组件在越底层,也就会被Z-order layer值较大的组件所覆盖。那如果两个组件都在同一层且相互重叠,怎么知道它们之间的层次关系呢?答案是利用Z-order的另外一个整数值:position。position数值的关系跟 Z-order的layer数值恰好相反,在同一层中的对象,若position数值越小者则在越上层,position数值越大者则在越下层。position的数值是从-1~n~1,n是指在同一层中组件的个数,数值-1代表最底层,意思跟n-1一样;数值0代表最上层。你可以使用JLayeredPane类提供的moveToBack()方法将组件推至position为-1(最底端)的位置,或是使用moveToFront()方法将组件推至position为0(最顶端)的位置。我们来看下面的范例:
JLayeredPane3.java

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. public class JLayeredPane3 extends JFrame{
  5. public JLayeredPane3(){
  6. super("JLayeredPane");
  7. JLabel label1=new JLabel("左Label",JLabel.CENTER);
  8. label1.setVerticalAlignment(JLabel.TOP);
  9. label1.setBackground(Color.red);
  10. label1.setForeground(Color.black);
  11. label1.setOpaque(true);
  12. label1.setBounds(20,20,150,150);
  13. JLabel label2=new JLabel("右sLabe2",JLabel.CENTER);
  14. label2.setVerticalAlignment(JLabel.TOP);
  15. label2.setBackground(Color.red);
  16. label2.setForeground(Color.black);
  17. label2.setOpaque(true);
  18. label2.setBounds(50,50,150,150);
  19. JLayeredPane layeredPane=getLayeredPane();
  20. layeredPane.add(label1,new Integer(10),1);
  21. layeredPane.add(label2,new Integer(10),0);
  22. setSize(new Dimension(280,280));
  23. show();
  24. addWindowListener(
  25. new WindowAdapter(){
  26. public void windowClosing(WindowEvent e){
  27. System.exit(0);
  28. }
  29. }
  30. );
  31. }
  32. public static void main(String[] args){
  33. new JLayeredPane3();
  34. }
  35. }

swing中的分层的更多相关文章

  1. Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力

    [摘要] 本文诣在展示如何在Swing中引入 NinePatch技术(早期有文章里中文译作九格图,暂且这么叫吧^_^,但此术非传统移动手机上的功能布局——九格图哦). [准备篇] Q:何为 NineP ...

  2. 【Swing】理解Swing中的事件与线程

    talk is cheap , show me the code. Swing中的事件 事件驱动 所有的GUI程序都是事件驱动的.Swing当然也是. GUI程序不同于Command Line程序,一 ...

  3. Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法

    在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...

  4. DDD中的分层架构

    DDD中的分层架构很好的应用了关注点分离原则Separation of Concerns(SOC),每一层做好自己的事情,减少交叉 表现层 表现层提供用来完成任务的用户界面,如webform wpf ...

  5. 详解Swing中JTree组件的功能

    JTree组件是另外一个复杂组件,它不像 JTable 那样难用,但是也不像 JList 那么容易.使用 JTree 时麻烦的部分是它要求的数据模型. JTree组件的功能来自树的概念,树有分支和叶子 ...

  6. 转:swing 中paint与paintComponent的区别(jcomponent)

    http://blog.csdn.net/q597756870/article/details/17854247 查API文档,查得在类Jcomponent下的paint方法有以下解释:        ...

  7. 【代码总结● Swing中的一些操作与设置】

    Swing中设置关闭窗口验证与添加背景图片 package com.swing.test; import java.awt.EventQueue; import java.awt.Image; imp ...

  8. .NET Core 2.1中的分层编译(预览)

    如果您是.NET性能的粉丝,最近有很多好消息,例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1,但我们还有更多的好消息.分层编译是一项重要的新特性功能,我们可以作为预览供任何 ...

  9. 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) [转载]

    本系列文章导航 深入浅出Java多线程(1)-方法 join 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concu ...

随机推荐

  1. verilog中task的用法

    任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要 ...

  2. Windows 7 中的 God Mode

    Windows 7系统中隐藏了一个秘密的“God Mode”,字面上译为“上帝模式”,但似乎叫它“万能模式”更贴切一些.God Mode其实就是一个简单的文件夹窗口,但包含了几乎所有Windows 7 ...

  3. yield关键字用法与解析(C# 参考)

    yield 关键字向编译器指示它所在的方法是迭代器块. 编译器生成一个类来实现迭代器块中表示的行为. 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返 ...

  4. 一步一步建立 webpack 4 项目

    一步一步建立 webpack 4 项目 cnpm init -y cnpm i webpack --save-dev cnpm i webpack-cli --save-dev 修改 package. ...

  5. log框架集成

    使用slf4j,slf4j相当于一个接口,我们面对接口编程,方便地集成其他的日志框架,我们按照slf4j的标准,日志就会相应地打入日志系统中(log4j 使用slf4j要有两个包1,他本身的api,2 ...

  6. 一个kafka异常

    卡夫卡经常超时,而且超时时间固定为三分钟,因为时间长度固定,所以逆推一下,发现现有的配置里面有个session的timeout是三分钟,但是其实后来验证发现真是的原因是connect timeout, ...

  7. PHP实现同服务器多个二级域名共享 SESSion

    现在很多分类信息网站都会分出很多个二级域名出来,比如:sh.ganji.com(上海赶集网), su.ganji.com(苏州赶集网)等等,像这种拥有多个二级域名的网站,该如何实现同步共享sessio ...

  8. Sqlite数据库中的事务

    public void testTrasaction() throws Exception{  PersonSQLiteOpenHelper helper = new PersonSQLiteOpen ...

  9. 如何删除xcode 中过期的描述性文件

    1.使用终端 首先 打开终端 cd ~/Library/MobileDevice/Provisioning\ Profiles/再删除所有 rm *.mobileprovision 2.直接找到文件夹 ...

  10. 让Eclipse的TomcatPlugin支持Tomcat 8.x

     使用tomcat插件启动项目的优势: 1.TomcatPlugin是一个免重启的开发插件,原始的Servers方式启动tomcat项目,修改xxx.ftl  或者 xxx.jsp 文件后需要重启to ...