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. VS 生成 dll、exe 版本号与SVN版本号一致

    1.VS 可自动生成版本号 注释掉以下两行代码 [assembly: AssemblyVersion("1.0.0.0")][assembly: AssemblyFileVersi ...

  2. c#同步調用異步(async)方法【記錄用】

    使用RestSharp中的異步方法ExecuteTaskAsync<T>編寫寫了一個異步方法,功能很簡單:異步調用API,返回結果,假設為GetAccessToken,方法簽名假設如下: ...

  3. Oracle变量的定义、赋值及使用

    首先我们来看看代码,然后我们在说明和解释代码: declare l_dept ; currtime date := sysdate; l_nam ) :),'yyyymmdd'); -- to_cha ...

  4. checkStype和findBugs校验

    IDEA可以直接在setting中下载checkStyle和findBugs <plugin> <groupId>org.codehaus.mojo</groupId&g ...

  5. bzoj 2119 股市的预测 —— 枚举关键点+后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 思路就是对于这个形如 ABA 的串,枚举 A 的长度,并按照长度分出几块,找到一些关键 ...

  6. apache通过.htaccess(rewrite)判断手机电脑跳转-手机用户重定向到手机版

    自动判断.重定向的办法也有几种: 使用网站构建的程序(例如PHP)来判断.重定向:使用服务器上的Web服务(例如Apache)来判断.重定向. 在Apache中设置重定向有两个办法: 在网站的http ...

  7. Centos7手工安装Kubernetes集群

    安装Kubernetes集群有多种方式,前面介绍了Kubeadm的方式,本文将介绍手工安装的方法. 安装环境有3台Azure上的VM: Hkube01:10.0.1.4 Hkube02:10.0.1. ...

  8. 数据科学:Pandas 和 Series 的 describe() 方法

    一.Pandas 和 Series 的 describe() 方法 1)功能 功能:对数据中每一列数进行统计分析:(以“列”为单位进行统计分析) 默认只先对“number”的列进行统计分析: 一列数据 ...

  9. Java-Maven-Runoob:Maven Web 应用

    ylbtech-Java-Maven-Runoob:Maven Web 应用 1.返回顶部 1. Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的 ...

  10. 科学计算工具Numpy简介

    Numpy(Numerical Python) Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库.用来存储和处理大型矩阵,比Python自身的嵌 ...