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. ACM学习历程—HDU5701 中位数计数(中位数 && 计数排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=5701 这是这次百度之星初赛2B的第六题.之前白山云做过类似的题,省赛完回来,我看了一下大概就有这样的思路:首先枚 ...

  2. linux下修改ip地址

    1.more  /etc/sysconfig/network-scripts/ifcfg-eth0 2.ifconfig eth0 192.168.1.211 netmask 255.255.255. ...

  3. mysql时间运算

    DELETE FROM zhongqiu WHERE caretatime<=ADDDATE(NOW(),-14) caretatime` timestamp NOT NULL DEFAULT ...

  4. ecmall在linux下的安装注意事项(转) ----ecmall系统迁移

    linux+apache+mysql+php,然后自己开始在linux下安装ecmall并做迁移,整理了一下中间碰到的问题.1.系统选择的环境是centos6.3,安装不做介绍. 2.安装 MySQL ...

  5. bzoj 3295 (洛谷3157、3193) [Cqoi2011]动态逆序对——树套树 / CDQ分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 题目--洛谷3157:https://www.luogu.org/problemnew ...

  6. java 随意控制控件的位置

    package chat1; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class chat1{ ...

  7. 转:oracle常见重要视图-v$sql,v$sql_plan,v$sqltext,v$sqlarea,v$sql_plan_statistcs

    v$sql V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cursor(子游标)存在,在V$SQLAREA为所有c ...

  8. 一种js异步处理方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 易酷cms本地包含漏洞拿shell

    测试版本:易酷cms2.5 包含一句话:http://localhost/ekucms2.5/?s=my/show/id/{~eval($_POST[x])} 会在网站的/temp/Logs/目录下生 ...

  10. Python Twisted系列教程4:由Twisted支持的诗歌客户端

    作者:dave@http://krondo.com/twisted-poetry/  译者:杨晓伟(采用意译) 你可以在这里从头开始阅读这个系列. 第一个twisted支持的诗歌服务器 尽管Twist ...