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. Xcode7 修改项目名完全攻略

    1.先把整个工程文件夹名改为新的工程名. 2 .将旧项目文件夹和Tests文件名夹修改为新的名称,修改后如下图所示 3.右击 ,选择“show content package”(中文:显示包内容),看 ...

  2. LG4360 [CEOI2004]锯木厂选址

    题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...

  3. 洛谷 P2920 [USACO08NOV]时间管理Time Management

    传送门 题目大意: 每个工作有截至时间和耗费时间,n个工作求最小开始时间. 题解: 贪心 从n-1安排,让结束时间尽量的晚. 注意:优先级 cout<<st<0?-1:st;  (X ...

  4. 如何给 FastAdmin 单独设置域名

    如何给 FastAdmin 单独设置域名 (声明:不建议给后台固定的域名,主要是安全问题) FastAdmin 是基于 ThinkPHP5 框架编写的,ThinkPHP 5 支持域名路由,可对模块单独 ...

  5. php 日期时间运算比较

    $sql= "select * from t_datestudy where id='4750' and agreemode='2' and school_agree !='1'" ...

  6. 在TreeView 控件上,如果双击任何一个节点的checkbox 只会收到一次After_Check事件 但是check属性变化两次(从false到true 再从true到false),请问该如何解决,谢谢!

    在TreeView 控件上,如果双击任何一个节点的checkbox 只会收到一次After_Check事件 但是check属性变化两次(从false到true 再从true到false),请问该如何解 ...

  7. Google Cloud VM上在线扩硬盘

    Google Cloud VM是可以在线扩展Disk的大小的. 一.创建VM和磁盘 比如我有一台VM,附加了一块Disk,大小是120GB.如下图: 在VM中进行格式化: mkfs.ext4 -F / ...

  8. debian修改主机名

    hostnamectl set-hostname aaa 或者 vim /etc/hostname 记得更新 /etc/hosts

  9. 接口规范,js处理json,php返回给ajax的数据格式

    ajax异步获取php数据. 一般php会在后台处理请求,并返回结果给前端. 必须是echo的方式,不然ajax获取不到. 返回的类型包括,字符串,数字,json. 最常用的就是json. 返回后,前 ...

  10. 事件调度器及C++中的使用

    转自:http://blog.ch-wind.com/ue4-event-dispatcher-and-delegate/ 事件调度器非常的适合在各个蓝图之间实现通信功能. 当前UE4版本4.8.3. ...