• swing中的分层


    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. }
  • 相关阅读:
    莫比乌斯反演套路一--令t=pd--BZOJ2820: YY的GCD
    BZOJ2720: [Violet 5]列队春游
    BZOJ2277: [Poi2011]Strongbox
    莫(meng)比(bi)乌斯反演--BZOJ2301: [HAOI2011]Problem b
    「CodePlus 2017 11 月赛」Yazid 的新生舞会
    「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
    用NumGo实现安卓动画
    人生
    用NumGo实现安卓动画
    html5使用canvas绘制n角星
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/9490856.html
Copyright © 2020-2023  润新知